タイマーカウンタの TSC についていろいろと調べてみました。
rdtsc 命令って今はもう使うなってのが定番で、代わりにQueryPerformanceCounterを使うようにとのことだけど、それの意味とか。
TSCはそもそもCPU内にあるタイムスタンプカウンタで、近年複数コアになってこのTSCもコアごとに持つようになってきている。
都合の悪いことに、 このTSCだけどコア間で同期がとれておらず、OSのスケジューラによっては先ほどまで動いていたコアから別コアへ実行が割り当てられて動作してしまうということがある。このときにTSC値のずれが問題になる。
もっとも、このTSCのズレはWindows HALやBIOSなどがうまく同期してくれて現在は問題になりにくいようになっているらしい。Microsoftから出ているパッチをきちんと当てていれば、コア間でのズレはないっぽい。
その情報ソースはここ。 http://support.microsoft.com/kb/896256/ja
Windows XP SP2以降では無い場合(&パッチ未適用とか)では、TSCズレの件とは付き合わないといけなさそうだ。
こういった問題があるから時刻取得系のものはアフィニティマスクを使用して、1つのコアで動くようにプログラム上で制御してあげるケアが必要みたいです。
で、このTSCってクロックに依存して増加する値だけど、それは信用していいの?という話に続きます・・・。