CUDA:2D网格中的线程ID分配

时间:2013-01-10 12:05:20

标签: c++ cuda gpgpu nvidia

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

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

现在我已经读过多维网格只是为了简化编程 - 底层硬件只会使用一维线性缓存(除非你使用纹理内存,但这里没有关系)。

我的问题是:在warp调度期间,线程将以什么顺序分配给网格索引?它们是水平分配的(“迭代”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 .. ]

我希望您能看到这可能会如何影响合并:对于每个变体,都会有一种特定的最佳方式来访问我的设备内存缓冲区。

不幸的是,我还没有找到关于此的任何详细信息..

1 个答案:

答案 0 :(得分:3)

水平和垂直是任意的。但是线程确实有明确定义的x,y和z维度。线程按x,y,z的顺序分组为warp。因此,在第一个32线程warp中,16x16线程块将按以下顺序包含线程:

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