4

AMD と Intel の両方の新しい CPU のほとんどは、rdtsc を定数レート カウンターとして実装し、TurboBoost や省電力設定などの結果として周波数が変化することによって引き起こされる問題を回避しているようです。

rdtsc はオーバーヘッドがはるかに少ないため、QueryPerformanceCounter よりもパフォーマンス測定に適しているため、可能な限り使用したいと考えています。

rdtsc が一定レートのカウンターであるかどうかを確実に検出するにはどうすればよいですか?

4

4 に答える 4

7

を使っCPUIDて伝えることができます。CPUID Fn8000_0007_EDX ビット 8のドキュメントから:

TscInvariant: TSC インバリアント。TSC レートは、すべての P ステート、C ステート、ストップ グラント遷移 (STPCLK スロットリングなど) にわたって不変であることが保証されます。したがって、TSC は時間のソースとして使用するのに適しています。0 = そのような保証は行われず、ソフトウェアは TSC を時間のソースとして使用しようとすることを避ける必要があります。

于 2010-12-22T14:13:30.703 に答える
0

元の質問がされてから長い時間が経っていることは知っていますが、プロセッサの世代/モデルを確認することは絶対に間違っていることを指摘できますか. まず第一に、コードを間違えて、将来の世代のプロセッサーで動作しないようにするのは非常に簡単です (ファミリー/モデル番号が常に「線形」であるとは限らないため)。これが機能することを知っていたものよりも、「ファミリ/モデル」が表示されていても、その機能が存在することを保証するものではありません。それは可能性が高いですが、これをうまく実行しないコードをたくさん見てきました。そのため、「新しいプロセッサが出てきて、コードがうまくいかない」のです。

CPUID ビットを使用して、プロセッサに正しいビットがあるかどうかを確認します。

于 2012-12-20T14:57:44.140 に答える
-1

CPUCPUIDの生成を検出するために使用するだけで、定数カウンターを使用しているかどうかを確認します。ただし、代わりにプロファイリング API を使用することをお勧めします。AMD の codeanalyst SDK のようなものがうまく機能します。

于 2010-12-22T14:10:00.010 に答える
-1

私は 1 秒間のティック数を数えてから、/proc/cpuinfo にある通知されたクロックと比較します。動的クロックが無効になっている場合にのみ機能します。ソースを参照してください: https://github.com/petersenna/rdtscbench

于 2012-03-11T13:28:14.323 に答える