c++ - OpenMP 是否将已完成部分的重用线程用于另一个部分?

标签 c++ multithreading openmp

假设我有 OpenMP 设置来运行多个部分,如下所示:

#pragma omp parallel sections
{
  #pragma omp section
  { func a }
  #pragma omp section
  { func b }
}

现在假设 func b 首先完成,而 func a 仍在运行。 OpenMP 是否使用在 func a 中使用的线程来进一步并行化 func b?如果没有,有没有办法做到这一点?

编辑:在先前的问题中有人建议先前使用的线程保持空闲状态。是否有办法让他们在仍在运行的部分上工作?

最佳答案

OpenMP 不使用空闲线程来进一步并行化您代码中的其他部分。如果您想在线程之间实现更好的负载平衡,那么您将不得不使用依赖于 OpenMP 任务的更现代的 OpenMP 编程风格。当线程空闲时,空闲线程会自动拾取准备执行的任务。

所以,代码看起来更像这样:

#pragma omp parallel master
{
  #pragma omp task
  { func a }  // func a needs to generate more tasks 
  #pragma omp task
  { func b }  // func b needs to generate more tasks 
}

关于c++ - OpenMP 是否将已完成部分的重用线程用于另一个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55505878/

相关文章:

c++ - OpenMP - 多循环变量

C++ - 函数指针和类

签名后的 C++ 参数声明

c++ - std::list<std::future> 析构函数不阻塞

java - 如果 Activity 被杀死,Service 会发生什么?

c++ - 生成文件 : "ignoring #pragma omp parallel" 的 openmp 问题

c++ - std::sort 比自定义 OpenMP 并行排序算法快得多

c++ - C++中的直接构造函数调用

c++ - linux上的轻量级内存泄漏调试

java - ConcurrentHashMap 条件替换