如何在 GPU-CUDA 代码中使用 GPU-DMA 来复制数据?

Ale*_*lex 5 c++ cuda gpgpu dma

使用 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 来复制数据?

Mic*_*idl 4

如果设备不支持计算能力 3.5,那么您尝试做的事情是不可能从设备端实现的。如果您有这样的卡,请参阅编辑。

是的,您可以通过将另一个设备上分配的设备指针传递给内核来从另一个设备访问 GPU RAM。然后执行运行时会将请求的数据提供到正确的 GPU 上。然而,这并不是很有效,因为对另一个设备内存的每次访问都会导致点对点或设备-主机-设备的内存复制操作。

您可以做的是从主机代码中执行预取数据,并为 memcopy 操作 ( cudaMemcpy_async) 和内核执行使用不同的流。然而,只有当你有一张像样的卡和一个单独的复制单元,并且你必须进行显式锁定时,这才有效,因为没有内置结构可以保存你的内核,直到数据传输完成。

编辑:

如果您有计算能力 3.5 设备,则可以使用 cuda 设备运行时在设备代码中从设备到设备进行内存复制。请参阅此处的动态并行性文档:http://docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf请注意,设备上的所有内存复制操作也是异步的。您将再次努力自行保持数据一致性。