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

时间:2013-10-08 08:27:37

标签: 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来复制数据?

1 个答案:

答案 0 :(得分:4)

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

是的,您可以通过将在另一台设备上分配的设备指针传递给您的内核,从另一台设备访问GPU RAM。执行运行时将比正确的GPU提供所请求的数据。但是,这不是非常有效,因为每次访问另一个设备内存都会导致对等操作或设备主机设备进行memcopy操作。

您可以做的是从主机代码中执行预取数据,并为memcopy操作(cudaMemcpy_async)和内核执行使用不同的流。但是,只有当你有一个具有一个单独的复制单元的卡片并且你必须进行显式锁定时,这才有效,因为在数据传输完成之前,没有构建将保留内核的结构。

修改

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