如何在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) } }

如何在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) } },c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,不能过早终止并行构造。OpenMP对此没有构造,它指定并行区域可能只有一个出口点(因此没有分支出区域…) 我认为实现这一点的唯一(明智且可移植的)方法是使用一个变量来指示工作是否完成,并让线程定期检查该变量(使用原子指令和/或刷新以确保正确的可视性)。如果变量指示工作已完成,则线程可以跳过其剩余工作(通过将剩余工作放在If主体中,该主体未分支到工作已完成的If中) 可能会编写特定于系统的代码,挂起其他线程并将它们设置到块的末尾(例如,操作堆栈和指令指针…),但这似乎不是很明智(这意味着它可能非常

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

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

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

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