0

我希望看到从 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),那么我将获得正确的索引。plz你能展示如何正确计算这种情况下的gridDim吗?如果可能的话,任意N.非常感谢!

4

1 回答 1

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 网格计算您的 1D 索引。

int i = i_y * pitch + i_x;
于 2012-07-29T08:45:05.667 回答