2012-07-29 54 views
0

我預期從0.0看號碼999.0而是得到一些很奇怪,長數一些指數下面的代碼:正確計算gridDim用於CUDA內核

__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

您的索引模式是錯誤的。 首先,您應該計算索引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網格的1D指數。

int i = i_y * pitch + i_x;