2010年9月4日土曜日

ComputeShaderの基本

大体の使い方は,以下のようなものを見ればわかる.

私の場合は,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 11DirectX 11 DirectCompute: A Teraflop for EveryoneBest Practices for DirectX 11 Development

Structured BufferとRaw Buffer

Structured Bufferは同じサイズの要素(構造体)の配列である.一方,Raw Bufferというのは,Byte Address Bufferのことであり,バイト・オフセットを使ってデータにアクセスするものである.詳細については,New Resource Typesを確認する.

初めに紹介したSDKサンプルのシェーダのコードを見てもわかるとおり,Structured Bufferを使うと楽にアクセスできる.

0 件のコメント:

コメントを投稿