cudaMemcpy D2D标志 - 语义w.r.t.多个设备,是否有必要?

时间:2016-02-01 11:40:57

标签: cuda gpgpu memcpy multi-gpu

我之前没有需要在2个GPU之间记忆数据。现在,我猜我会用cudaMemcpy()cudaMemcpyDeviceToDevice标志来做,但是:

  • 是用于在单个设备的内存空间内复制数据以及在所有设备的内存空间之间复制数据的cudaMemcpyDeviceToDevice标志吗?

如果是,

如果是这样,那么

  • 为什么甚至为cudaMemcpy提供H2D,D2H,D2D标志?是否需要检查它需要解决哪个设备?
  • 我们不能使用CUDA低级别驱动程序中的cuGetPointerAttribute()来实现cudaMemcpy的无标记版本吗?

1 个答案:

答案 0 :(得分:2)

对于具有UVA效果的设备,您可以使用您描述的机制。 This doc section可能是有意义的(包括描述设备到设备传输的那个以及关于UVA影响的后续部分)。否则,有一个cudaMemcpyPeer() API可用,它有一些不同的语义。

  

如何区分不同设备上的内存指针?它是否使用统一虚拟地址空间机制的细节?

是的,请参阅之前引用的文档部分。

  

为什么甚至为cudaMemcpy提供H2D,D2H,D2D标志?是否需要检查它需要解决哪个设备?

cudaMemcpyDefault是在UVA首次出现时添加的传输标志,用于启用通用标记传输,其中方向由运行时在检查提供的指针时推断。

  

我们不能使用CUDA低级驱动程序中的cuGetPointerAttribute()来实现cudaMemcpy的无标记版本吗?

我假设上面描述的通用标记方法可以满足您的任何需求(或者我可能不理解这个问题)。

这样的讨论可能引发一个问题“为什么我会使用cudaMemcpyDefault以外的任何东西”?

  1. 我可以想到使用显式标志的一个可能原因是,如果提供显式标志,运行时API将执行显式错误检查。例如,如果您确定给定的cudaMemcpy调用始终处于H2D传输方向,那么显式使用cudaMemcpyHostToDevice将导致运行时API在提供的指针不出现时抛出错误匹配指示的方向。你是否对这样的概念附加任何价值可能是一个意见问题。

  2. 作为一个不太重要的问题(IMO),使用显式标志的代码不依赖于UVA可用,但这种执行方案在新环境中“消失”