タイマソースをACPIに変更する

Windows ではどうかというと,6 年前に書かれた『Guidelines For Providing Multimedia Timer Support』の Reasons for a New Timer で既に問題が指摘されていたにも関わらず,HPET の普及具合とか新 API をどうするかとか,なかなか解決の形が見えてこない.

2008-09-09 - NyaRuRuの日記

まず、HPETが有効な状態でQueryPerformanceFrequencyを呼ぶと、14318180を返してきた。次にBIOSの設定で、HPETを無効にしてみると、3579545であった。再度HPETを有効にすると、値は元に戻った。なるほど、HPETが使われているらしい。

本の虫: VistaでHPETが使われていることの確認

残念ながらWindows XPではHPETは使われてないようだ。デバイスマネージャでは「高精度イベントタイマ」というリソースで表示されるものの、不明なデバイスを解消しているだけっぽい。
CoreDuoのノートPCのQueryPerformanceFrequencyは3579545(おそらくACPIタイマ)だったが、Core2DuoのデスクトップはCPUのクロック数を返した(Local APIC Timerか?)。どちらもWindows XP Pro SP3で、デバイスマネージャでは「ACPIマルチプロセッサPC」なのだが。
最近はデスクトップでもクロックは可変なのでCPUのクロック数を返されると不安になるが、CPUのクロック(倍率)を下げても取得される値(QueryPerformanceCounterの増加値)は一定のままだったので、問題ない模様。ただし、SetFSBとかDS3RMonみたいなツールを使ったら狂う気がする。

ACPIタイマにする方法ないのかな?ということで適当にググってたらhal.dllにパッチを当ててる人がいたのだけど、コアDLLにパッチ当てるのは気乗りしないのでバイナリを眺めていたらTIMERESとかUSEPMTIMERとか書いてあるのを発見。
boot.iniに/usepmtimerを追加したらQueryPerformanceFrequencyが3579545を返すようになった。まあ精度が悪くなっただけなんだけどなんか安心。