Ga naar inhoud

[C++/Assembly] Detecteren FSB en/of Bus Speed


Aanbevolen berichten

CPU speed meten is vrij simpel. Als je tenminste iets af weet van processoren. Elke instructie (in ASM) kost een bepaalt aantal 'processor-klikken'. Door middel van de teller van het aantal klikjes en de frequentie van die klikjes op te vragen kan je de CPU speed berekenen. De code: [code:1:cc1b09eaaf] // cycle counter inline __int64 GetCycleNumber() { __asm { RDTSC } } (...) // detect CPU speed LARGE_INTEGER t1, t2, tf; __int64 c1, c2; QueryPerformanceFrequency (&tf); QueryPerformanceCounter (&t1); c1 = GetCycleNumber (); _asm { MOV EBX, 5000000 WaitAlittle: DEC EBX JNZ WaitAlittle } QueryPerformanceCounter (&t2); c2 = GetCycleNumber (); double cpuspeed = (double) ((c2 - c1) * tf.QuadPart / (t2.QuadPart - t1.QuadPart) / 1000000);[/code:1:cc1b09eaaf] Ondertussen ben ik ook al zover dat ik van de CPU kan vragen hoe 'ie heet, door wie 'ie is gemaakt, en hoeveel L1 en L2 cache 'ie heeft.
Link naar reactie
[quote:4ad4277878="phaas"]Vet ;-) Ik kan je helaas niet verder helpen.... ben geen ASM programmeur (wel C++) Maar zou je mij misschien willen vertellen hoe je dat gedaan hebt?[/quote:4ad4277878] Pentium-only code door RDTSC opcode... [code:1:4ad4277878] function GetCPUSpeed: Double; const DelayTime = 500; var TimerHi : DWORD; TimerLo : DWORD; PriorityClass : Integer; Priority : Integer; begin PriorityClass := GetPriorityClass(GetCurrentProcess); Priority := GetThreadPriority(GetCurrentThread); SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); Sleep(10); asm DW 310Fh // rdtsc MOV TimerLo, EAX MOV TimerHi, EDX end; Sleep(DelayTime); asm DW 310Fh // rdtsc SUB EAX, TimerLo SBB EDX, TimerHi MOV TimerLo, EAX MOV TimerHi, EDX end; SetThreadPriority(GetCurrentThread, Priority); SetPriorityClass(GetCurrentProcess, PriorityClass); Result := TimerLo / (1000.0 * DelayTime); end; // Usage ... LabelCPUSpeed.Caption := Format('CPU speed: %f MHz', [GetCPUSpeed]); [/code:1:4ad4277878]
Link naar reactie
// h4xX0r Die methode is eigenlijk niet goed, omdat je gebruik maakt van threads, en aangezien Windows met threads nogal eens allerlei onnodige rotzooi uitvoert, die ook processor-klikken kosten, kan je soms rare resultaten (zelfs op een Pentium, met name de oudere) krijgen. Daarnaast is deze methode, zoals je zelf al aangeeft, Intel-only. Het doet z'n werk wel goed op de nieuwere Pentiums (al kost het een stuk meer processorkracht, niet merkbaar maar 't gebeurt wel), maar is dus niet efficient en globaal genoeg (en dat is wat programmeren óók om draait: iets zo snel en efficient mogelijk oplossen ;) ). Een totaal-oplossing is altijd beter dan een heleboel deel-oplossingen. Mijn methode is voor alle processoren, van alle types en alle merken, geschikt. Daarnaast kan deze methode ook in andere besturingssystemen dan Windows (bijv. Linux of BeOS) gebruikt worden. Handig voor OS-independent applications. // phaas QueryPerformanceCounter en QueryPerformanceFrequency zijn standaard API's die gebruikt kunnen worden om de frequentie en teller van de Performance teller uit te lezen. Zie de MSDN-library voor meer info (ook beschikbaar online: [url=http://msdn.microsoft.com/library]http://msdn.microsoft.com/library[/url]).
Link naar reactie
[quote:fb9f0c0956="Ben Lankamp"]// h4xX0r Die methode is eigenlijk niet goed, omdat je gebruik maakt van threads, en aangezien Windows met threads nogal eens allerlei onnodige rotzooi uitvoert, die ook processor-klikken kosten, kan je soms rare resultaten (zelfs op een Pentium, met name de oudere) krijgen. Daarnaast is deze methode, zoals je zelf al aangeeft, Intel-only. Het doet z'n werk wel goed op de nieuwere Pentiums (al kost het een stuk meer processorkracht, niet merkbaar maar 't gebeurt wel), maar is dus niet efficient en globaal genoeg (en dat is wat programmeren óók om draait: iets zo snel en efficient mogelijk oplossen ;) ). Een totaal-oplossing is altijd beter dan een heleboel deel-oplossingen. Mijn methode is voor alle processoren, van alle types en alle merken, geschikt. Daarnaast kan deze methode ook in andere besturingssystemen dan Windows (bijv. Linux of BeOS) gebruikt worden. Handig voor OS-independent applications. [/quote:fb9f0c0956] Wat een crap :lol: Het RDTSC commando [b:fb9f0c0956](die jij ook gebruikt)[/b:fb9f0c0956] is beschikbaar sinds de Pentium generatie processoren. Je zult daarom ook zien dat deze dan ook faalt op bijvoorbeeld een 80386/80486 type processor. Daarnaast werken we tegenwoordig met 'multitasking' operating systemen. Waarbij het OS zorgt voor het schedulen van de verschillende threads, waar je niet onderuit komt. Om een context-switch zo veel mogelijk te vermijden en dus het verlies van cpu cycles bij het klokken van de cpu speed wordt de thread prioriteit tijdelijk verhoogd. In de eerder vermelde code wordt dit niet afgevangen. Daarnaast zijn de QueryPerformance... API's Windows only, dus hoe je op 'OS-independent' komt is mij een raadsel. [quote:fb9f0c0956="Ben Lankamp"] // phaas QueryPerformanceCounter en QueryPerformanceFrequency zijn standaard API's die gebruikt kunnen worden om de frequentie en teller van de Performance teller uit te lezen. Zie de MSN-library voor meer info (ook beschikbaar online: [url=http://msdn.microsoft.com/library]http://msdn.microsoft.com/library[/url]).[/quote:fb9f0c0956] Waar denk je dat dit een wrapper van is? Als je dan toch deze API's gebruikt, kun je net zo goed meteen de processor snelheid uit het systeem uitlezen (ergens in de registry ofzo of m.b.v. WMI). Want Windows heeft dit al voor je opgezocht. [size=9:fb9f0c0956]-- edit: typo's --[/size:fb9f0c0956]
Link naar reactie
[quote:b4af6d09d6]Je zult daarom ook zien dat deze dan ook faalt op bijvoorbeeld een 80386/80486 type processor.[/quote:b4af6d09d6] Vind het dan knap dat 'ie op mijn oude 486 (33mhz) netjes 33,1mhz aangeeft, in MS-DOS 5.1 nog wel. Uitleg hoe dit kan??? [quote:b4af6d09d6]Daarnaast zijn de QueryPerformance... API's Windows only, dus hoe je op 'OS-independent' komt is mij een raadsel.[/quote:b4af6d09d6]Deze functies heb ik ook succesvol kunnen gebruiken in SuSe Linux 7.0 en RedHat 8.0... als dit officieel dus niet kan vind ik het knap. Uitleg??? [quote:b4af6d09d6]Als je dan toch deze API's gebruikt, kun je net zo goed meteen de processor snelheid uit het systeem uitlezen (ergens in de registry ofzo of m.b.v. WMI). Want Windows heeft dit al voor je opgezocht.[/quote:b4af6d09d6]Klopt wel, maar dit is alleen in Windows 2000, XP en 2003 zo. Dus niet in 95/98/Me. [quote:b4af6d09d6]Waarbij het OS zorgt voor het schedulen van de verschillende threads, waar je niet onderuit komt.[/quote:b4af6d09d6]In o.a. Windows en Linux idd. kom je er niet onderuit, klopt, maar in DOS uiteraard wel. Dat had ik eigenlijk erbij moeten zetten. Twee uitleggen gevraagd dus, want wat je zegt is helemaal correct, dat wel. [b:b4af6d09d6]Daarnaast (edit)[/b:b4af6d09d6] zou ik ook eigenlijk nog wel antwoord willen hebben op mijn oorspronkelijke vraag, want daar gaat dit topic eigenlijk over :) .
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...