[C#] Fréquence réelle CPU, Température et Ventilateur

Fréquence réelle CPU, Température et Ventilateur [C#] - C#/.NET managed - Programmation

Marsh Posté le 07-04-2014 à 09:59:02    

Bonjour bonjour,  
 
Tout d'abord, merci de bien vouloir me prêter de votre temps pour lire, et éventuellement m'aider à mon problème.
Après quelques recherches sur le forum, et de nombreuses sur google, je me suis résolu à poster ici car je n'ai pas réussit à trouver de réponse...
 
Je vous expose la chose :  
Je suis actuellement en train de programmer un arduino pour qu'il m'affiche certaines infos matérielles (fréquence CPU, températures etc...)
Pour ce faire, j'utilise C#
 
Mon problème actuel est que je n'arrive pas à récupérer la VRAIE valeur de ma fréquence CPU.
Avec les objets management, WMI etc... je ne récupère pas la bonne valeur :  
Mon processeur de PC portable est un i7-740QM de 1.7GHz (1733MHz)
Ainsi, lorsque j'exécute mes programmes, ça m'affiche bien 1734MHz. Sauf que ! La fréquence réelle de mon processeur est de 2400 à 2900 MHz ! (TurboBoost + Overclock, valeur donnée par CPU-Z et Everest).
 
J'ai essayé avec mon PC fixe, un i7-3770k à 3500MHz. Ça m'affiche 3500 MHz. Alors que j'ai overclocké ce dernier à 4.3Ghz...
 
J'ai donc cherché des méthodes de calcul de fréquence en C# (pas de récupération de valeur dans des registres etc...), en vain...
 
Pouvez vous m'aider svp ?
 
J'en profite aussi pour vous demander si vous saviez pourquoi quand j'essaye de récupérer les valeurs dans Win32_Fan et Win32_TemperatureProbe, je n'obtiens absolument rien ? (que des NULL)
 
Merci d'avance !


Message édité par Kaidaten le 07-04-2014 à 11:37:42
Reply

Marsh Posté le 07-04-2014 à 09:59:02   

Reply

Marsh Posté le 08-04-2014 à 12:15:42    

Voila trois codes qui te seront utiles que j'ai fait il y a fort longtemps:
 
http://codes-sources.commentcamarc [...] seur-cpuid
http://codes-sources.commentcamarc [...] processeur
http://codes-sources.commentcamarc [...] processeur
 
 
Globalement
déjà c# n'est certainement pas bien adapté. Ensuite les WMI sont inappropriés car ils font la lecture des informations 'statiques' uniquement, hors, celle du CPU est dynamique.
Enfin, WMI c'est (de souvenir) du windows only, donc pas sur que ca se passe bien avec arduino puisqu'ils font en priorité le support amd/intel (logique).
 
Principe
pour la lecture CPU, il n'y a pas 36 choix, il faut passer par assembleur, il te faut donc tapper dans les cpuid bas niveau, et plus précisément rdtsc. D'ailleurs, rdtsc est réputé non fiable, CPU-Z utilise un autre indicateur (je ne sais plus lequel), mais je n'ai jamais réussit à lire cet indicateur... (et apparemment seul le mec de CPU-Z a réussit), la particularité de ce deuxième timer est d'être infiniment plus précis comparé à rdtsc, et il ne souffre pas d'erreur comme rdtsc.
 
Mais rdtsc, c'est ce que la plupart utilisent, et franchement ce sera suffisant ;).
 
Ensuite, les timers (que ce soit rdtsc ou l'autre), aujourd'hui ne donnent plus la bonne valeur, uniquement la valeur du démarrage (comme wmi), c'est du au fait que le timer est devenu invariant sur demande de Microsoft semble-t-il. Il faut donc ajouter un complément: la lecture du coeff du processeur. Avec ces deux infos, tu auras la valeur réelle à 20MHz près environ, du CPU.
 
Pour ce qui est des t°. C'est encore pire, chaque processeur implémente son propre algo, pour les intels et les AMD ca se passe dans un registre appelé MSR. A la position 0x19c. Suivant l'architecture, tu n’interpréteras pas cette valeur de la même façon. Ce MSR s'appelle le Tj. C'est le delta entre 100° et la valeur du processeur.
Par exemple, un Tj de 40 indique que le processeur est à 60° actuellement.
Mais là ou ca devient compliqué: certains processeurs définissent le Tj à 75°, donc il faut savoir quel processeur est à quel Tj.
Pour rajouter un peu de piment, les MSR ne sont pas lisibles en ring3 ( http://fr.wikipedia.org/wiki/Anneau_de_protection ) mais uniquement en ring0, que ce soit sur linux ou windows (qui sont en ring3) il faut donc commencer par passer en ring0 (sous windows, j'utilisais l'excellent WinRing0.dll).
La deuxième solution (celle de CPU-Z par exemple), est d'utiliser un driver, puisque la particularité d'un driver est d'outrepasser le ring officiel de l'OS.
 
 
 
 
 
 
 
Voila j'espère avoir répondu à tes attentes, pour faire simple: a moins que ce soit crucial, ou que les codes fournis marchent déjà avec arduino, t'emmerde pas beaucoup avec ca c'est un domaine hautement complexe dans lequel il ne faut pas hésiter à lire des centaines de pages de docs technique d'intels & co, puisque ce n'est que là que tu trouveras l'infos nécessaire pour implémenter les algos.

Reply

Marsh Posté le 08-04-2014 à 12:44:44    

Merci beaucoup pour cette réponse très complète !
 
Je vais essayer d'approfondir selon vos lignes. Je ne veux pas abandonner déjà, je ne fais pas ça simplement pour afficher ce que je recherche, c'est surtout pour la partie apprentissage.
 
Donc, selon vous, il vaudrait mieux passer par du C++ ? J'étais passé en C# parce qu'il me semblait que, vu que jusqu'ici j'utilisais WMI, c'était plus simple avec visual studio et la liaison avec l'arduino.
Et c'est vrai que le C# semble assez restreint ...
 
Merci pour les codes, je vais les étudier de ce pas !


Message édité par Kaidaten le 08-04-2014 à 12:45:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed