关于Open MP和cudaSetDevice()

3

有人知道下面的cudaSetDevice使用是否正确吗?我希望在任何主机线程的任何时候重复调用在不同设备上创建的资源,有没有一种在CUDA中实现这个功能的方法?

 cudaSetDevice(0);
 /...create cuda streams and do some memory allocation on gpu.../
 cudaSetDevice(1);
 /...create cuda streams and do some memory allocation on gpu.../
 #pragma omp parallel num_threads(2)
 { 
   int omp_threadID=omp_get_thread_num();
    ....
   if (omp_threadID==0)
   {
    cudaSetDevice(0);
    /...calling streams/memory created on device 0.../
   }
   else
   {
    cudaSetDevice(1);
    /...calling streams/memory created on device 1.../
    }; 
  };
1个回答

1

是的,这样的方法应该能够奏效。确保在设备0上创建的所有内容仅在OpenMP线程0中使用,在设备1和线程1中也是如此。

您还可以查看CUDA OpenMP示例代码,它演示了如何使用OpenMP线程来管理各个独立的设备。


谢谢,但您能解释一下为什么我必须在单个OMP线程中使用这些吗?我认为如果我可以确保OMP线程之间的同步,以便不超过一个线程在任何时候调用一个设备(并在那里执行某些操作),我可以自由地从任何线程调用任何适当时间的任何东西来使用cudaSetDevice()。 - user2188453
жҲ‘жғіжҢҮеҮәзҡ„жҳҜпјҢеңЁдҪ зҡ„дҫӢеӯҗдёӯпјҢOMPзәҝзЁӢ0зҡ„д»Јз Ғд»ҘcudaSetDevice(0);ејҖеӨҙпјҢеӣ жӯӨжӯӨж—¶дҪ еә”иҜҘеҸӘдҪҝз”Ёи®ҫеӨҮ0гҖӮеҗҢж ·пјҢеңЁзәҝзЁӢ1дёӯпјҢдҪ д»ҘcudaSetDevice(1);ејҖе§ӢпјҢжүҖд»ҘжӯӨж—¶дҪ еә”иҜҘеҸӘдҪҝз”Ёи®ҫеӨҮ1гҖӮиҝҷдёҺжҲ‘жҸҗеҲ°зҡ„зӨәдҫӢд»Јз Ғзҡ„е·ҘдҪңж–№ејҸдёҖиҮҙгҖӮ - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接