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):
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.
[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: