正确计算CUDA内核的gridDim

时间:2012-07-29 08:36:27

标签: cuda

我希望看到从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.非常感谢!

1 个答案:

答案 0 :(得分:1)

您的索引模式错误。 首先,您应该按xy维度计算索引。

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;