昔にこれやそれを記事にしてみましたが、放置していたのでちゃんと再度調べ直して結論。
使うならそれが正しいかどうか検証しましょう~
高分解能パフォーマンスカウンタの正体について
結局はこれが問題なんですよね。これは結局のところ「マザーボードorチップセットのドライバ依存」が正しいです。
いくつかの記事を見回って集めてきたところがこれ。確認ができているもので、精度が悪い順に並べると
- PIT (Programmable Interval Timer)
- ACPI Power Management Timer
- HPET (High Precision Event Timer)
- RDTSC (Read Time-Stamp Counter)
となります。ドライバに依存してこれのうちのいずれかが「高分解能パフォーマンスカウンタ」として選択されます。
ちなみに、HPETはWindows2003以前(WindowsXP含む)ではシステムへの組み込みを行わない(ドライバとして提供されていない)ため使用されません。
この記事で
・・・OSが違うと結果が違うのかい。
と一言書きましたが、これの意味は「OSが違うと組み込まれるドライバが異なるため、参照されるタイマも変化する」と言うことですね。
WindowsVista以上ではHPETを有効にすることができるため、こちらが参照されるようにハードウェアが動作することもあるようです。
ちなみにHPETはICHなどのチップに組み込まれている(ICH4以降なら組み込まれているらしい)ので、それ以降でWindowsVista以降であればおそらくドライバが組み込まれると思います。
で、前回の結論のように「CPUクロック=RDTSCが使用されるパターンで実時間計測ができない」と言うことが起こります。Microsoftが推奨しているにもかかわらず、です。
ドライバによるタイマの参照が問題なのでMicrosoft側に見破ってほしいような気もしますが今のところはQueryPerformanceCounterを使用するこちら側ががんばって判別しなければならないようです。
判別方法については・・・適当に考えてください。すぐに考えつくのが
- RDTSCと似たような値もしくは差分値をQueryPerformanceCounterが返したときは信用しない (RDTSCはVC8以上なら_rdtscで取得できます)
- 明らかにCPUのクロックではない値(100MHz以下)を返したときは大丈夫かもと思う
くらいですか。あげたタイマのうち上二つの場合は精度は10MHzを下回るはずなのでそれなら大丈夫のはずです。確定形ではないので注意。
これに関する記事はいろいろとありました
探し回れば出てくるもんですね。正しい情報がどれか判別するのも大変ですが。
HPETという言葉を知ったのがPC系情報誌だったのが自分的には残念な気もします。
おかげでQPC問題に対するある程度確証が得られる結論を考えることもできた、ということでもありますが。