假设我有一个带有 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 .. ]
我希望您能看到这可能如何影响合并:对于每个变体,都会有一种特定的最佳方式来访问我的设备内存缓冲区。
不幸的是,我还没有找到任何有关此的详细信息..