【问题标题】: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 我都测试过,一切正常。所以我很困惑

标签: cuda


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2021-01-25
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多