begin process at 2013 06 19 20:03:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > LECTURE FRÉQUENCE PROCESSEUR

LECTURE FRÉQUENCE PROCESSEUR


 Information sur la source

Note :
Aucune note
Catégorie :Système Classé sous :processeur, fréquence, rdtsc, msr, fsb Niveau :Expert Date de création :10/03/2012 Vu / téléchargé :2 515 / 128

Auteur : Devils_Tiger

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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 !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   GetProcesseurFrequency
    •   Release
      • main.oTélécharger ce fichier [Réservé aux membres club]11 709 octets
      • WinRing0.dllTélécharger ce fichier [Réservé aux membres club]72 896 octets
      • WinRing0.sysTélécharger ce fichier [Réservé aux membres club]14 416 octets
      • WinRing0.vxdTélécharger ce fichier [Réservé aux membres club]8 620 octets
      • WinRing0x64.dllTélécharger ce fichier [Réservé aux membres club]69 312 octets
      • WinRing0x64.sysTélécharger ce fichier [Réservé aux membres club]14 544 octets
    • GetProcesseurFrequency.mspTélécharger ce fichier [Réservé aux membres club]1 563 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 092 octets
    • OlsApiInit.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier9 681 octets
    • OlsApiInitDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 643 octets
    • OlsApiInitExt.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 732 octets
    • OlsDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 337 octets
    • WinRing0.dllTélécharger ce fichier [Réservé aux membres club]72 896 octets
    • WinRing0.sysTélécharger ce fichier [Réservé aux membres club]14 416 octets
    • WinRing0.vxdTélécharger ce fichier [Réservé aux membres club]8 620 octets
    • WinRing0x64.dllTélécharger ce fichier [Réservé aux membres club]69 312 octets
    • WinRing0x64.sysTélécharger ce fichier [Réservé aux membres club]14 544 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID)
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR

 Sources de la même categorie

Source avec Zip Source avec une capture OBTENIR DANS UN FICHIER LE CONTENU D'UN DOSSIER WINDOWS par pgl10
Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip LECTURE/ECRITURE DES MSR (MODEL SPECIFIC REGISTER) EN C SOUS... par MetalDwarf

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


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&#233;j&#224; &#233;t&#233; pos&#233;e mais la r&#233;ponse n'a pas encore &#233;t&#233; donn&#233;e, donc je relance le s Win32_Processor [ par Suisse00 ] Salut!Voila j'essai de r&#233;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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&


Nos sponsors


Sondage...

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,264 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales