我有一个带有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)
}
}
答案 0 :(得分:6)
您不能过早终止并行构造。 OpenMP没有这方面的构造,它指定并行区域可能只有一个出口点(因此没有分支出区域......)。
我认为唯一(理智且可移植)的方法是使用一个变量来指示工作是否已完成,并让线程定期检查该变量(使用原子指令和/或刷新来确保正确的可见性)。如果变量表明工作已完成,则线程可以跳过剩余的工作(通过将剩余的工作放在if主体中,如果工作完成则不分支)。
有可能编写系统特定的代码,它暂停其他线程并将它们设置到块的末尾(例如,操作堆栈和指令指针......)但这似乎不太合适(意味着它可能非常脆)。
如果您告诉我们更多关于您要做什么(以及为什么需要这样做),可能更容易帮助您(例如,通过设计不需要这样做的设计)。