您是否需要分配内存才能在CUDA中的阵列上运行?

时间:2019-04-02 23:15:49

标签: c parallel-processing 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)
}

这两种方法有什么区别?

谢谢!

1 个答案:

答案 0 :(得分:1)

无论如何,您都必须在设备上分配内存。您可以使用cudaMalloc之类的东西直接自己管理内存,也可以使用cudaMallocManaged对其进行管理。

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

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

我没有办法知道仅将一个指针传递给内核并对备份数据进行操作。

希望这会有所帮助!