我希望看到从0.0到999.0的数字,但是对于以下代码的某些索引,却得到一些非常奇怪和长的数字:
__global__ void kernel(double *res, int N)
{
int i = (gridDim.y*blockIdx.y+
blockIdx.x)*blockDim.x*blockDim.y+
blockDim.y*threadIdx.y+threadIdx.x;
if(i<N) res[i] = i;
}
void callGPU(int N)
{
dim3 dimBlock(8, 8);
dim3 dimGrid(2, 8);
...
kernel<<<dimGrid, dimBlock>>>(res, N);
...
}
即使我将dimGrid更改为(8,2)和(1,16),但如果我将gridDim更改为(16,1),那么我的索引是正确的。你能说明如何在这种情况下正确计算gridDim吗?如果有可能任意N.非常感谢!
答案 0 :(得分:1)
您的索引模式错误。
首先,您应该按x
和y
维度计算索引。
int i_x = blockIdx.x * blockDim.x + threadIdx.x;
int i_y = blockIdx.y * blockDim.y + threadIdx.y;
然后你应该按x
维度
int pitch = gridDim.x * blockDim.x;
最后,您可以从2D网格计算一维索引。
int i = i_y * pitch + i_x;