我想将 OpenMP 与 CUDA 结合使用以实现重叠内核执行。内核调用都是异步的,但我在启动之间的代码很少,因此各个 OpenMP 线程在尝试启动另一个内核或进行内存复制时往往会阻塞(我并不总是在调用后立即拥有内存拷贝,所以异步内存拷贝不一定是解决方案)。我想要一种向 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
}
}
}
最佳答案
如果一个线程阻塞,操作系统的调度程序应该自动切换到另一个可运行的线程(如果有的话),所以您不需要做任何事情。
但是,如果您的所有 OpenMP 程序都在调用 CUDA 内核,那么 GPU 很可能是瓶颈,因此您无论如何都不会从在 CPU 上使用线程获得太多好处。可能根本不值得使用 OpenMP。
不过,如果您继续使用 OpenMP,您可能应该向那个 omp parallel for
添加一个 collapse(2)
。
关于c++ - 屈服于 OpenMP 中的其他线程/任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635390/