[C/CPP] CPU-Frequenz genau bestimmen

  • Themenstarter Themenstarter Leever
  • Beginndatum Beginndatum
L

Leever

[C/CPP] CPU-Frequenz genau bestimmen (theoretisch)(theoretisch)

[SOLVED]

Hallo ersteinmal und vielen Dank fuer das Lesen dieses Beitrags.

Das Dilema welches mich zur Zeit plagt sieht wiefolgt aus:

Ich moechte gerne einen Funktionsaufruf mit einer Geauigkeit von <= 1 usec. timen.

Zur Zeit benutze ich zur Zeitmessung den TSC und die CPUFREQ. Ich tue mich allerdings etwas schwer damit die CPUFREQ vertrauenswuerdig zu bestimmen.

Aktuelles Schema zur Berechnung der Hz (Pseudo):

Code:
start = rdtsc();
(u)sleep(millis);
stop = rdtsc();
cpufreq = (stop - start) * 1000 / millis

das (u)sleepen erscheint mir jedoch eher als unschoen, da dieses nur garantiert mindestens 'millis' zu unterbrechen, jedoch keine obere Grenze gewaehrleistet. Ausserdem muss man dabei wieder dem Betriebssystem trauen.
Ich dachte, dass man diesen Effekt verschwindend gering halten kann, indem man die Messung einfach ueber einen groesseren Zeitraum durchfuehrt, sodass ein Fehler von wenigen Millisekunden nicht mehr ins Gewicht faellt. Ein weiterer Vorteil sollte dann auch sein, dass der Overhead durch die Fuktionsaufrufe ebenfalls nur einen kleinen Fehler darstellt.

Allerdings ist mir beim Test mit einem RTOS (Echtzeit-BS) aufgefallen, dass troz grosser sleep-Intervalle (20+ sek.) und der Messung als einzigem laufenden Prozess immernoch Schwankungen im MHz-Bereich feststellbar sind. Das kuriose ist daran, dass mit groesser werdendem Intervall manchmal Spruenge nach oben auftreten. Es sieht so aus, als wenn dieses periodisch auftritt und zwar alle 5 Messungen bzw. in alle 5 Sekunden.

BSP Ergebnisse:

Messung (1 sek): 2086517028 Hz
Messung (2 sek): 2032780344 Hz
Messung (3 sek): 2005415944 Hz
Messung (4 sek): 2021755638 Hz (X)
...
Messung (8 sek): 2002287798 Hz
Messung (9 sek): 2010836442 Hz (X)
Messung (10 sek): 2007840043 Hz
...
Messung (13 sek): 2001419247 Hz
Messung (14 sek): 2007176210 Hz (X)
...
Messung (23 sek): 2000728210 Hz
Messung (24 sek): 2004210043 Hz (X)
Messung (25 sek): 2003197321 Hz
Messung (26 sek): 2002259339 Hz

Was kann fuer soetwas verantwortlich sein - Irgendein BS bedingter Interrupt der etwas ausfuehren lasst was mehrere ms Laufzeit hat? (Faend ich persoenlich fuer ein RTOS etwas bedenklich)

Fuer mich scheint das ganze sowieso irgendwie ein Henne-Ei-Problem zu sein: Man braucht die CPUFREQ um die Zeit zu bestimmen, aber man braucht eine verlaessliche Zeitquelle um die CPUFREQ zu bestimmen.

Falls Jemand zufaellig eine Ahnung hat wie Betreibssystem die CPUFREQ oder eine Clock erhalten (und evtl. wie genau diese Werte sind)[BIOS?] waere ich dankbar, fuer alle anderen Vor- und Ratschlage natuerlich auch.

MfG Leever

EDIT: Ich hab vergessen zu erwaehnen, dass das Problem moeglichst portabel geloest werden muss, da das Einsatzgebiet Win XP/7, unixoide Betriebssysteme und ein RTOS namens RTOS-32 sind.

Ich erwarte hier nicht, dass hier Jemand eine praktischen Loesung aus dem Hut zieht. Theoretische Ansaetze und Erfahrungsberichte sind fuer mich schon viel wert.

Ausserdem wollte ich mich noch fuer die Tatsache entschuldigen, dass ich keine Umlautzeichen verwendet habe, aber aus Macht der Gewohnheit habe ich angefangen zu schreiben und war dann mittendrin zu fault das Layout auf de zu stellen.
 
Zuletzt bearbeitet von einem Moderator:
So ich meld mich dann nochmal zu Wort:

Der Mensch der vor mit an dem Projekt gesessen hat, hat Murks beim auslesen des TSC gemacht und nur die unteren 32 Bit ausgelesen, welche natuerlich viel zu schnell ueberlaufen. Mir kam es nicht in den Sinn rdtsc() anzuzweifeln, da erstens die Variable die das Ergebnis haellt die korrekte Goresse hatte und zweitens die Werte komischerweise sehr gut passten und die 2GHz mit groesser werdender Laufzeit immer weiter annaehrten. Daher vermutete ich eher ein Problem in Richtung sleep() oder Timer Interrupt / Scheduler.

Ich hoffe, dass ich nun in der Lage bin die Frequenz der CPU ausreichend genau zu approximieren und den Fehler fuer die Ganuigkeit anzugeben.

MfG Leever

[EDIT]:

Ich nehme alle Anschuldigungen zurueck, mein Vorgaenger war doch unschuldig :D und alles geht auf meine Kappe und die der Standradkonfiguration :rolleyes:. Das Problem lag tatsaechlich daran, dass der Timer Interrupt nicht korrekt gearbeitet hat.
Der Unterschied bei der Messung vom 1sek-sleep zum 5sek-sleep betraegt schonmal nurnoch 1,1 MHz (das sieht doch OK aus;))

Falls Jemand dennoch gute Ratschlage oder interessante Informationen zu diesem Thema hat, so kann er/sie diese dennoch gerne posten.
 
Zuletzt bearbeitet von einem Moderator:
Zurück