Text & Photo by トライゼット西川善司

ページ 2/2



■ピクセルシェーダの演算精度問題
   RADEON 9700系が速くてGeForce FXが遅い理由

善:
 GDCのセッションで,NVIDIAの技術者が「実行速度が速い16ビット精度の実数カラーサーフェースを活用しましょう」と言っていました。R9700系は内部24ビット精度で演算しますよね。このアーキテクチャはどういう経緯で生まれたんでしょう?

JM:
 ATIも,1年前から16ビット精度と32ビット精度の実数カラー表現について,議論をしていました。
 24ビット精度フォーマットの策定も考えていたのですが,近いうちにすべてのGPUが32ビット精度フォーマットを当たり前にこなせるようになるはずなので,これはやめにしました。
善:
 一度仕様として作ってしまうと,しばらく残ることになりますからね。

JM:
 そうです。32ビット精度の演算器を実装するには,トランジスタ数制限の観点からすると実装できそうにないと分かってきましたし。しかし,16ビット精度ではさすがに精度が足りない。そこでトレードオフとなる24ビット精度演算器を実装しました。
善:
 16ビット精度ではどういうときに問題が出るんでしょうか。

JM:
 まず例として挙げられるのは,ベクトルの再正規化(ベクトルの方向は変えずに絶対値を1にする)ですね。この演算は16ビット精度では問題が出ます。
善:
ビジュアル的にはどのような問題が出るんですか。

JM:
 正規化したベクトルは"キューブ環境マップ"の参照に使います。環境マップ参照の精度が下がれば,映り込む画像の品質が下がるのです。
3DMark03のPixelShader2.0Test。32ビット精度実数演算を多用するピクセルシェーダプログラムが実行されるため,GeForce FX系はR9700系の半分ほどのパフォーマンスしか出ない
善:
 なるほど。パフォーマンスと精度の両方に優れた24ビット精度をATIは選択した……ということですね。

JM:
 そうです。ゲームはもちろん,RENDERMANコンテンツのレンダリングも,24ビット精度で十分だと考えています。  確かにこの手法では,32ビット精度の実数データから24ビット精度への変換処理というオーバーヘッドがありますけど。
善:
 R9700系を使う限りは,16ビット精度,32ビット精度について気にする必要はないということですね。

JM:
 NVIDIAが32ビット演算器を採用したのはとても自然なことですが,パフォーマンスが上がらないのは不幸なことだと思います。
善:
 GeForce FXのパフォーマンスが上がらない理由は分かりますか?(笑)

JM:
 私は彼らのGPUのアーキテクチャに詳しくないですから(笑)断言できませんが,32ビット実数演算が2パイプラインで共有されていて,実行が分断されているような気がします。なので特殊ケース,例えばデプスバッファ(Zバッファ)への出力時しか,8ピクセル出力ができないのではないかと。
善:
 3DMark03のピクセルシェーダ2.0テストの結果などは,確かにGeForce FXにはつらいですね。

JM:
 あれは32ビット精度実数ピクセル演算を多用していますからね。GeForce FXにはつらいでしょう。
善:
 R9700/R9800は,32ビット実数ピクセル演算をどのように処理しているのですか?

JM:
 通常は4ピクセル同時に処理します。R9700/R9800は4ピクセル単位で処理する機能を二つ塔載していて,我々はこれをクワッドと呼んでいます。このクワッドは,それぞれが独立して動作します。
善:
 RADEON 9500/9600(以下,R9500/R9600)は,クワッドが一つのバージョンというわけですね。

JM:
 例えば,片方のクワッド中のあるパイプでテクスチャアクセスを行ったためにストールしたとしても,この処理は他方のクワッドには無関係なので実行は継続されます。こうして,それぞれのクワッドはマルチスレッドのような形で実行していくわけです。
 しかし,二つのクワッドはテンポラリレジスタなどを共有しています。そのため共有領域が一杯になると,片方のクワッドの実行が遅れる場合があります。
善:
 無駄にレジスタを使っていると,スループットに影響が出る可能性があるわけですね。

JM:
 そのため,シェーダコンパイラのオプティマイザは,レジスタ使用が最低限になるように最適化しています。


■浮動小数点実数ピクセルフォーマットの近未来

善:
 DirectX 9で新たに規定された浮動小数点実数ピクセルには,表のような制限があります。「実数ピクセルではフィルタリングやアルファブレンディングができない」というのは非常に大きな制約だと考えられますが。
DirectX 9世代GPUでサポートされた各種カラーフォーマットの制約表


JM:
 現行のGPUが必ずこうなっている……と規定するものではないんです。「CheckDeviceFormat()」を実行し,GPUがどのフィーチャーをサポートしているかどうかを判断すべきです。
善:
 DirectX 9世代GPUでも,こうした制約のないものが出てくる可能性があるからですね。

JM:
 そうです。この表にあるような制約は,現行のプロセッサの製造プロセスルールで現実的に実装できるトランジスタ数制約といえます。そのため,このような制限が与えられているだけです(プロセスルールは,R9700/R9800が0.15μm,GeForce FX5800系が0.13μm)。ですから次世代GPUでは取り払われると思います。
 R9700/R9800は各パイプにカラーブレンダがありますが,実数対応化していたなら,トランジスタ数はもっと増えてコストが高くなっていたことでしょう。
善:
 しかしゲーム開発者からは,こうした制限が取り払われないとゲーム用途に使用するのはつらい,という声もあるようです。

JM:
 確かにそういった指摘は我々も認知しています。我々がとくに重要視しているのは「32ビット実数フォーマットのブレンディングができない」という点です。これらはハイダイナミックレンジ(HDR)レンダリング(*7)のとき,非常に有用なのです。
 我々の「Rendering With Natural Light」という,R9700のHDRデモを覚えていますか?
善:
 あの"光のモヤ"がかかる球体のデモですね。あれはブルームフィルタによって生成された"光のもや"フレームとオリジナルのシーンを合成していますよね。

JM:
 あのデモでは各色チャンネル16ビットのABGR16フォーマットを採用しているのですが,合成にアルファブレンディングを使用していません。……というか使用できなかったので,ピクセルシェーダで色演算して合成しています。
ATIのデモ「Rendering With Natural Light」。実行ファイルやムービーは「こちら」から入手可能
善:
 実数ピクセルフォーマットのMIP-MAPに関してはどうですか?

JM:
 R9700ではすでにサポートしています。実数ピクセルでもMIP-MAP,キューブマップ,ボリュームマップをサポートしています。
善:
 しかしフィルタリングはサポートされないから,MIP-MAPを利用したときの精度は落ちてしまうわけですね。

JM:
 その通りです。これもいずれ解決されるべき制約ですね。将来的には,バイリニアやトライリニア,アニソトロピックといったフィルタがサポートされて,ほかのサーフェースと同様に利用できるようになると思います。
善:
 新しい世代のGPUではできることが増えますが,できることの中に別の制約が与えられていて,これが次世代では取り払われる。でもそれには,また新しい機能が……というのが繰り返されていくわけですね(笑)。本日はありがとうございました。

   (*7)従来ARJM各8ビット,合計32ビットカラー(1677万色次元)でレンダリングしていたものを,実数カラー表現を採用して幅の広い表現色でレンダリングを行うこと。色数を増やす目的ではなく,演算精度を上げるために導入された

ページ 2/2