CUDA 1d 输入数组和 2d 输出数组

CUDA 1d input array with 2d output array

提问人:Predrag Stojadinović 提问时间:11/14/2023 最后编辑:BartPredrag Stojadinović 更新时间:11/15/2023 访问量:49

问:

基本上,我需要向下查看一个 1D 整数列表(我甚至可以用于此),并且对于每次返回 5 个值的数组,然后将该数组放入 - 换句话说,我需要使用 1D 输入数组来生成 2D 输出数组 并且已经工作正常 - 这更多是关于如何分配 2D 数组并正确启动内核以用于具有 1D 输出的 2D 输入:(int i = blockIdx.x*blockDim.x + threadIdx.x;idoTheMagic(i)y[i]doTheMagic

我一直在研究这个例子:https://developer.nvidia.com/blog/easy-introduction-cuda-c-and-c/,当我设置为只返回第一个值而不是整个数组时,一切都很顺利:doTheMagic

__global__
void myKernel(int n, long long a, long long *x, long long *y) {
  long long i = blockIdx.x*blockDim.x + threadIdx.x;
  if (i < n) y[i] = doTheMagic(i);
}

int main(void) {
  int N = 1<<20;
  long long *x, *y, *d_x, *d_y;
  x = (long long*)malloc(N*sizeof(long long));
  y = (long long*)malloc(N*sizeof(long long));

  cudaMalloc(&d_x, N*sizeof(long long));
  cudaMalloc(&d_y, N*sizeof(long long));

  cudaMemcpy(d_x, x, N*sizeof(long long), cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, y, N*sizeof(long long), cudaMemcpyHostToDevice);

  myKernel<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);

  cudaMemcpy(y, d_y, N*sizeof(long long), cudaMemcpyDeviceToHost);

  for (int i = 0; i < 64; i++) {
    printf("y[%d]: %lld\n", i, y[i]);
  }

  cudaFree(d_x);
  cudaFree(d_y);
  free(x);
  free(y);
}

但是,我不知道如何返回数组而不是单个值?

C++ CUDA

评论

2赞 Abator Abetor 11/14/2023
你可以返回一个包含 5 个元素数组的结构体;doTheMagic
3赞 Robert Crovella 11/14/2023
让每个线程填充数组中的 5 个相邻元素是 GPU 上典型的错误访问模式。如果没有完整的测试用例,就不可能知道从性能的角度来看它是否重要 - 你没有提供。除了这个考虑之外,我想说,任何基于你在 C++ 中如何做到这一点来吸引你的方法,在 CUDA C++ 中都可能以非常相似的方式工作。从这个角度来看,上述建议在我看来是明智的。
1赞 paleonix 11/14/2023
libcu++ 包括 C++23 的(未记录的)实现,非常适合处理到底层 1D 内存区域的 2D 索引。例如,请参阅如何在主机上构造和访问 libcu++ <cuda/std/mdspan>mdrange

答: 暂无答案