我之前没有需要在2个GPU之间记忆数据。现在,我猜我会用cudaMemcpy()
和cudaMemcpyDeviceToDevice
标志来做,但是:
cudaMemcpyDeviceToDevice
标志吗?如果是,
如果是这样,那么
cuGetPointerAttribute()
来实现cudaMemcpy的无标记版本吗?答案 0 :(得分:2)
对于具有UVA效果的设备,您可以使用您描述的机制。 This doc section可能是有意义的(包括描述设备到设备传输的那个以及关于UVA影响的后续部分)。否则,有一个cudaMemcpyPeer()
API可用,它有一些不同的语义。
如何区分不同设备上的内存指针?它是否使用统一虚拟地址空间机制的细节?
是的,请参阅之前引用的文档部分。
为什么甚至为cudaMemcpy提供H2D,D2H,D2D标志?是否需要检查它需要解决哪个设备?
cudaMemcpyDefault
是在UVA首次出现时添加的传输标志,用于启用通用标记传输,其中方向由运行时在检查提供的指针时推断。
我们不能使用CUDA低级驱动程序中的cuGetPointerAttribute()来实现cudaMemcpy的无标记版本吗?
我假设上面描述的通用标记方法可以满足您的任何需求(或者我可能不理解这个问题)。
这样的讨论可能引发一个问题“为什么我会使用cudaMemcpyDefault
以外的任何东西”?
我可以想到使用显式标志的一个可能原因是,如果提供显式标志,运行时API将执行显式错误检查。例如,如果您确定给定的cudaMemcpy
调用始终处于H2D传输方向,那么显式使用cudaMemcpyHostToDevice
将导致运行时API在提供的指针不出现时抛出错误匹配指示的方向。你是否对这样的概念附加任何价值可能是一个意见问题。
作为一个不太重要的问题(IMO),使用显式标志的代码不依赖于UVA可用,但这种执行方案在新环境中“消失”