2013-10-08 72 views
2

随着CUDA SDK 5.5,我可以用它来复制数据:从主机如何使用GPU-CUDA代码中的GPU-DMA来复制数据?

  • cudaMemcpy();使用GPU-DMA如果内存固定在主机
  • memcpy();cudaMemcpy();使用CPU内核,如果内存不固定
  • from gpu:for() { dst[i] = src[i]; }memcpy();使用GPU核心
  • from gpu:使用GPU-DMA?

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

+0

究竟是什么问题了吗?从另一个GPU访问一个GPU的内存空间?在这种情况下,您可以使用点对点(P2P)GPU \t内存副本,查看simpleP2P SDK CUDA示例。在 – JackOLantern

+0

如果您的系统支持UVA,那么您可以在内核函数(如dst [i] = src [i];')内从另一个GPU处理一个GPU内存空间。 – JackOLantern

回答

3

你所试图做的是如此不从设备侧可能的,如果它不支持计算能力3.5。如果你有这样的卡片,请参阅编辑。

是你可以通过另一台设备到内核上分配的设备指针从其他设备访问GPU内存。执行运行时会将请求的数据提供给正确的GPU。但是,这不是非常有效,因为每次访问另一个设备内存都会导致memcopy操作,无论是对等设备还是设备主机设备。

你可以做的是从你的宿主代码中执行预取数据,并为你的memcopy操作(cudaMemcpy_async)和内核执行使用不同的流。然而,只有当你拥有一张带有一个分离的拷贝单元的体面卡时,这种方法才有效,并且你必须进行显式锁定,因为在数据传输完成之前,没有内部结构会保存你的内核。

编辑:

如果您有您可以在设备代码中使用CUDA设备运行时间从存储器复制设备到设备在计算capbility 3.5设备。请参阅此处的动态并行性文档:http://docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf请注意,设备上的所有memcopy操作也是异步的。而且你会高兴地再次保持自己的数据一致性。

+0

谢谢!通过功能是否GPU向上'的memcpy()'使用DMA,或只是简单地创建一个单独的流中,它确实异步拷贝:对于()DST [I] = SRC [i]于';'? – Alex

+1

这个文档并没有真正的清楚。我认为你必须做一些分析,看你是否在你的内核代码中调用cudaMemcpyAsync时调用对等memcopies。最有可能的对等访问必须首先通过主机代码启用。 –

相关问题