Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: TomCat am 25. November 2016, 11:35

Titel: performancecounter frequenz bzw. CPU-Takt
Beitrag von: TomCat am 25. November 2016, 11:35
Hallo,
gibt es eine Möglichkeit die Frequenz des Performance-Counters bzw. die CPU-Frequenz auszulesen?
Der Befehl "rdtsc" gibt mir zwar den Inhalt des Taktzählers in 64-Bit Format, aber nicht die Frequenz mit der dieser hochgezählt wird. 

Welche Möglichkeiten hat man da?

THX
TomCat
Titel: Re: performancecounter frequenz bzw. CPU-Takt
Beitrag von: Svenska am 26. November 2016, 06:30
Um die momentane mittlere Frequenz des TSC herauszubekommen, brauchst du eine zuverlässige (Zeit-)Referenz. Die bekommst du vom HPET (oder notfalls vom PIT), denn deren Grundtakt ist festgelegt. Du baust dir also eine Warteschleife bekannter Zeit (z.B. 10 ms) und liest vorher und nachher den TSC aus. Aus der Differenz kannst du die Schritte pro Sekunde und damit die Frequenz ableiten. Für gebrauchbare Ergebnisse sollte die Warteschleife Busy-Waiting ohne aktive Interrupts durchführen.

Die wahre CPU-Frequenz bekommst du über ACPI, aber das ist viel Arbeit.

Bedenke, dass der TSC keine stabile Zeitbasis ist. Es hängt von der konkreten Architektur ab, was er genau tut. Manchmal skaliert der TSC mit der CPU-Frequenz, manchmal nicht. Manchmal bleibt er im Idle stehen. Manchmal sind die TSCs mehrerer Cores auf einem Die synchronisiert, manchmal laufen sie auseinander. Manchmal sogar dann, wenn die Cores mit der gleichen Geschwindigkeit laufen.
Titel: Re: performancecounter frequenz bzw. CPU-Takt
Beitrag von: TomCat am 29. November 2016, 09:27
Danke erstmal,

ich habe es bisher immer mit dem internen Timer gemacht. Der läuft ja mit 1,19.... MHZ. hab alle Interrupts
gesperrt und hatte dadurch einen sauberes Zeitintervall.  Das geht ja ganz gut soweit.
ich dachte halt, man könnte die Performancecounter-frequenz einfach irgendwo auslesen und würde sich so den ganzen
"Mess-Klimbim" sparen.
Aber scheint wohl nicht so einfach direkt zu gehen?
 
Titel: Re: performancecounter frequenz bzw. CPU-Takt
Beitrag von: Svenska am 02. December 2016, 22:36
Der TSC zählt nur Takte, der weiß nicht, wie schnell die kommen und kann dir das darum nicht verraten. Du kannst ihn aber einmalig mit einem richtigen Timer abgleichen und solange du nichts seltsames mit der CPU anstellst (kein idle, kein frequency scaling), innerhalb eines Cores bleibst und das BIOS die CPU nicht wegen Überhitzung bremst, kannst du damit auch eine gute, kurze Zeit-Warteschleife realisieren.

Für alles andere solltest du den HPET oder PIT benutzen.