我见过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)
}
这两种方法有什么区别?
谢谢!
答案 0 :(得分:1)
无论如何,您都必须在设备上分配内存。您可以使用cudaMalloc
之类的东西直接自己管理内存,也可以使用cudaMallocManaged
对其进行管理。
在第一种方法中,必须使用cudaMemcpy
在设备之间复制内存。然后,您将指向设备内存的指针(由cudaMalloc
给您)作为参数传递给内核。
第二种方法使用统一内存,您不必手动将数据移入或移出GPU。当访问它时,它将被分页到GPU或从GPU分页(并发访问有些细微差别,但这是另一次讨论)。您仍然需要将指向cudaMallocManaged
分配的托管内存的指针传递给内核。
我没有办法知道仅将一个指针传递给内核并对备份数据进行操作。
希望这会有所帮助!