当cudaMemcpy'时,我是否必须设置正确的设备?从设备到主机?

时间:2017-08-29 06:50:27

标签: cuda

将设备设置为1时,以及在复制“ptr”之前,ptr是malloced。 to' 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);

1 个答案:

答案 0 :(得分:2)

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

  

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

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