anoniem Geplaatst: 24 juli 2003 Delen Geplaatst: 24 juli 2003 Weet iemand hoe ik de FSB en/of bus speed kan meten via C++/assembly? Ik kan al wel de total cpu-speed meten (bijv. 3076mhz), maar nog niet de FSB. Quote Link naar reactie
anoniem Geplaatst: 27 juli 2003 Auteur Delen Geplaatst: 27 juli 2003 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 Link naar reactie
anoniem Geplaatst: 28 juli 2003 Auteur Delen Geplaatst: 28 juli 2003 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. Quote Link naar reactie
anoniem Geplaatst: 28 juli 2003 Auteur Delen Geplaatst: 28 juli 2003 Ik snap ongeveer wel wat je bedoelt. Wat houden alleen die QueryPerformanceCounter etc. functie's in?? Quote Link naar reactie
anoniem Geplaatst: 29 juli 2003 Auteur Delen Geplaatst: 29 juli 2003 [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] Quote Link naar reactie
anoniem Geplaatst: 29 juli 2003 Auteur Delen Geplaatst: 29 juli 2003 // 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]). Quote Link naar reactie
anoniem Geplaatst: 29 juli 2003 Auteur Delen Geplaatst: 29 juli 2003 [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] Quote Link naar reactie
anoniem Geplaatst: 29 juli 2003 Auteur Delen Geplaatst: 29 juli 2003 Yep, zit wat in. Maar nu wil ik graag een code die wél OS-independent is ;-) Hoe zou je dat dan aan moeten pakken? Quote Link naar reactie
anoniem Geplaatst: 29 juli 2003 Auteur Delen Geplaatst: 29 juli 2003 [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 :) . Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen