在OpenMP中产生其他线程/任务

时间:2011-10-03 13:06:32

标签: c++ cuda openmp

我想使用OpenMP和CUDA来实现重叠的内核执行。内核调用都是异步的,但我在启动之间只有很少的代码,所以各个OpenMP线程在尝试启动另一个内核时会阻塞,或者做一个mem copy(我在调用之后不会总是有mem copys) async mem copys不一定是解决方案)。我想要一种方法来向OpenMP调度程序发送信号以切换到另一个OpenMP线程。这在OpenMP中是否可行?

示例:

int main() {
   #pragma omp parallel for
   for(int i=0;i<10;i++) {
       for(int j=0;j<10;j++) {
           //call kernel here

           // ---->   Would like to signal to continue with other  
           //           threads as next call will block

           //copy data from kernel
       }
   }
}

1 个答案:

答案 0 :(得分:0)

如果一个线程阻塞,操作系统的调度程序应该自动切换到另一个可运行的线程(如果有的话),所以你不需要做任何事情。

但是,如果您的所有OpenMP程序都在调用CUDA内核,那么GPU很可能是瓶颈,因此无论如何都不会从CPU上使用线程中获得太多好处。根本不值得使用OpenMP。

但是,如果继续使用OpenMP,则应该向collapse(2)添加omp parallel for