2017-08-29 90 views
0

将设备设置为1时,以及将设备上的'ptr'复制到'host_ptr'之前,必须将设备重新设置为1,才能将ptr置入?当设备到主机'cudaMemcpy'时,我是否必须设置适当的设备?

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

@Shadow我测试了两个,所有的工作。所以我很困惑 –

回答

2

如果你支持unified virtual addressing的平台上运行,那么所有设备上的所有分配被映射到一个单一的地址空间,而API知道哪个物理设备给定的地址所在的。因此,看起来cudaMemcpyDeviceToHost因为这个指针分辨率而正确工作,而不需要明确地选择一个设备。

我必须将设备重新设置为1吗?

理论上,你应该。你隐式地依赖于所有平台上尚未支持的东西(尚未)。或者,您应该完全采用统一内存,使用cudaMemcpyDefault并让API处理细节。但是拥抱统一的内存意味着你的代码在某些系统上不能工作。这真的取决于你的目标是用你正在编写的代码。

相关问题