将设备设置为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);
答案 0 :(得分:2)
如果您在支持unified virtual addressing的平台上运行,则所有设备上的所有分配都映射到单个地址空间,并且API知道给定地址所在的物理设备。因此,cudaMemcpyDeviceToHost
似乎可以正常工作,因为这种指针分辨率无需显式选择设备。
我是否必须再次将设备设置为1?
理论上,是的,你应该。您隐含地依赖于某些并非所有平台都支持的东西(尚未)。或者,您应该完全接受统一内存,使用cudaMemcpyDefault
并让API处理细节。但是拥抱统一内存意味着您的代码无法在某些系统上运行。这实际上取决于您所编写的代码的目标。