大体の使い方は,以下のようなものを見ればわかる.
- Microsoft DirectX SDK (June 2010)のサンプル:BasicCompute11
- Compute Shader Overview(DirectX 11非対応デバイスを使うときの注意が書いてある)
- DirectCompute Lecture Series(最初の方だけでも見ると,GPGPUが何者かよくわかる.オススメ!)
- CPUとGPUの大きな違い(GPUの特性がわかるので,参考に)
私の場合は,SlimDXをC#から使用して,ソフトを組むことにした.実際に計算するコードはHLSLを使って書かなくてはならないが,C言語チックな仕様なので何とかなるだろうと思う.因みに,Direct3Dを使うのはこれが初めて.
スレッド・グループ
スレッドグループについてはここ(MSDN)を見ると分かりやすく説明されている.また,Dispatchする際のスレッドグループ数はMSDNにはX,Y,Zそれぞれが65535以下であると記されている.(私の環境では,X = Y = 65535, Z = 1 の場合正しく動かないようだが,それついては特に記述がないような)
スレッドグループのサイズは,SDKのサンプルでは(1,1,1)となっている.しかしながら,この設定はパフォーマンス的によろしくないので,適度に大きくしたほうがよい.大きくしすぎるのもよくない.(設定の目安とかはよくわからないですorz)
Shader Resource View(SRV)とUnordered Access View(UAV)
Resource Viewとはリソースのデータ(バッファ)へのアクセス方法を規定するもので,1つのリソースに対して複数のViewを作成できる.
演算シェーダのデータの入出力には,このResource Viewを用いる.演算シェーダにデータを渡す方にはSRV,演算シェーダの結果を書き込む方にはUAVが使われる.
SRVはRead-Onlyであり,シェーダ内で書き換えることはできない.また,同じリソースを同時にSRV・UAVの両方としてシェーダに渡すことはできない.
UAVはランダムアクセス(Unordered Access)をするためのResource Viewであり,ReadまたはWriteのアクセスが可能である.ただし,連続したメモリ領域に書込むようにした方が効率的である.また,読み書きを同時に行う場合にはRAW(read-after-write) hazardに注意.
参考:Introduction to a Resource in Direct3D 11,DirectX 11 DirectCompute: A Teraflop for Everyone,Best Practices for DirectX 11 Development
Structured BufferとRaw Buffer
Structured Bufferは同じサイズの要素(構造体)の配列である.一方,Raw Bufferというのは,Byte Address Bufferのことであり,バイト・オフセットを使ってデータにアクセスするものである.詳細については,New Resource Typesを確認する.
初めに紹介したSDKサンプルのシェーダのコードを見てもわかるとおり,Structured Bufferを使うと楽にアクセスできる.
0 件のコメント:
コメントを投稿