CPU Speed per CPUID auslesen



  • Hi,

    es wurde ja schon sehr viel darüber Philosphiert, wie man die CPU Geschwindigkeit auslesen kann. Allerdings immer durch ausmessen. Das ist aber doch gar nicht nötig. Denn die kann man ja auch abfragen, mit cpuid.

    Also hier erst einmal meine CPUID Funktion

    R3DAPI r3d::dword r3d::cpu::CPUID(const r3d::dword dwFunction, 
    								  r3d::dword& dwEAX,
    								  r3d::dword& dwEBX,
    								  r3d::dword& dwECX,
    								  r3d::dword& dwEDX)
    {
    #ifdef _LINUX
    	asm("cpuid": "=a" (out_eax), "=b" (out_ebx), "=c" (out_ecx), "=d" (out_edx) : "a" (function));
    	return true;
    #else
    	r3d::dword retval = true;
    	r3d::dword local_eax, local_ebx, local_ecx, local_edx;
    	_asm pushad;
    
    	__try
    	{
            _asm
    		{
    			xor edx, edx			// Clue the compiler that EDX is about to be used.
                mov eax, dwFunction		// set up CPUID to return processor version and features
    									//      0 = vendor string, 1 = version info, 2 = cache info
                cpuid					// code bytes = 0fh,  0a2h
                mov local_eax, eax		// features returned in eax
                mov local_ebx, ebx		// features returned in ebx
                mov local_ecx, ecx		// features returned in ecx
                mov local_edx, edx		// features returned in edx
    		}
        } 
    	__except(1)
    	{ 
    		retval = false; 
    	}
    
    	dwEAX = local_eax;
    	dwEBX = local_ebx;
    	dwECX = local_ecx;
    	dwEDX = local_edx;
    
    	_asm popad
    
    	return retval;
    #endif
    }
    

    Die Funktion funktioniert auch ganz wunderbar. Jetzt hab ich von einem Freund ein HTML Dokument bekommen und kenne daher nicht die URL, auf der die ganzen cpuid Level beschrieben sind.

    Da steht nun das in cpuid Level (oder auch Funktion) 0x80860001 das ECX-Register mit der Geschwindigkeit (Mhz) der CPU gefüttert wird. Bei meinem Freund klappt das auch wunderbar. Aber bei mir nicht.

    Der Aufruf sieht so aus:

    long GetCPUMhz()
    {
      long eax,ebx,ecx,edx;
      if(CPUID(0x80860001, eax, ebx, ecx, edx))
        return ecx;
      return 0;
    }
    

    Wenn wir schon dabei sind. Das selbe gilt auch beim auslesen der Logischn CPU's im System

    Level (Funktion) 0x00000001
    Register EBX
    Bit's 16 bis 23
    Auch das klappt bei meinem Freund und bei mir nicht.

    Wir haben beide einen AMD XP2000.



  • alle cpu's unterstützen das wohl nicht.
    aber sind ads nicht alles feste werte, ich meine die geschwindigkeit, und nicht die frequenz, mit der die cpu wirklich getaktet wird, also keine gemessenen werte?



  • Wenn keine CPU das unterstützen würde, würde es bei meinem Freund ja auch nicht klappen 😉

    Also die Taktung einer CPU ist afaik nicht überall gleich. Wenn doch hab ich alles total falsch verstanden. Aber die Hz-Zahl heist afaik n-Takte pro Sekunde, oder nicht?

    Wieviel Dinge die CPU pro Takt verarbeiten kann ist ebenfalls von der Architektur der CPU abhängig.

    Oder versteh ich deinen Beitrag falsch?



  • DragonMaster schrieb:

    Wenn keine CPU das unterstützen würde, würde es bei meinem Freund ja auch nicht klappen 😉

    Keine != Alle. Es mag ja sien dass einige CPUs das unterstützen nur hast du dann Programmcode der für die CPU-Erkennung Dinge fordert wie AMD-CPU XP Herstellung ab $bladatum ode rähnliches. Nicht wirklich portabel, mit etwas Pech verzagt das shcon an einem Intel-Prozessor 😉

    Also die Taktung einer CPU ist afaik nicht überall gleich. Wenn doch hab ich alles total falsch verstanden. Aber die Hz-Zahl heist afaik n-Takte pro Sekunde, oder nicht?

    Jap

    Wieviel Dinge die CPU pro Takt verarbeiten kann ist ebenfalls von der Architektur der CPU abhängig.

    Jein. Von der Architektur nicht unbedingt, eher von der Produtionsgüte. Ich denke mal worauf net hinauswollte ist dass der erhaltene Wert genauso gut ist wie der Aufdruck auf der CPU, stimmt nur wenn man ihn auch so betreibt. Über/Untertakten wird damit vermutlich nicht festgestellt



  • Keine != Alle

    Is scho recht. ABER ma wollen das auch im richtigen Kontext sehen: Keine == Alle+nicht 😉 Und so wurds geschrieben.

    alle cpu's unterstützen das wohl nicht.

    Es mag ja sien dass einige CPUs das unterstützen nur hast du dann Programmcode der für die CPU-Erkennung Dinge fordert wie AMD-CPU XP Herstellung ab $bladatum ode rähnliches. Nicht wirklich portabel, mit etwas Pech verzagt das shcon an einem Intel-Prozessor 😉
    ....
    Ich denke mal worauf net hinauswollte ist dass der erhaltene Wert genauso gut ist wie der Aufdruck auf der CPU, stimmt nur wenn man ihn auch so betreibt. Über/Untertakten wird damit vermutlich nicht festgestellt.

    Das ist ein gutes Argument die Mhz nicht auszulesen. Aber es gibt da eine kleine Unregelmäßigkeit. Und die ist, wir haben beide unseren Programm-Code geschrieben. Meiner Funktioniert nicht und seiner Funktioniert. Es wurden beide Codes auf beiden Rechner getestet.

    Ich wollte es nur auslesen, weil die Messung doch recht ungenau ist. Sie schwankt bei mir immer bei +- 10Mhz. Was wohl auf das Multithreading zu schieben ist. Denn bei 1 sec. kann man zu 50% davon ausgehen das der Thread unterbrochen wird.

    Aber das ist nur eine Nebensächlichkeit und wurde ja schon oft Diskutiert. Mir geht es vor allem darum das mein Code nicht funktioniert und der meines Freundes schon. Unsere Codes haben wir abgeglichen!



  • Das Level 0x80860001 ist AFAIK nur aud Transmeta Prozessoren verfügbar:
    http://sandpile.org/ia32/cpuid.htm (Fast ganz unten)


Log in to reply