多个线程访问相同的cuda流

时间:2019-09-03 16:10:54

标签: c++ cuda gpu

我正在编写一个混合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);
});

1 个答案:

答案 0 :(得分:2)

多个主机线程访问并使用同一流是合法的。

但是,CUDA中没有任何东西可以保证针对不同线程的操作顺序。因此,对于此处讨论的流,此序列是可能的:

begin_t1,kernel,end_t1,begin_t2,kernel,end_t2

但这也是可行的:

begin_t1,begin_t2,kernel,kernel,end_t1,end_t2

如果要在线程之间强制执行排序,则需要使用所使用的线程系统提供的机制来实现。