突然ですが、このソフト と あのソフト のクロック周波数測定結果が違う!? どっちが正しいの?? という経験のあるオーバークロッカーは少なくないのではないでしょうか?
今日は CPUID.COM で ClockGen というクロック周波数を動的に変更するソフトが公開されていたので試してみました。ところが、どーもクロック周波数が正常に測定できないソフトが多い。それは何故か!? 原因を調査してみました!!
※ここに書かれた情報を鵜呑みにすることなく各自検証してみることをオススメします。あくまで私の環境のテスト結果から導かれた結論を元にかかれた文章です。
いきなりですが、結論です。QueryPerformanceCounter (高分解能タイマ) は動的にクロックを変更した場合正常に動作しません。
そのため幅広い環境でできるだけ正確なクロック周波数を測定するためには、 QueryPerformanceCounter を過信せず、マルチメディアタイマやシステムタイマと組み合わせてクロック周波数を測定する必要があるのではないでしょうか。
ソフト名 | 測定結果 [ MHz ] | クロック周波数測定手法 | 使用バージョン |
ClockGen | 3000.68 | --- | CG-ICS952607 1.01 |
CrystalMark | 3000.99 | QueryPerformanceCounter + GetTickCount | 0.8.82.106 |
CrystalCPUID | 3000.57 | QueryPerformanceCounter + GetTickCount | 2.0.2.4 |
CPU-Z (右) | 3001.0 | QueryPerformanceCounter + timeGetTime/GetTickCount (推定) | 1.19a |
CPU-Z (左) | 2405.5 | QueryPerformanceCounter (推定) | 1.17 |
WCPUID Real Time Clock Chekcer |
2406.78 2406.03 |
QueryPerformanceCounter (推定) | 3.1a |
HDBENCH | 2405.52 | QueryPerformanceCounter (推定) | 3.40 Beta 6 |
CCPUID | 2998.845 | timeGetTime | Frame v0.3.3.12 Core v0.8.3.47 2003/09/23 |
クロック周波数測定君 (上) | 2994.53 | timeGetTime | Release 4 |
クロック周波数測定君 (下) | 2405.52 | QueryPerformanceCounter | Release 4 |
Crystal CPUID Checker | 3000.100 | Sleep | Release 4 |
Windows XP | 2.41GHz | QueryPerformanceCounter (推定) | 5.1 build 2600 SP1 |
若干の誤差はあるものの 2400 のグループと 3000 のグループがあることがわかります。
※WCPUID は /n オプションをつけて起動することで GetTickCount を使った測定が行えます ( 情報提供 nayn 氏 ) 詳細
ここで紹介している全ての手法を試すためには クロック周波数測定君 が便利です。
(非常に)古いマシンでは正常に動作しない(未確認) ものの、高性能なカウンタです。が、今回槍玉に挙がってます(^_^; 過信せず他の手法とも組み合わせて使用しましょう。
(非常に)古いマシンでは正常に動作しない(未確認) ものの、GetTickCount よりは高精度なタイマです。
精度はイマイチですが、多くの環境で確実に利用できます。この手法でクロックを測定すると結果がかなりばらつきます。
多くの環境ではそれなりの精度で測定できますが、一部の環境ではすぐに制御を返すため正常に測定できません。
以前 「WCPUID では正常に測定できないのですが、CrystalCPUID では正常に測定できます」 といった書き込みを自作系掲示板で見つけたときちょっとうれしく思ったとことがあります。それと同時に、何故クロック周波数が測定できないことがあるのだろうかと疑問に思っていました。このたび、ClockGen のおかげで長年の疑問の答えを見出すことができたわけですが、QueryPerformanceCounter がクロックを動的に変更した場合に追従しないとは考えもしませんでした。
それにしても、対応マザーボードも多く ClockGen はいいですねぇ~。CPUID.COM を取るだけのことはあります!!
この文章は Shuttle XPC SB61G2 + ClockGen ( CG-ICS952607 1.01 ) による結果を元に執筆しました。他のマザーボードやツールを使った場合は異なる結果となるかもしれません。とはいえ、多くの環境で正常にクロックを測定するためには QueryPerformanceCounter と timeGetTime もしくは GetTickCount を組み合わせることが有効であることは証明できたのはないかと思います。
MSDN より
QueryPerformanceFrequency
高分解能パフォーマンスカウンタが存在する場合、そのカウンタの周波数(更新頻度)を取得します。システムが動作している間は、周波数を変更できません。
とのこと。上で繰り広げた議論は MSDN に書いてあるような当たり前の話だったのです!! ドキュメントはちゃんと読もうと改めて思う Athlon 64 発表の夜の出来事
nyan 氏より WCPUID を /n オプションをつけて起動すると動的にクロックが変更した場合にも対応できるという 情報 をいただきました。早速確認してみたところ、確かに動的に変更した場合も正しいクロック周波数が表示されるようになりました。※精度的に GetTickCount を使っているのではないかと思います。
なんでも、昔はドキュメントに書かれていたとか、こんな隠し機能があったとは...恐るべし WCPUID !!