对于具有有效 UVA 的设备,您可以使用您描述的机制。 这个文档部分可能很有趣(描述设备到设备传输的部分以及关于 UVA 影响的后续部分)。否则有一个cudaMemcpyPeer()
API可用,它有一些不同的语义。
如何区分不同设备上的内存指针?它是否使用统一虚拟地址空间机制的细节?
是的,请参阅之前引用的文档部分。
为什么 cudaMemcpy 甚至有 H2D、D2H、D2D 标志?它不需要检查它需要寻址的设备吗?
cudaMemcpyDefault
是在 UVA 首次出现时添加的传输标志,以启用通用标志传输,其中方向由运行时在检查提供的指针时推断。
我们不能使用 CUDA 低级驱动程序中的 cuGetPointerAttribute() 实现无标志版本的 cudaMemcpy 吗?
我假设上面描述的通用标记方法可以满足您的任何需求(或者我可能不理解这个问题)。
这样的讨论可能会产生一个问题“我为什么要使用任何东西,除了cudaMemcpyDefault
”?
我能想到使用显式标志的一个可能原因是,如果您提供显式标志,运行时 API 将进行显式错误检查。例如,如果您确定给定的调用cudaMemcpy
总是在 H2D 传输方向,那么cudaMemcpyHostToDevice
如果提供的指针与指示的方向不匹配,显式使用将导致运行时 API 引发错误。你是否对这样的概念赋予任何价值可能是一个见仁见智的问题。
作为次要重要性 (IMO) 代码,使用显式标志不依赖于 UVA 是否可用,但这种执行场景在较新的环境中“消失”