1

次のように、2Dグリッドを使用したカーネル呼び出しがあるとします。

dim3 dimGrid(x, y); // not important what the actual values are
dim3 dimBlock(blockSize, blockSize);
myKernel <<< dimGrid, dimBlock >>>();

多次元グリッドはプログラミングを容易にすることだけを目的としていることを読みました。基盤となるハードウェアは、1D線形キャッシュメモリのみを使用します(テクスチャメモリを使用しない限り、ここでは関係ありません)。

私の質問は、ワープスケジューリング中にスレッドがグリッドインデックスに割り当てられる順序は何ですか?それらは水平方向(「反復」x、次にy)または垂直方向(「反復」y、次にx)に割り当てられますか?これは、カーネル内のメモリにアクセスする方法によっては、メモリの合体​​を改善するために関連する場合があります。

より明確にするために、以下が「水平」分布で私の(想像上の)グリッドに適用されたスレッドのIDを表すとしましょう:

[ 0  1  2  3 ]
[ 4  5  6  7 ]
[ 8  9 10 11 ]
[ ...        ]

そして、「垂直」分布は次のようになります。

[ 0  4  8 .. ]
[ 1  5  9 .. ]
[ 2  6 10 .. ]
[ 3  7 11 .. ]

これが合体にどのように影響するかを理解していただければ幸いです。各バリアントには、デバイスのメモリバッファにアクセスするための特定の最適な方法があります。

残念ながら、これに関する詳細な情報はまだ見つかりません。

4

1 に答える 1

3

水平方向と垂直方向は任意です。ただし、スレッドには明確に定義されたx、y、およびz次元があります。スレッドは、x、y、zの順序でワープにグループ化されます。したがって、16x16スレッドブロックには、最初の32スレッドワープで次の順序のスレッドが含まれます。

ワープレーン:スレッドID(x、y、z)

  • 0:0,0,0
  • 1:1,0,0
  • 2:2,0,0
  • 3:3,0,0
  • ..。
  • 15:15,0,0
  • 16:0,1,0
  • 17:1,1,0
  • 18:2,1,0
  • 19:3,1,0
  • ..。
  • 31:15,1,0
于 2013-01-10T12:38:48.580 に答える