与CUDA并行传输阵列

Transfer Array in Parallel with CUDA

本文关键字:阵列 并行传输 CUDA      更新时间:2023-10-16

我在CUDA C中编写了一些非常简单的GPU代码,将数组nums复制到数组vals中。Nums为[4,7,1,9,2]。这就是我想要复制每个元素的方式:

__global__ void makeArray(int*);
int main()
{
  int* d_nums;
  int nums[5];
  nums[0] = 4;
  nums[1] = 7;
  nums[2] = 1;
  nums[3] = 9;
  nums[4] = 2;
  cudaMalloc(&d_nums, sizeof(int)*5);
  makeArray<<<2,16>>>(d_nums);
  cudaMemcpy(nums, d_nums, sizeof(int)*5, cudaMemcpyDeviceToHost);
  for (int i = 0; i < 5; i++)
    cout << i << " " << nums[i] << endl;
  return 0;
}
__global__ void makeArray(int* nums)
{
  int vals[5];
  int threadIndex = blockIdx.x * blockDim.x + threadIdx.x;
  vals[threadIndex%5] = nums[threadIndex%5];
  __syncthreads();
  if (threadIndex < 5)
    nums[threadIndex] = vals[threadIndex];
}

从长远来看,我想使用这种方法将数组从CPU传输到GPU共享内存,但我甚至不能让这个简单的实践文件工作。我希望输出看起来像这样:

0 4
1 7
2 1
3 9
4 2

但是我得到了这个:

0 219545856
1 219546112
2 219546368
3 219546624
4 219546880

我的想法是,通过使用线程索引的模数,它大于这个数组中的元素数量,我可以覆盖所有5个数据点,而不用担心过度读取数组。我也可以同时分配每个数组点,每个线程一个,然后在最后__syncthreads()以确保每个线程都完成复制。显然,这不起作用。的帮助!

编辑后,我们可以看到d_nums指向未初始化的内存。你只是分配了它,没有填充任何东西。如果你想让GPU访问数据,你必须复制它:

cudaMemcpy(d_nums, nums, sizeof(nums), cudaMemcpyHostToDevice);

之前运行内核