AMD Dual-Core Optimizer
未だに RDTSD 使ってるゲームって,結構あるんですかね?
AMDは,本社が運営する英語版Webサイトで,Athlon 64 X2をはじめとする同社製デュアルコアCPU用ユーティリティ「AMD Dual-Core Optimizer」を公開した。同サイトのサポート用ページ「AMD Athlon 64/FX Processor Utilities and Updates」からダウンロード可能になっている。
AMDによると,AMD Dual-Core Optimizerは「RDTSC命令を用いるいくつかのゲームにおいて,パフォーマンスを向上させる」ものだそうだ。
そう言われても多くの読者はさっぱりだと思うので,簡単に説明しておこう。最近のCPU(正確にはx86互換CPU)には,クロックごとに数が増える独自のカウンタ「TSC」(Time Stamp Counter)が用意されている。そして,「RDTSC」(ReaD TSC)命令を利用すると,わざわざWindows(のAPI)で時間をチェックしなくても,TSCから高速に時間情報を取得できるようになっており,高速性を要求されるゲームなどは多用されるようになってきていた。
だが,Athlon 64 X2をはじめとするAMD製のデュアルコアCPUでは,どちらかのコアがHalt命令を発行する(=CPUコアが「アイドル」と呼ばれる低負荷状態に移行する)たびに,片方のTSCが停止するようになっていた。そのため,デュアルコアCPUにおけるそれぞれのコアによって,時間認識がズレるという問題が発生していたのだ。
AMD Dual-Core Optimizerは,要するにこの問題をクリアするためのユーティリティである。AMDもサポートページにある説明文の後半で述べているが,「パフォーマンスを向上させる」というよりも,「これまであった問題を修正する」存在といえるだろう。
以前 (id:NyaRuRu:20051226#p2) 紹介した DirectX のホワイトペーパー『Game Timing and Multicore Processors』でも,この問題は取り上げられています.ホワイトペーパーの結論としては「RDTSC はどこでも意図通りに動くとは限らないので,(出荷版に組み込むなら) QueryPerformanceCounter と QueryPerformanceFrequency を使え」というものです.
よくある誤解ですが,「QueryPerformanceCounter は RDTSC のラッパー」ではありません.QueryPerformanceCounter は汎用的な時間計測のための API で,HAL によっては RDTSC を使うこともあるというだけです.信頼性という意味では HAL や bios の不具合で QueryPerformanceCounter がきちんと動作しないこともあり,確かにこれだけに頼るリスクはあります.
しかし,これらの不具合は Microsoft にフィードバックを送ることで改善が期待できますが,__rdtscなどを直接書いてしまうと,基本的には修正にリコンパイルを行うか,今回のようにハードウェアに近い側で対応を行うしかなくなってしまうわけです.
reference
- id:NyaRuRu:20051226
- id:NyaRuRu:20050316#p3
- http://www.dwahan.net/nyaruru/programming/#fps_control