使用 CUDA SDK 5.5,我可以用来复制数据:
- 从主机:
cudaMemcpy();
如果内存固定,则使用 GPU-DMA - 来自主机:
memcpy();
或者cudaMemcpy();
如果内存没有固定,则使用 CPU 内核 - 来自 gpu:
for() { dst[i] = src[i]; }
或memcpy();
使用 GPU 核心 - 来自 gpu:使用 GPU-DMA ???
如何在GPU-CUDA 代码的内核函数中使用 GPU-DMA 来复制数据?
使用 CUDA SDK 5.5,我可以用来复制数据:
cudaMemcpy();
如果内存固定,则使用 GPU-DMAmemcpy();
或者cudaMemcpy();
如果内存没有固定,则使用 CPU 内核for() { dst[i] = src[i]; }
或memcpy();
使用 GPU 核心如何在GPU-CUDA 代码的内核函数中使用 GPU-DMA 来复制数据?
如果它不支持计算能力 3.5,那么您尝试做的事情从设备端是不可能的。如果您有这样的卡,请参阅编辑。
是的,您可以通过将另一个设备上分配的设备指针传递给您的内核来从另一个设备访问 GPU RAM。执行运行时会将请求的数据提供到正确的 GPU 上。但是,这不是很有效,因为每次访问另一个设备的内存都会导致对等或设备-主机-设备的 memcopy 操作。
您可以做的是从您的主机代码中执行预取数据,并为您的 memcopy 操作 ( cudaMemcpy_async
) 和内核执行使用不同的流。然而,这只有在你有一张像样的卡和一个单独的副本单元并且你必须进行显式锁定时才有效,因为在数据传输完成之前没有内置结构可以保存你的内核。
编辑:
如果您有计算能力为 3.5 的设备,则可以使用 cuda 设备运行时在设备代码中从设备到设备进行内存复制。请参阅此处的动态并行文档:http: //docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf请注意,设备上的所有 memcopy 操作也是异步的。您将不得不自己再次保持数据的一致性。