gpt4 book ai didi

c++ - OpenMP 不支持循环中断

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:19 25 4
gpt4 key购买 nike

我正在使用 OpenMP 优化一些代码。如果在循环中遇到 NO_VALUE,我希望它中断。但是,编译器告诉我 openMP 不允许这样做。我怎么能处理这个?

#pragma omp parallel
{
#pragma omp for reduction(+:functionEvaluation) schedule(dynamic) nowait
for (int j=m_colStart;j<m_colEnd+1;j++)
{
double d = command_->execute().toDouble();
if(d==NO_VALUE)
{
functionEvaluation = NO_VALUE;
break;
}
else
{
functionEvaluation += d;
}
delete command_;
}
}

我该如何解决?谢谢!

最佳答案

Qt没有问题。
您不能在使用 openMP 并行化的循环中中断。

背后的原因:假设您有一个包含 10 次迭代的循环。现在,您想在第 5 次迭代时打破循环。您说,

if (iteration==5) 
break;

现在来到并行上下文,您已经创建了 10 个线程,每个线程都并行执行各自的迭代。因此,当 thread5 达到特定条件时,您希望所有其他线程

  1. 决定这个
  2. 撤消他们的输出
  3. 不再处理迭代
  4. 针对所有不同的调度策略动态执行此操作。

如您所见,这在大多数情况下是不可能的/不切实际的。因此,OpenMP 不允许在并行 for 循环中使用 break。

现在,假设您知道中断的特定条件在您的循环中非常罕见,并且您一心想在并行循环中进行中断。

Thread i 
Check input condition
If input leads to breaking flag a marker break_loop
******** barrier across all threads *************
if flag break_loop is true
then
discontinue this operation
mark a variable
discontinue all the remaining iterations
endif
do your normal work

这只是一个框架。您将不得不查看角落案例、锁等。为此,您可以让每个线程在迭代前检查它们的输入。如果他们的输入条件导致循环中断,他们设置一个 con

关于c++ - OpenMP 不支持循环中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com