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

インデックス作成パターンが間違っています。まず、インデックス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;
于 2012-07-29T08:45:05.667 に答える