SAPPHIRE社製Radeon HD 4870ビデオカードトラブルのまとめ

週末にかけて私を悩ませた、SAPPHIRE社製のRadeon HD4870搭載ビデオカードで旧世代のDirectXのゲームタイトルの画面が乱れてフリーズする現象だが、原因が判明したので対策も合わせてまとめておく。

ATi Radeon HD38xxシリーズより、同社のデスクトップ向けGPUは"ATi PowerPlay"という一種の省電力技術が採用されており、GPUを使用するシチュエーションやその負荷によって、GPU/RAMのクロックやGPU印可電圧等をコントロールすることができるようになっている。(元々電力に制限の多いノートPC用のGPUに使われ、培われた技術だ)

ATI PowerPlay™

この技術により、例えばブート時、3Dアクセラレーション時などの状況と、その際のGPUの負荷の程度(低、中、高)それぞれに、別々のGPU/RAMクロック、電圧を与えることができる。これらはBIOSに対してプログラミングが可能であり、更にCCCからプロファイルとして設定することもできるようになっている。

では実際にPowerplayがどのように設定されているかを見てみよう。

以下は私が使用している"SAPPHIRE ATLANTIS RADEON HD 4870 512MB PCI-E/ZALMAN"(長いので、以下"SAPPHIRE HD4870/ZALMAN"とする)のBIOSを、TechPowerupが公開しているGPU-Zというツールで吸出し保存して、同公開されているRBE(Radeon BIOS Editor)というツールにより読み出して、Powerplayのプロファイルを表示した様子だ。

これによると、私のビデオカードのPowerplay設定はその状態の種類として、

0 - Boot
1 - Power saving for notebooks in battery mode, highperformance, Optimal performance
2 - UVD(Universal Video Decoder)
3 - Power saving for notebooks in battery mode, highperformance, Optimal performance

これらが設定されており、それぞれの状態時にその時のGPU負荷を低負荷、中負荷、高負荷の3段階に分類して、それぞれ対応するGPUクロック/RAMクロック GPC電圧の設定値を保持しているようだ。(1.と3.が重複している。この時点でちょっと怪しげだ)
RBEはそれぞれの状態を選択すると、対応するセッティングパラメタの背景色が負荷に合わせて(低負荷=緑、中負荷=黄、高負荷=赤)変化するので、現在のパラメタがどの状態のものなのかが一目で分かるようになっている。(0番のBootは、負荷に関わらずパラメタが一組なのも解る)

RBEで私の"SAPPHIRE HD4870/ZALMAN"のBIOSにおけるPowerplayのプロファイルを見て解ったのは、

0 - ブート時
GPU 750Mhz
RAM 900Mhz
VOL 1.263V

1 - パワーセーブ時
    低負荷 | 中負荷 | 高負荷
GPU 500Mhz | 500Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

2 - 動画アクセラレーション時
    低負荷 | 中負荷 | 高負荷
GPU 750Mhz | 750Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

3 - パワーセーブ時
    低負荷 | 中負荷 | 高負荷
GPU 500Mhz | 500Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

というPowerplayプロファイルで動作している、ということだ。それにしても、どうして状態"パワーセーブ時"が重複しているのだろう。

実際にGPUがどのような時に上記の状態を検出してそれぞれのプロファイルされたパラメタを取得、設定しているのかは解らないのだが、

ゲーム開始時は問題は無いが、暫くして(GPU負荷が低いと思われるシーンにて)規則性無くフリーズする

という発生している現象から推測するに、今回のトラブルの原因は状態1又は3の「パワーセーブ時」というプロファイルが適用されており(負荷状態としてDirec3DアクセラレーションがUVDより低い、ということは考えにくいので、状態名がおかしいが、恐らくは状態は3だろう)、実行中のGPUクロックが500Mhzと750Mhzを乱高下しているせいで、アプリケーションが不安定になっているのではないかということだ。

私はDirectXのアプリケーション、それもゲームを実際に書いたことが無いので、この辺全く解らないのだが(DirectXプログラミングに詳しい方は是非教えて欲しい)、仮にGPUの動作クロックが固定であることを前提にしたAPIGPUの動作クロックを描画サーフェスのリフレッシュと同期しているようなことがあるならば、今回のように不具合が出るのかもしれない。

このままでは推測でしかないので、他の問題が出ていない同GPUを使ったビデオカードBIOSにおけるPowerplayのプロファイルを見てみたい所だ。
SAPPHIREもこの問題を認識しているようで、問題発生後に同様の製品のBIOSをアップデートしており、そのBIOSがサイトに公開されている。
BIOS P/N:188-01E85-001SA,SKU#11133-00-XXR ONLY/ Sapphire Technology - drivers

とりあえずこれをRBEで読み込んで同BIOSで定義されているPowerplayの状態をみてみよう。

0 - Boot
1 - Power saving for notebooks in battery mode, highperformance, Optimal performance
2 - UVD(Universal Video Decoder)
3 - Accelerated 3D
4 - Thermal(GPU too hot)

やはり、状態3は3Dアクセラレート時の状態が正しいようだ。更に状態4-としてオーバーヒート状態が追加されているのが興味深い。

では、このBIOSのそれぞれ状態におけるGPUとRAMのクロック/電圧のプロファイルを見てみよう。

0 - ブート時
GPU 750Mhz
RAM 900Mhz
VOL 1.263V

1 - パワーセーブ時
    低負荷 | 中負荷 | 高負荷
GPU 500Mhz | 500Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

2 - 動画アクセラレーション時
    低負荷 | 中負荷 | 高負荷
GPU 750Mhz | 750Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

3 - 3Dアクセラレーション時
    低負荷 | 中負荷 | 高負荷
GPU 750Mhz | 750Mhz | 750Mhz
RAM 900Mhz | 900Mhz | 900Mhz
VOL 1.263V | 1.263V | 1.263V

4 - サーマル(オーバーヒート時)
    低負荷 | 中負荷 | 高負荷
GPU 200Mhz | 200Mhz | 200Mhz
RAM 500Mhz | 500Mhz | 500Mhz
VOL 1.083V | 1.083V | 1.083V

このBIOSは状態3の時のGPUクロックは負荷に関わらず750Mhz固定にされていたのである。ここが私の使用しているカードとは決定的に違う部分であり、尚かつこのBIOSで問題が出ないのであれば、正にこのプロファイルが原因だったということになる。(クロックの高下に対応できないアプリケーションが対応できないのは、当時このような技術は無かっただけに仕方がない)

昨日のエントリにて、CCCでLoad/Saveできる個人プロファイルにより、上記の状態のうちの「3 - 3Dアクセラレーション時」に相当するGPUクロックを変更できることは確認できたが、これはあくまで対処療法的な措置であり、本来であればBIOSレベルで適切なPowerplayが実行されるべきだろう。

通常であれば、ここでBIOSを実際に修正後の物に変更して問題が発生しないかを確かめたい所なのだが、SAPPHIREのサイトがアップしているBIOSはSKU(Part Number)を限定しており、それが違う製品での使用は認めていない。

RadeonのようなGPUBIOSはリファレンスがあるものの、カードメーカが自分の製品に合わせて独自にカスタマイズすることは良くあることらしいので、GPU型番、メモリ形式、容量、インタフェース、カードインタフェースが同一だったとしても、だからといってBIOSが適合するとは限らないのである。(そもそもBIOSのアップデート自体保証外の行為だが)

ならば私の製品はどうかと調べてみたのだが、同じRadeon HD 4870 PCI-E 512MBであっても、ZALMANクーラーを載せたタイプはどうやら日本限定の製品のようで、SKUが微妙な値になっている。

SAPPHIRE HD4870 512M GDDR5 PCI-E DUAL DVI-I/TVO W/ZALMAN VF-1000 COOLER(日本限定モデル) - SKU# 11133-12-40R (VD3121)

アップされているBIOSが対象としているSKUは11133-00-XXRであり、最初の5桁は合致していることは分るが、その後は合致していない。SKUが読み方が分らない以上、完全に一致していないものは違う製品とみるべきだろう。写真やサイトの説明を見るに、標準的なタイプと違うのはクーラーの形状と冷却ファンの回転数の制御(HD4870シリーズはファン回転数も細かくプログラムできる)だとは思うが、わざわざSKU P/Nを明記しているということは、型番によってBIOSが適合しないことがあることを示している。

その後RBEで自分のカードのBIOSと修正BIOSの内容をつぶさに観察すること15分。BIOSのREVや説明を除き、大きな違いはPowerplayのプロファイルとファン回転数の開始温度だけだということを確認した私が行った以降の作業は想像にお任せしよう。ちなみに以降問題は一切発生しておらず、至極快適だ。※1

Powerplayという省電力技術はGPUの使用負荷によって必要なだけ資源を使うという素晴らしい技術なのだが、ゲームなどのGPU負荷がある程度大きく変化するケース(例えば大量のポリゴンを使うオブジェクトや大きなテクスチャが張られたオブジェクトが素早く動いて変化する場面と、暗転が続くような画面ではGPUの負荷はかなり変わると思われる)では、PowerplayによりGPUのクロックも激しく乱高下することになり、そのようなクロックの変化に対応していないソフトウェア、タイトルで不安定になったり不具合が出ることがあるということで間違いなさそうだ。


以上、長文多謝。

※1 PC-DIYはあくまで自己責任、BIOS等のファームウェアのアップデートはその中でも最も危険度の高い、パーツを新品状態のまま使用不可能にしてしまうS級リスクを伴う作業だということを理解しなくてはならない。

※2 今回導入したIntel Core i7EIST+Turbo Boostテクノロジなんて、現在の各コアの負荷やMPUのTDPの余裕を考慮して動作クロックを1.5Ghz〜3.4Ghzまで動的変化させている。凄すぎて訳が分からない。