(py)CUDA のブロックとグリッドの寸法について質問を受けました。ブロックの合計サイズには制限があることは知っていますが、グリッドには制限がありません
また、実際のブロックサイズはランタイムに影響します。しかし、私が疑問に思っているのは、256 スレッドのブロックがある場合、(256,1) のように開始するか、(128,2) のように開始するか、(64,4) などのように開始するかによって違いがあるかどうかです。 .
違いがある場合: どちらが最速ですか?
はい、違いがあります。
(256,1) は、X 次元に 256 スレッドの (1D) ブロックを作成し、そのすべての y インデックスは 0 です。
(128,2) は、128x2 スレッドの (2D) ブロックを作成します。x 次元で 128、y 次元で 2。これらのスレッドは、0 から 127 の範囲の x-index と 0 から 1 の範囲の y-index を持ちます。
カーネル コードの構造は、スレッドのインデックス付け/番号付けを理解する必要があります。
たとえば、カーネルコードが次のようなもので始まる場合:
int idx=threadIdx.x+blockDim.x*blockIdx.x;
他のインデックス変数を作成しません。おそらく、1D スレッドブロックと 1D グリッドを想定しています。
一方、カーネルコードが次のようなもので始まる場合:
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int idy = threadIdx.y+blockDim.y*blockIdx.y;
おそらく、2D グリッドと 2D スレッドブロックが必要です。
一般的に言えば、2 つのアプローチは互換性がありません。つまり、1D グリッドと 2D グリッドを期待するカーネルを起動して、すべてが正常に動作することを期待することはできません。また、その逆も成り立ちません。