假设我有一个带有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 .. ]
我希望您能看到这可能会如何影响合并:对于每个变体,都会有一种特定的最佳方式来访问我的设备内存缓冲区。
不幸的是,我还没有找到关于此的任何详细信息..
答案 0 :(得分:3)
水平和垂直是任意的。但是线程确实有明确定义的x,y和z维度。线程按x,y,z的顺序分组为warp。因此,在第一个32线程warp中,16x16线程块将按以下顺序包含线程:
warp lane:线程ID(x,y,z)