如何在C++ openmp上编写重用线程的代码?

use*_*424 1 c++ multithreading openmp

我有一个函数f ,我可以使用并行处理.为此,我使用了openmp.但是,多次调用此函数,似乎每次调用都会创建线程.

我们如何重用线程?

void f(X &src, Y &dest) {
   ... // do processing based on "src"
   #pragma omp parallel for
   for (...) { 

   }
   ...// put output into "dest" 
}

int main() {
    ...
    for(...) { // It is impossible to make this loop processing parallel one.
       f(...);
    }
    ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ton 5

OpenMP在内部实现线程池,它尝试重用线程,除非您在其间更改某些设置或使用不同的应用程序线程调用并行区域,而其他线程仍处于活动状态.

通过使用线程本地,可以验证线程确实是相同的.我建议您验证关于重新创建线程的声明.OpenMP运行时除了明显的线程池概念之外还进行了许多智能优化,您只需要知道如何正确地调整和控制它.

虽然不可能重新创建线程,但是当您再次调用并行区域时,很容易看到线程如何进入休眠状态,并且需要花费大量时间将其唤醒.您可以通过使用OMP_WAIT_POLICY=active和/或特定KMP_BLOCKTIME=infinite于实现的环境变量(对于Intel/LLVM运行时)来阻止线程进入休眠状态.