『ピクセルシェーダの精度』

はじめに

それまで同じ方向に向かってしのぎを削っていたATI vs nVIDIA両社はDirectX 9.0世代のグラフィックチップから明確に方向性が変わってきました。このグラフィックチップの方向性でもっとも取り上げられたのがピクセルシェーダの精度の話です

ピクセルシェーダの精度のお話

ATIを含む他社のピクセルシェーダVer 2.0ではハイエンド向けも含めて24bitの精度の浮動小数点演算装置を実装しているのに対して、nVIDIAはローエンドまですべてのグラフィックチップで32bitの精度の浮動小数点演算装置を実装しています。実際にDirectXやOpenGLでは32bitと規定しているので24bitの演算装置で処理すると精度が足りないことになりますが、そこまで厳密な演算を必要としないと判断されたようです。

24bitの演算装置に比べて当然32bit演算装置の方が規模が大きくなり使うトランジスタの量が多くなります。使うことができるトランジスタの量はおおよそ決まってくるのでATIは24bitをとった変わりに余裕が出たトランジスタを高速化に使う方向で、nVIDIAは逆に高速化に使うトランジスタを切り詰めて32bitの精度を持つ演算装置を採用したのでした。

ATIの説明では現状のプロセスルールでは32bitの精度のピクセルシェーダを持つことは難しく、またゲームなどのリアルタイムでの処理を考えると精度よりも処理速度を重視すべきで24bitが精度的にも速度的にも最適なラインと言っていました。

それに対してnVIDIAは将来は32bitになるのならばプログラムする側は32bitでそのままプログラムを書ける32bitのアーキテクチャの方がクリエーターは手間がかからなくてよい。また将来を見越して3D映像の処理など一種の業務的な処理をも想定した場合は32bitの精度は必要不可欠というのが見解です。まぁどちらの言い分も理にはかなっていますよね。

さて、ここでさらに話をややこしくするのがnVIDIAの32bit精度のプログラムシェーダは16bit精度にした場合に飛躍的に処理速度が上がるそうなのです。単純に32bitならば16bitを同時に二つ処理できるとでも考えてみると分かりやすいでしょう。そこでゲームなどのリアルタイムで高速な処理が必要な場合は32bitの精度のものも16bitの精度で高速に処理してしまい、32bit精度が絶対に必要な処理は低速ながら32bitで処理をするという二つの顔を持っていたのです。

たしかに、24bitに比べてリアルタイムの処理だと精度がさらに悪くなってしまいますが、32bitの処理は24bitの演算装置ではできないので大きなアドバンテージとなります。問題はnVIDIAがドライバーで密かに自動で16bit精度の処理に切り替えるようにしていた点で議論を呼んでしまったのです。

しかも困ったことに、ライバル各社は大声で文句を言うことができないからタチが悪いのです(笑)。「きみきみ、精度を16bitに落として速度をあげるなんて卑怯じゃないか!」と言いたいところですが、もともとDirectXの正式な仕様は32bit精度なので24bitでも精度を落としていることになるからです。

そりゃぁ24bitに比べて16bitはさらに精度が悪いので文句も言いたいところですが、どちらも精度が足らないことには変わりなく、もし万が一そのことを公に争ってnVIDIAが常に32bit精度で処理をするようにドライバを変更した場合、nVIDIAはフル精度で自分たちが精度の足らない処理をしているということを世間に知らしめてしまうことになりかねません。

だからライバル各社は穏便に、それでいて確実にnVIDIAを非難をするのでした。