首页 > 解决方案 > 您是否需要分配内存才能在 CUDA 中对数组进行操作?

问题描述

我见过 CUDA 程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示:

float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);

但后来我也看到了 CUDA 程序仅在其引用被传递给它的内存上运行的代码,如下所示:

__global__ void cuda_function(int* a)
{
  ...<operate on a>...
}

int main()
{
  cuda_function<<<N/256, 256>>>(a)
}

这两种方法有什么不同?

谢谢!

标签: cparallel-processingcuda

解决方案


无论如何,您都必须在设备上分配内存。您可以使用类似的东西自己直接管理内存cudaMalloc,或者允许使用cudaMallocManaged.

在第一种方法中,您必须使用cudaMemcpy. 然后,您将指向设备内存的指针(由 给您cudaMalloc)作为参数传递给内核。

第二种方法使用统一内存,您不必手动将数据移入或移出 GPU。当它被访问时,它将被分页到 GPU 或从 GPU(并发访问有一些细微差别,但这是另一次讨论)。您仍然需要向内核传递一个指向使用cudaMallocManaged.

我不知道只将指针传递给内核并操作支持数据。

希望这可以帮助!


推荐阅读