1

(py)CUDA のブロックとグリッドの寸法について質問を受けました。ブロックの合計サイズには制限があることは知っていますが、グリッドには制限がありません

また、実際のブロックサイズはランタイムに影響します。しかし、私が疑問に思っているのは、256 スレッドのブロックがある場合、(256,1) のように開始するか、(128,2) のように開始するか、(64,4) などのように開始するかによって違いがあるかどうかです。 .

違いがある場合: どちらが最速ですか?

4

1 に答える 1

3

はい、違いがあります。

(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 グリッドを期待するカーネルを起動して、すべてが正常に動作することを期待することはできません。また、その逆も成り立ちません。

于 2013-08-22T16:49:57.843 に答える