cudaMemcpy D2D 标志 - 语义 w.r.t。多个设备,有必要吗?
cudaMemcpy D2D flag - semantics w.r.t. multiple devices, and is it necessary?
我以前不需要在 2 个 GPU 之间 memcpy 数据。现在,我猜我要用 cudaMemcpy()
和 cudaMemcpyDeviceToDevice
标志来做,但是:
cudaMemcpyDeviceToDevice
标志是否用于在单个设备的内存 space 和所有设备的内存 space 之间复制数据?
如果是,
- 如何区分不同设备上指向内存的指针?它是否使用了 Unified Virtual Address Space 机制的细节?
如果是这样的话,那么
- 为什么 cudaMemcpy 甚至有 H2D、D2H、D2D 标志?它不需要检查它需要寻址的设备吗?
- 我们不能使用来自 CUDA 低级驱动程序的
cuGetPointerAttribute()
实现无标志版本的 cudaMemcpy 吗?
对于启用 UVA 的设备,您可以使用您描述的机制。 This doc section may be of interest (both the one describing device-to-device transfers as well as the subsequent section on UVA implications). Otherwise there is a cudaMemcpyPeer()
API 可用,语义略有不同。
How are pointers to memory on different devices distinguished? Is it using the specifics of the Unified Virtual Address Space mechanism?
是的,请参阅之前引用的文档部分。
Why even have the H2D, D2H, D2D flags at all for cudaMemcpy? Doesn't it need to check which device it needs to address anyway?
cudaMemcpyDefault
是 UVA 首次出现时添加的传输标志,以允许使用一般标记的传输,其中方向由运行时在检查提供的指针时推断。
Can't we implement a flag-free version of cudaMemcpy using cuGetPointerAttribute() from the CUDA low-level driver?
我假设上述一般标记的方法可以满足您的任何需求(或者我可能不理解这个问题)。
这样的讨论可能会引发问题 "Why would I ever use anything but cudaMemcpyDefault
"?
我能想到使用显式标志的一个可能原因是,如果您提供显式标志,运行时 API 将进行显式错误检查。例如,如果您确定 cudaMemcpy
的给定调用将始终处于 H2D 传输方向,则显式使用 cudaMemcpyHostToDevice
将导致运行时 API 抛出错误提供的指针与指示的方向不匹配。你是否重视这样的概念可能是一个见仁见智的问题。
作为次要问题 (IMO),使用显式标志的代码不依赖于 UVA 是否可用,但此类执行场景 "disappearing" 具有较新的环境
我以前不需要在 2 个 GPU 之间 memcpy 数据。现在,我猜我要用 cudaMemcpy()
和 cudaMemcpyDeviceToDevice
标志来做,但是:
cudaMemcpyDeviceToDevice
标志是否用于在单个设备的内存 space 和所有设备的内存 space 之间复制数据?
如果是,
- 如何区分不同设备上指向内存的指针?它是否使用了 Unified Virtual Address Space 机制的细节?
如果是这样的话,那么
- 为什么 cudaMemcpy 甚至有 H2D、D2H、D2D 标志?它不需要检查它需要寻址的设备吗?
- 我们不能使用来自 CUDA 低级驱动程序的
cuGetPointerAttribute()
实现无标志版本的 cudaMemcpy 吗?
对于启用 UVA 的设备,您可以使用您描述的机制。 This doc section may be of interest (both the one describing device-to-device transfers as well as the subsequent section on UVA implications). Otherwise there is a cudaMemcpyPeer()
API 可用,语义略有不同。
How are pointers to memory on different devices distinguished? Is it using the specifics of the Unified Virtual Address Space mechanism?
是的,请参阅之前引用的文档部分。
Why even have the H2D, D2H, D2D flags at all for cudaMemcpy? Doesn't it need to check which device it needs to address anyway?
cudaMemcpyDefault
是 UVA 首次出现时添加的传输标志,以允许使用一般标记的传输,其中方向由运行时在检查提供的指针时推断。
Can't we implement a flag-free version of cudaMemcpy using cuGetPointerAttribute() from the CUDA low-level driver?
我假设上述一般标记的方法可以满足您的任何需求(或者我可能不理解这个问题)。
这样的讨论可能会引发问题 "Why would I ever use anything but cudaMemcpyDefault
"?
我能想到使用显式标志的一个可能原因是,如果您提供显式标志,运行时 API 将进行显式错误检查。例如,如果您确定
cudaMemcpy
的给定调用将始终处于 H2D 传输方向,则显式使用cudaMemcpyHostToDevice
将导致运行时 API 抛出错误提供的指针与指示的方向不匹配。你是否重视这样的概念可能是一个见仁见智的问题。作为次要问题 (IMO),使用显式标志的代码不依赖于 UVA 是否可用,但此类执行场景 "disappearing" 具有较新的环境