假设我已经设置了OpenMP来运行多个部分,如下所示:
#pragma omp parallel sections
{
#pragma omp section
{ func a }
#pragma omp section
{ func b }
}
现在假设 func b 首先已完成,而 func a 仍在运行。 OpenMP是否使用 func a 中使用的线程进一步并行化 func b ?如果没有,有办法吗?
编辑:在上一个问题中建议以前使用的线程保持空闲状态。有没有办法让他们在仍然运行的部分上工作?
答案 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
}