当“cudaMemcpy”从设备到主机时,我是不是必须设置正确的设备?

Posted

技术标签:

【中文标题】当“cudaMemcpy”从设备到主机时,我是不是必须设置正确的设备?【英文标题】:Do I have to set the proper device when 'cudaMemcpy' from device to host?当“cudaMemcpy”从设备到主机时,我是否必须设置正确的设备? 【发布时间】:2018-02-06 12:29:59 【问题描述】:

将设备设置为1时会分配ptr,并且在将'ptr'从设备复制到'host_ptr'之前,我是否必须再次将设备设置为1?

cudaSetDevice(1);
cudaMalloc(ptr, size);

//do something here
...

cudaSetDevice(0);

//do something here
...
//cudaSetDevice(1); #My qustion: is this line needed?

cudaMemcpy(host_ptr, ptr, size, cudaMemcpyDeviceToHost);

【问题讨论】:

@Shadow 我都测试过,一切正常。所以我很困惑 【参考方案1】:

如果您在支持unified virtual addressing 的平台上运行,则所有设备上的所有分配都映射到一个地址空间,并且 API 知道给定地址所在的物理设备。因此,cudaMemcpyDeviceToHost 似乎可以正常工作,因为这种指针分辨率无需显式选择设备。

我必须再次将设备设置为 1 吗?

理论上,是的,您应该这样做。您隐含地依赖于所有平台(还)不一定支持的东西。或者,您应该完全接受统一内存,使用cudaMemcpyDefault 并让 API 处理细节。但是采用统一内存意味着您的代码无法在某些系统上运行。这实际上取决于您编写代码的目标。

【讨论】:

以上是关于当“cudaMemcpy”从设备到主机时,我是不是必须设置正确的设备?的主要内容,如果未能解决你的问题,请参考以下文章

cudaMemcpy 仍然无法托管设备分配的内存?

CUDA-将二维数组从主机传输到设备

cudaMemcpy 无效参数

当 CPU 尝试读取由 GPU 初始化的托管内存时,为啥数据会从主机迁移到设备?

CUDAMemcpy 对我来说毫无意义......为啥我要在普通 C++ 中指定设备内存?

CUDA信号给主持人