我想使用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
}
}
}
答案 0 :(得分:0)
如果一个线程阻塞,操作系统的调度程序应该自动切换到另一个可运行的线程(如果有的话),所以你不需要做任何事情。
但是,如果您的所有OpenMP程序都在调用CUDA内核,那么GPU很可能是瓶颈,因此无论如何都不会从CPU上使用线程中获得太多好处。根本不值得使用OpenMP。
但是,如果继续使用OpenMP,则应该向collapse(2)
添加omp parallel for
。