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