CUDA 2D阻止y维度未按预期更改

时间:2017-11-09 09:35:32

标签: cuda gpgpu

我尝试构建一个2D块,并将所有x,y存储在一个二维数组中并将其转回主机。我的代码是:

#include <iostream>

#define N 95

__global__ void add(int *ch) {
  int idx = (blockIdx.x * N) + (blockIdx.y * 2);
  *(ch + idx) = blockIdx.x;
  *(ch + ++idx) = blockIdx.y;
}
int main(void) {

  int h_ch[N*N][2];
  int *dev_ch;

  cudaMalloc((void**)&dev_ch, sizeof(int[N*N][2]));

  dim3 numBlocks(N,N);


  add << <numBlocks, 1 >> > (dev_ch);

  cudaMemcpy(h_ch, dev_ch, sizeof(int[N*N][2]), cudaMemcpyDeviceToHost);

  for (int i = 0; i < N*N; i++) {
    printf("%d-%d\n", h_ch[i][0], h_ch[i][1]);
  }

  cudaFree(dev_ch);

  return 0;
}

据我所知,结果应该从0-0开始,最后到94-94,输出应该是95 * 95 = 9025行,但是,我只有大约4500行。 我改变了我的代码,看看x,y是如何改变的,x在0到94之间变化,并且每个数字按预期重复94次。 但是,y从51开始,最后到94,每个数字循环94次。你有什么问题?不应该像x一样变化吗?

1 个答案:

答案 0 :(得分:2)

内核中的索引计算不正确。它应该是这样的:

__global__ void add(int *ch) {
  int idx = (blockIdx.x * 2 * N) + 2 * blockIdx.y;
  *(ch + idx) = blockIdx.x;
  *(ch + ++idx) = blockIdx.y;
}