Compute Shader の Dispatch と Thread Group

Compute Shader で実行される Thread 数は、CommandList::Dispatch(x, y, z) と Shader 側で指定する numthreads[x, y, z] の数によって決まる。

CommandList::Dispatch(5, 3, 2) , numthreads[10,8,2] で実行した場合は、30 の Thread Group 内でそれぞれ、160 threads ずつ動作する。

numthreads

Thread Group 内のスレッド数を指定する。Dispatch(1, 1, 1) で起動した場合は、Thread Group の個数は1になる。numthreads に指定した X * Y * Z のスレッド数が、Thread Group 内で起動する。

4×4 の matrix にアクセスする場合は numthreads[4, 4, 1] のように指定して、SV_GroupThreadID のxy値を取得することで 4×4 に簡単にアクセスできる。

numthreads の最大数

Shader Model 5.0 以降では、Thread Group ごとに起動する numthreads の最大数は 1024 まで。x * y * z が 1024 を超えてはいけない。

numthreads(16, 16, 4) とか numthreads(32, 32, 1) とか numthreads(8, 8, 16) とか。

システム値

uint GI : SV_GroupIndex
uint3 DTid : SV_DispatchThreadID
uint3 GTid : SV_GroupThreadID
uint3 Gid : SV_GroupID

上記4つが、エントリーポイント関数から取得出来る。

SV_GroupID (uint3)

Thread Group のインデックス値が返る。Dispatch(2,1,1) で呼び出した場合 2つのスレッドグループが起動して、その値は (0,0,0) または (1,0,0) になる。

SV_GroupThreadID (uint3)

Thread Group 内の個々のスレッドのインデックス値が返る。numthreads[3,2,1] で起動した場合は、このスレッドグループは6つのスレッドが起動して、その値は[0-2,0-1,0] になる。

SV_GroupIndex (uint)

Thread Group 内のインデックス値である SV_GroupThreadID を 1D 化したインデックスが返る。

SV_GroupIndex = SV_GroupThreadID.z * dimx * dimy + SV_GroupThreadID.y * dimx + SV_GroupThreadID.x

Thread Group の数 Dispatch(x,y,z) には依存しない。numthreads で指定した値に依存。そのため、このシステム値が返す最大は 0-1023 まで。

※ dim は numthreads で指定した次元。

SV_DispatchThreadID (uint3)

Thread と Thread Group とを組み合わせたインデックス値。計算方法はSV_GroupID (Dispatch された現在の Thread Group のインデックス) * numthreads で指定されたxyz + GroupThreadID (Thread Group 内の現在のインデックス値)

Dispatch(2,2,2) で numthreads[3,3,3] の場合は範囲は各 0…5 が返る。
Dispatch(5,3,2) で numthreads[10,8,3] の場合は範囲は [0,0,0] から [49,23,5] までが返る。

DispatchThreadID で 640×480 px を処理

Dispach(32, 24,1) で numthreads[20, 20, 1] で実行すれば、SV_DispatchThreadID の値は [0,0,0]-[639,479,1] の範囲で返ってくる。

int3 location = int3(0,0,0);
location = DispatchThreadID.x;
location = DispatchThreadID.y;
float value = InputTex.Load(location);

でアクセスすることが可能。
(Reference: Practical Rendering & Computation with Direct3D11)

参考リンク

Compute Shader Overview
https://docs.microsoft.com/ja-jp/windows/win32/direct3d11/direct3d-11-advanced-stages-compute-shader

ID3D11DeviceContext::Dispatch method
https://docs.microsoft.com/ja-jp/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-dispatch

numthreads
https://docs.microsoft.com/ja-jp/windows/win32/direct3dhlsl/sm5-attributes-numthreads

この記事とは関係無いですが、DirectX とか OpenGL は過去バージョンのドキュメントにしか無い情報が沢山あり、それが新しく始める場合の障壁になる。

コメントを残す

メールアドレスが公開されることはありません。