正如问题所述,如果我有一个3D Grid of Blocks,那么为一个线程获取全局唯一索引的公式是什么?
让我们将块本身保持为一维。
答案 0 :(得分:6)
// unique block index inside a 3D block grid
const unsigned long long int blockId = blockIdx.x //1D
+ blockIdx.y * gridDim.x //2D
+ gridDim.x * gridDim.y * blockIdx.z; //3D
// global unique thread index, block dimension uses only x-coordinate
const unsigned long long int threadId = blockId * blockDim.x + threadIdx.x;
答案 1 :(得分:1)
派对有点晚了但是我通常以非常通用的方式处理这个问题,因为它支持任何数量和大小的块(甚至2D):
// Compute the offset in each dimension
const size_t offsetX = blockDim.x * blockIdx.x + threadIdx.x;
const size_t offsetY = blockDim.y * blockIdx.y + threadIdx.y;
const size_t offsetZ = blockDim.z * blockIdx.z + threadIdx.z;
// Make sure that you are not actually outs
if (offsetX >= sizeX || offsetY >= sizeY || offsetZ >= sizeZ)
return;
// Compute the linear index assuming that X,Y then Z memory ordering
const size_t idx = offsetZ * sizeX * sizeY + offsetY * sizeX + offsetX;
请注意,我不是CUDA忍者。
答案 2 :(得分:0)
@djmj的现有答案很好,但是经过重新格式化后,它变得更加清楚了(至少对我的大脑-这是CUDA的新手):
long blockId = blockIdx.z * gridDim.x*gridDim.y
+ blockIdx.y * gridDim.x
+ blockIdx.x;
long threadsPerBlock = blockDim.x;
long i = blockId * threadsPerBlock + threadIdx.x;
blockId
是 complete z
维度“切片”(二维网格)中的块的总和,加上 complete 中的块em>最终(不完整)切片的行,以及该(不完整)切片的最终(不完整)行中的块。
“完成”是指在当前(x,y,z)块之前(相对于我们求和它们以确定整体块ID的方式)的块。