再び Gamefest2008 のあたりから D3D11 関連。
●Compute Shader
ポストフィルタなど Compute Shader の想定されている用途や、
RWTexture2D/RWBuffer が PixelShader でも使えることなどから、
Compute Shader は Pixel Shader に近いものだと考えられます。
実際に現在の GPU でも、AMD Stream SDK の CAL で走るプログラムは
PixelShader 相当だったため一致しています。
Compute Shader は 32KByte のシェアドメモリにアクセス可能です。
2048 float4 = 8192 float = 32KByte
共有メモリと言うよりも、スレッド間で共有されるレジスタ Shared Register と
表現されているようです。
RADEON HD4870 の CAL を使った global buffer (shared local) は実測で
2048 vector、ちょうど 32KByte でした。
これが Shared Memory (Register) 相当と考えられるためほぼ一致しています。
任意の読み書きと Shared Register 以外の特徴として Atomic 命令があります。
32bit 値の read-modify-write に対応しているようです。
命令も Windows のような Interlocked~()
これを利用してスレッド同期が可能となり、排他的なメモリへアクセスなどが
できるようです。
AMD CAL では見あたりませんでしたが、CUDA では 32/64bit の Atomic 命令を
備えているようです。
AMD CAL でも Global Buffer へのアクセス、たとえば
「add g[0].x, g[0].x, r1.x」が Atomic なら代用できますが
そうではないようです。
il_ps_2_0 dcl_input_position_interp(linear) v0.xy dcl_output_generic o0 dcl_literal l0, 1, 1, 0, 0 itof r1.x, l0.x add g[0].x, g[0].x, r1.x ret_dyn end
g[0].x は毎回異なる値となりました。
● API
Direct3D11 は Direct3D10 とほぼ同じ API セットを持ち、機能拡張されている
ものとなるそうです。
詳細は SDK のリリースを待たないといけませんが、おそらく Direct3D8 と
Direct3D9 の関係に近いものだと考えられます。
DirectX7 までのベースとなる DirectDraw を捨てて、Direct3D8 は作り直されました。
その後の Direct3D9 は完全に互換性があるとはいえないものの、考え方や設計は
Direct3D8 とほとんど同じものでした。
Direct3D11 は Direct3D10 の GPU でも動作するそうです。
11 専用の機能を使用することは出来ませんが、9→10 よりはスムーズな移行が
できそうです。
でもこれは Direct3D9 以前は当たり前のことでした。
DirectX7 世代の GPU でもシェーダーなど未対応機能が走らないだけで DirectX8
が使えるし、ShaderModel1.x の Direct3D8 世代 GPU でも Direct3D9 がそのまま
使えます。
Direct3D9 から Direct3D10 への切り替えがあまりに特殊すぎました。
GPU も OS も新しくしなければならず互換性も無かったので。
関連エントリ
・Gamefest2008 と Direct3D 11
・AMD Stream SDK