当“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”从设备到主机时,我是不是必须设置正确的设备?的主要内容,如果未能解决你的问题,请参考以下文章
当 CPU 尝试读取由 GPU 初始化的托管内存时,为啥数据会从主机迁移到设备?