我见过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)
}
这两种方法有什么不同?
谢谢!
无论如何,您必须在设备上分配内存。你可以自己直接管理内存,使用像cudaMalloc
这样的东西,或者允许使用cudaMallocManaged
为你管理内存。
在第一种方法中,您必须使用cudaMemcpy
将内存复制到设备和从设备复制内存。然后,将内核指针传递给设备内存(由cudaMalloc
提供)作为参数。
第二种方法使用统一内存,您不必手动将数据移入或移出GPU。当它被访问时,它将被分页到GPU或GPU(有一些并发访问的细微差别,但这是另一次的讨论)。您仍然需要向内核传递指向使用cudaMallocManaged
分配的托管内存块的指针。
我不知道只是将指针传递给内核并对后备数据进行操作。
希望这可以帮助!