2016-04-18 6 views
1

Ich versuche, meine eigene Version von clock() mit Asm und Rdtsc zu implementieren. Ich bin mir jedoch ziemlich unsicher über den Rückgabewert. Sind es Zyklen? Oder sind es Mikrosekunden? Ich bin auch verwirrt über CLOCKS_PER_SEC. Wie kann das konstant sein?Uhr, rdtsc und CLOCKS_PER_SEC

Gibt es irgendeine Formel, die diese Werte in Beziehung setzt?

+1

Von [diese 'clock' Referenz] (http://en.cppreference.com/w/c/chrono/clock):„Gibt die ungefähre Prozessorzeit von dem Prozess verwendet seit Anfang eine implementierungsdefinierte Ära, die sich auf die Ausführung des Programms bezieht. Um den Ergebniswert in Sekunden zu konvertieren, dividiere ihn durch CLOCKS_PER_SEC. " Das ist alles. Welche Einheit die Funktion zurückgibt, hängt von der Implementierung ab. –

+0

Es braucht keine Formel, nur die Zusammenarbeit des Programmierers, der die Funktion clock() geschrieben hat. Da er weiß, wie er sich verhält, kann er auch die #define für CLOCKS_PER_SEC schreiben. Die Einheit für RDTSC ist "Ticks", es variiert von einer Maschine zur anderen. Sie können nicht wissen, wie lange ein Tick dauert, es sei denn, Sie kalibrieren ihn gegen eine bekannt gute Uhr. Wie die Uhr(). –

+0

Angenommen, der Programmierer möchte POSIX folgen ... –

Antwort

1

Sie können eine RDTSC Referenz-Implementierung finden Sie hier:

https://github.com/LITMUS-RT/liblitmus/blob/master/arch/x86/include/asm/cycles.h

TSC zählt die Anzahl der Zyklen seit dem letzten Zurücksetzen. Wenn Sie eine Zeiteinheit in Sekunden benötigen, müssen Sie auch die CPU-Taktfrequenz lesen und den TSC-Wert nach Häufigkeit dividieren. Dies ist jedoch nicht korrekt, wenn die CPU-Frequenzskalierung aktiviert ist.

https://en.wikipedia.org/wiki/Time_Stamp_Counter