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

时间:2019-04-03 23:48:18

标签: 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 ?如果没有,有办法吗?

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

1 个答案:

答案 0 :(得分:1)

OpenMP不会使用空闲线程来进一步并行化代码中的其他section。如果要在线程之间实现更好的负载平衡,则必须使用依赖于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 
}