c++ - 屈服于 OpenMP 中的其他线程/任务

标签 c++ cuda openmp

我想将 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/

相关文章:

CUDA:加载/存储效率与全局内存指令重放之间的关系

parallel-processing - omp critical 和 omp single 之间的区别

c++ - OpenMP/C++ : number of elements in for-loop

methods - 求解线性方程组的并行迭代算法

c++ - 游戏逻辑的异步屏幕更新,C++

c++ - 链接器诊断 : "exe not found or not built by the last incremental link; performing full link", 为什么?

c - 如何在 Windows 上使用 CUDA 5 和 Glib 正确编译 64 位 C 应用程序?

c++ - 无法使用 CUDA + MATLAB + Visual Studio 检查全局内存

c++ - 在编译时使用未知类型的对象类

C++11 线程队列