1

假设我有一个带有 2D 网格的内核调用,如下所示:

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

现在我读到多维网格仅仅是为了简化编程——底层硬件只会使用一维线性缓存内存(除非你使用纹理内存,但这在这里不相关)。

我的问题是:在扭曲调度期间,线程将按什么顺序分配给网格索引?它们是水平分配(“迭代”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 的顺序分组到 warp 中。因此,一个 16x16 线程块将在第一个 32 线程扭曲中按以下顺序具有线程:

warp lane:线程 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 回答