Accueil > > > LECTURE FRÉQUENCE PROCESSEUR
LECTURE FRÉQUENCE PROCESSEUR
Information sur la source
Description
Cette source est l'un des points de départ que j'ai créé pour lire les informations bas niveau du processeur. La source a été testée et validé sur un certains nombres de processeur, au minimum je garanti sur Core 2 + Phenom. Ce projet étant assez vieux, je ne suis pas sur qu'elle soit compatible avec d'autres processeurs : en effet, j'utilise la table MSR pour lire le coefficient processeur, et ainsi détecter la fréquence réelle (pour rappel les processeurs sont apte à descendre leur coefficient pour consommer moins lorsqu'ils ne sont pas en fonctionnement intense. Ces informations sont stockés dans la MSR). Les informations dans la MSR peuvent varier d'une famille de processeur à une autre, il faut donc se renseigner au cas par cas suivant votre processeur. Si vous enlevez le coefficient MSR, normalement la lecture sera bonne pour tous les processeurs x86, mais vos n'aurez alors que la fréquence maximale théorique. Par ailleurs, vous n'aurez pas besoin de WinRing0 si vous enlevez MSR (mais alors vous n'aurez pas la vraie fréquence, seulement la maximale). Le système utilise rdtsc(http://fr.wikipedia.org/wiki/RDTSC) qui est un compteur interne du processeur (disponible en ASM), et WinRing0 qui est une DLL de descente en Ring0 pour windows (http://en.wikipedia.org/wiki/Ring_%28computer_sec urity%29), cette DLL n'est aujourd'hui plus trouvable sur le net (semble-t-il), j'en fournit donc une copie sous /Release.
Source
- //Instruction de lecture Assembleur bas niveau pour le compilateur GCC MinGW
-
- #define rdtsc(low,high) \
- asm volatile( \
- "xorl %%eax, %%eax\n\t" \
- "cpuid\n\t" \
- "rdtsc\n\t" \
- : "=a" (low), "=d" (high) \
- : \
- : "%ebx", "%ecx");
-
- //Lecture du compteur processeur :
-
- //Renvoi la fréquence du processeur
- double LireFrequenceCpu(int cpuNumber){
- LARGE_INTEGER freq1, freq2;
- double frequence;
- DWORD tick1, tick2;
-
- // Lit la frequence du chronomêtre Windows
-
-
- // Avant
- rdtsc(freq1.LowPart, freq1.HighPart);
- //On place le chrono à 1ms
- //timeBeginPeriod(1);
- //tick1 = GetTickCount();
- tick1 = timeGetTime();
-
- //Pause de 1s pour pouvoir lire la fréquence...
- for (int i=0; i<100; i++)
- Sleep(10);
-
- // Apres
- rdtsc(freq2.LowPart, freq2.HighPart);
- //tick2 = GetTickCount();
- tick2 = timeGetTime();
-
- //On replace le timer à sa position d'origine
- //timeEndPeriod(1);
-
- frequence = ((double)(freq2.QuadPart-freq1.QuadPart));
- frequence /= (double) ((tick2 - tick1));
- return (frequence*1000);
- }
-
-
- //Utilisation finale (avec MSR)
-
- cout << "Nombre de core : ";
- int nombreCore;
- cin>>nombreCore;
- DWORD eax, edx;
-
- timeBeginPeriod(1);
- LireFrequenceCpu(1); //La première lecture est toujours mauvaise...
- for(int i=0; i<nombreCore; i++)
- {
- cout << "Core " << i << " :";
- cout << endl << endl;
- SetThreadAffinityMask(GetCurrentThread(), 1 >> i);
-
- Rdmsr(0x198, &eax, &edx);
- int currentCoeff = ((eax>>8)&0xFF);
- int maxCoeff = ((edx>>8)&0xFF);
-
- cout << "Frequence lu : " << FormatFrequence(LireFrequenceCpu(1 >> i)) << " MHz" << endl;
- double frequence = FormatFrequence((LireFrequenceCpu(1 >> i)/maxCoeff)*currentCoeff);
- cout << "Frequence actuelle : " << frequence << " MHz" << endl;
- cout << "FSB : " << (frequence/currentCoeff) << " MHz" << endl << endl;
-
- cout << hex << "eax : " << eax << " edx : " << edx << dec << endl;
- cout << "Coefficient actuel : " << currentCoeff << endl;
- cout << "Coefficient max : " << maxCoeff << endl << endl << endl;
- }
- timeEndPeriod(1);
//Instruction de lecture Assembleur bas niveau pour le compilateur GCC MinGW
#define rdtsc(low,high) \
asm volatile( \
"xorl %%eax, %%eax\n\t" \
"cpuid\n\t" \
"rdtsc\n\t" \
: "=a" (low), "=d" (high) \
: \
: "%ebx", "%ecx");
//Lecture du compteur processeur :
//Renvoi la fréquence du processeur
double LireFrequenceCpu(int cpuNumber){
LARGE_INTEGER freq1, freq2;
double frequence;
DWORD tick1, tick2;
// Lit la frequence du chronomêtre Windows
// Avant
rdtsc(freq1.LowPart, freq1.HighPart);
//On place le chrono à 1ms
//timeBeginPeriod(1);
//tick1 = GetTickCount();
tick1 = timeGetTime();
//Pause de 1s pour pouvoir lire la fréquence...
for (int i=0; i<100; i++)
Sleep(10);
// Apres
rdtsc(freq2.LowPart, freq2.HighPart);
//tick2 = GetTickCount();
tick2 = timeGetTime();
//On replace le timer à sa position d'origine
//timeEndPeriod(1);
frequence = ((double)(freq2.QuadPart-freq1.QuadPart));
frequence /= (double) ((tick2 - tick1));
return (frequence*1000);
}
//Utilisation finale (avec MSR)
cout << "Nombre de core : ";
int nombreCore;
cin>>nombreCore;
DWORD eax, edx;
timeBeginPeriod(1);
LireFrequenceCpu(1); //La première lecture est toujours mauvaise...
for(int i=0; i<nombreCore; i++)
{
cout << "Core " << i << " :";
cout << endl << endl;
SetThreadAffinityMask(GetCurrentThread(), 1 >> i);
Rdmsr(0x198, &eax, &edx);
int currentCoeff = ((eax>>8)&0xFF);
int maxCoeff = ((edx>>8)&0xFF);
cout << "Frequence lu : " << FormatFrequence(LireFrequenceCpu(1 >> i)) << " MHz" << endl;
double frequence = FormatFrequence((LireFrequenceCpu(1 >> i)/maxCoeff)*currentCoeff);
cout << "Frequence actuelle : " << frequence << " MHz" << endl;
cout << "FSB : " << (frequence/currentCoeff) << " MHz" << endl << endl;
cout << hex << "eax : " << eax << " edx : " << edx << dec << endl;
cout << "Coefficient actuel : " << currentCoeff << endl;
cout << "Coefficient max : " << maxCoeff << endl << endl << endl;
}
timeEndPeriod(1);
Conclusion
La compilation se fait sous Windows, avec MinGw 32bits, test réalisés sous Windows XP à l'époque, et encore fonctionnelle sous Windows 7. Je met le code source (puisque ce n'est pas indiqué dedans) sous licence LGPL donc faites en ce que bon vous semble !
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
jouer un son à une fréquence donnée ? [ par skymath ]
bonjour,Est-il possible de jouer un son à une fréquence donnée (donnée par le programme ou l'utilisateur) sous C++ ou Visual C++ ?merci d'avance pour
Annonce: Processeur AMD 1400MHz à 50eur [ par greg4 ]
Cette Bonne affaire est a saisir sur http://www.devforum.fr.fm/ dans la rubrique DIVERS
recherche donnee system [ par cedkat ]
bonjourje cherche a trouver le nombre de processeur que l'ordinateurpossede, la taille memoire physique, la vitesse du processeuretcc...sous borland c
charge du processeur [ par cedkat ]
bonjour,je cherche à savoir la charge du processeur utilisé, voir des différents processeurs si il-y-en a plusieur.je suis sous borland c++ v6merci
problème de processeur avec SDL [ par Goliath49 ]
Bonjour,je suis entrain de développer un casse brique en C avec SDL.J'utilise DevCpp et suis sous XP.J'aimerais savoir qu'elles sont les possibiltés p
temps processeur d'un processus [ par lefouman ]
bonjour a tous je viens de commencer un stage en informatique et je dois faire un programme en C++ qui me permette de trouver le temps qu'un processeu
simulation du fonctionnement d'un processeur c++ [ par cafou ]
svp aidez moi je doit realise ce projet et j'ai pas trouve comment le commence le voici:"on desire concevoir par l'approche objet une application pour
Sondes processeur/carte mère [ par Tibabou ]
Bonjour/soir,La question a déjà été posée mais la réponse n'a pas encore été donnée, donc je relance le s
Win32_Processor [ par Suisse00 ]
Salut!Voila j'essai de récuprer des information sur le processeur et j'ai vue qu'il y avais une class Win32_Processor, la seul chose que je conna
recuperation de la frequence du processeur [ par gege1024 ]
je dois recuperer des infos sur une machine .j'utilise : MEMORYSTATUS pour avoir l'etat de la memoire &
|
Derniers Blogs
INTéGRATION YAMMER ET SHAREPOINT ONLINE (OFFICE 365), éTAPE 1 .INTéGRATION YAMMER ET SHAREPOINT ONLINE (OFFICE 365), éTAPE 1 . par Patrick Guimonet
#Yammer Certains s'en sont déjà fait l'écho (ici en allemand par exemple : Yammer Integration in Office 365 Phase 1) ou bien sûr sur le blog SharePoint : Make Yammer your default social network in Office 365 en anglais. Mais c'e...
Cliquez pour lire la suite de l'article par Patrick Guimonet [DYNAMICS CRM] AJOUTER LES DOSSIERS DE CRM AU DOSSIER FAVORIS D'OUTLOOK[DYNAMICS CRM] AJOUTER LES DOSSIERS DE CRM AU DOSSIER FAVORIS D'OUTLOOK par bianca
Objectif
Pour aller plus rapidement dans les menus de Dynamics CRM depuis votre client CRM pour Outlook, vous pouvez utiliser le dossier des Favoris d'Outlook. En effet, par simple glisser/déplacer, vous pouvez déposer un éléme...
Cliquez pour lire la suite de l'article par bianca VISUAL STUDIO 2013VISUAL STUDIO 2013 par Etienne Margraff
Ahh, ENFIN ! c'est officiel, il va y avoir un VS et un TFS 2013. De nouvelles fonctionnalités qui vont à mon sens assoir la maturité de TFS qui est maintenant l'outil incontournable pour tout projet (.NET, mais pas seulement !). Si vous n'avez pas jet...
Cliquez pour lire la suite de l'article par Etienne Margraff CONFIGURER LA COLLATION SQL SERVER POUR SHAREPOINT CONFIGURER LA COLLATION SQL SERVER POUR SHAREPOINT par JeremyJeanson
Note : Je poste cet article à titre de pense-bête. Cela fait des années que je me trimballe avec une capture d'écran, car je ne me rappel jamais comment choisir la collation d'un SQL Server pour SharePoint. Pour SharePoint, il est conseillé de choisir la ...
Cliquez pour lire la suite de l'article par JeremyJeanson ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 1: CRéATION DU PLUGINETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 1: CRéATION DU PLUGIN par Philess
Dans cet article nous allons créer un plugin installable sur le Team Web Access qui s'intègrera dans l'architecture du site et se chargera au moment où on le décidera.
Avant de lire ce billet et si cela n'est pas encore fait j...
Cliquez pour lire la suite de l'article par Philess
Logiciels
Nego Facturation (1.85)NEGO FACTURATION (1.85)Nego Facturation est un logiciel complet qui permet de gérer vos factures et devis très simplemen... Cliquez pour télécharger Nego Facturation Devis-Factures PHMSD (2.2.0.1)DEVIS-FACTURES PHMSD (2.2.0.1)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD WDmemoCode (2.0.0.1)WDMEMOCODE (2.0.0.1)WDmemoCode a été conçu pour aider les développeurs Windev à créer/compléter et conserver une base... Cliquez pour télécharger WDmemoCode ProtoMedic (4.0.0.11)PROTOMEDIC (4.0.0.11)ProtoMedic est un logiciel destiné principalement aux médecins généralistes.
ProtoMedic permet d... Cliquez pour télécharger ProtoMedic MyCurriculum 2011 (7.4.1.12)MYCURRICULUM 2011 (7.4.1.12)Rédigez votre Curriculum Vitae mais également ceux de votre famille ou de vos amis très facilemen... Cliquez pour télécharger MyCurriculum 2011
|