【发布时间】:2012-12-24 19:38:33
【问题描述】:
假设我有一个带有 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 .. ]
我希望您能看到这可能如何影响合并:对于每个变体,都会有一种特定的最佳方式来访问我的设备内存缓冲区。
很遗憾,我还没有找到任何有关此的详细信息..
【问题讨论】:
-
阅读 CUDA C 编程指南第 2.2 节,线程层次结构。