torutkのブログ

ソフトウェア・エンジニアのブログ

x86系CPUのRDTSC命令で高分解能時間計測

CPUクロックごとに加算される64bitタイムスタンプカウンタ(IA32_TIME_STAMP_COUNTER_MSR)を読み出すRDTSC命令を使って、CPUクロック並みの分解能を持つ時間計測ができます。
VC++GCCのインライン・アセンブリ記述で使用します。

ところが、1秒間にカウントする数を数えてCPUクロックの周波数を計算してみたところ、デュアルコアのマシン上でどうも結果がばらつきます。

どうやら、マルチプロセッサ環境では、プロセッサ間でTSCの値が異なっているので、1回目のRDTSC命令と2回目のRDTSC命令の間にスリープ等を入れたときに、スリープ前後で別なCPUにスレッドの実行が渡されている可能性があります。

Windows OSのAPI SetThreadAffinityMask()を使って1つのプロセッサにのみ割付けられるようにして計測したところ問題は解消。