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などを直接書いてしまうと,基本的には修正にリコンパイルを行うか,今回のようにハードウェアに近い側で対応を行うしかなくなってしまうわけです.