假设我像下面这样声明线程和块:
dim3 threads_per_block(2,2,2);
dim3 blocks_per_grid(2,2,2);
MyKernel<<<blocks_per_grid, threads_per_block>>>(... ... ...);
网格中的线程和块是否编号如下?
如果没有,怎么办?
** 假设 GPU 只有一个网格。
因此,如果我们想得到线程#36的(x, y, z)坐标,我们可以这样计算:
int x = blockIdx.x * blockDim.x + threadIdx.x = 1 * 2 + 1 = 3
int y = blockIdx.y * blockDim.y + threadIdx.y = 0 * 2 + 0 = 0
int z = blockIdx.z * blockDim.z + threadIdx.z = 0 * 2 + 0 = 0
正确吗?
你的眼光是正确的。
考虑到您的问题,我强烈推荐 David B. Kirk 和 Wen-mei W. Hwu 合着的《Programming Massively Parallel Processors》一书。它详细介绍了您的大部分主题。