如何在OpenMP中有条件地终止并行区域?

时间:2011-12-12 23:57:16

标签: c++ parallel-processing openmp

我有一个带有C ++程序的OpenMP。并行区域内包含#pragma omp task的并行区域。现在,我想知道如何根据任何正在运行的线程满足的条件终止并行区域。

#pragma omp parallel
{
 #pragma omp task
 {
   //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region)
 }

}

1 个答案:

答案 0 :(得分:6)

您不能过早终止并行构造。 OpenMP没有这方面的构造,它指定并行区域可能只有一个出口点(因此没有分支出区域......)。

我认为唯一(理智且可移植)的方法是使用一个变量来指示工作是否已完成,并让线程定期检查该变量(使用原子指令和/或刷新来确保正确的可见性)。如果变量表明工作已完成,则线程可以跳过剩余的工作(通过将剩余的工作放在if主体中,如果工作完成则不分支)。

有可能编写系统特定的代码,它暂停其他线程并将它们设置到块的末尾(例如,操作堆栈和指令指针......)但这似乎不太合适(意味着它可能非常脆)。

如果您告诉我们更多关于您要做什么(以及为什么需要这样做),可能更容易帮助您(例如,通过设计不需要这样做的设计)。