10

我有一个带有 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)
 }

}
4

1 回答 1

8

您不能过早终止并行构造。OpenMP 对此没有任何构造,它指定并行区域可能只有一个出口点(因此不会分支出该区域......)。

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

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

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

于 2011-12-21T16:37:25.913 回答