2010-12-22 4 views
3

Es scheint, dass die meisten neueren CPUs sowohl von AMD als auch von Intel RDTSC als Zähler mit konstanter Rate implementieren, um die Probleme zu vermeiden, die durch Frequenzänderungen aufgrund von Dingen wie TurboBoost oder Energiespareinstellungen verursacht werden.Wie erkennt man, ob RDTSC einen konstanten Ratenzählerwert zurückgibt?

Da rdtsc viel besser für Performance-Messungen geeignet ist als QueryPerformanceCounter wegen seines viel geringeren Overheads, würde ich es gerne verwenden, wann immer es möglich ist.

Wie kann ich zuverlässig erkennen, ob die rdtsc ein Zähler mit konstanter Rate ist oder nicht?

Antwort

7

Sie können CPUID verwenden, um Ihnen zu sagen. Fn8000_0007_EDX von the docs auf CPUID Bit 8:

TscInvariant: TSC invariant. Es wird sichergestellt, dass die TSC-Rate in allen P-States, C-States invariant ist und Grant-Übergänge stoppt (wie STPCLK Throttling); Daher eignet sich das TSC als Zeitquelle. 0 = Eine solche Garantie wird nicht gegeben, und die Software sollte vermeiden, den TSC als Quelle der Zeit zu verwenden.

+0

Großartig. Scheint auch für Intel zu funktionieren: http://StackOverflow.com/questions/3388134/rdtsc-accuracy-across-cpu-cores/4145156#4145156 – Suma

+0

Das Problem hier ist, dass mit dynamischer Uhr aktiviert, Aufgaben würde unterschiedliche Menge von Zeit zur Ausführung. Selbst wenn das rdtsc-Registerinkrement nicht von der Uhr selbst beeinflusst wird, wird die Zeit, die zum Ausführen von Tasks benötigt wird, durch die Taktgeschwindigkeit beeinflusst. –

-1

Verwenden Sie einfach CPUID, um die generation of the CPU zu erkennen, sehen Sie, ob sie konstante Zähler verwendet. Ich würde jedoch vorschlagen, stattdessen eine Profiling-API verwenden, obwohl etwas wie AMDs Codeanalyst SDK gut tun würde

-1

Ich zähle die Anzahl der Ticks in einer Sekunde und vergleiche dann mit der informierten Uhr unter/proc/cpuinfo. Es funktioniert nur mit deaktivierter dynamischer Uhr. Siehe die Quelle: https://github.com/petersenna/rdtscbench

0

Ich weiß, es ist eine lange Zeit seit der ursprünglichen Frage wurde gefragt, aber kann ich nur darauf hinweisen, dass die Überprüfung der Generation/Modell des Prozessors ist absolut die falsche Sache zu tun. Zuallererst ist es sehr einfach, den Code falsch zu bekommen, so dass er nicht auf zukünftigen Generationsprozessoren funktioniert (weil die Familien-/Modellnummern nicht immer "linear" sind), und zweitens, nur weil ein Prozessor "ein späteres ist Familie/Modell "als diejenigen, von denen Sie wussten, dass dies funktioniert, ist es keine Garantie, dass das Feature dort ist. Es ist WAHRSCHEINLICH, aber ich habe viel Code gesehen, der das schlecht macht, und daher kommt "neuer Prozessor heraus, und der Code macht etwas falsch".

Verwenden Sie das CPUID-Bit, um zu überprüfen, ob der Prozessor das richtige Bit hat oder nicht.

Verwandte Themen