我正在编写一个混合cpu-gpu程序,该程序需要多个cpu线程才能访问多个gpu。 CUDA流是线程安全的吗?具体来说,我想知道以下是否正确:
// two threads concurrently enter cuda device 1 and
// launch kernel on the same stream
std::thread t1([&](){
cudaSetDevice(1);
cudaEventRecord(begin_t1, stream);
kernel<<<mygrid, myblock, 0, stream>>>(...);
cudaEventRecord(end_t1, stream);
});
std::thread t2([&](){
cudaSetDevice(1);
cudaEventRecord(begin_t2, stream);
kernel<<<mygrid, myblock, 0, stream>>>(...);
cudaEventRecord(end_t2, stream);
});
答案 0 :(得分:2)
多个主机线程访问并使用同一流是合法的。
但是,CUDA中没有任何东西可以保证针对不同线程的操作顺序。因此,对于此处讨论的流,此序列是可能的:
begin_t1,kernel,end_t1,begin_t2,kernel,end_t2
但这也是可行的:
begin_t1,begin_t2,kernel,kernel,end_t1,end_t2
如果要在线程之间强制执行排序,则需要使用所使用的线程系统提供的机制来实现。