OpenMP不支持在循环中使用break

4

我正在使用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_;
            }
 }

我该怎么解决?谢谢!

3个回答

10

Qt没有问题。
如果您使用openMP并行化了一个循环,那么您不能在其中进行中断。

这样做的原因是: 假设您有一个包含10次迭代的循环。 现在,您想在第5次迭代时中断循环。您会这样说,

if (iteration==5) 
    break;

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

  1. 确定这一点
  2. 撤销其输出
  3. 不再处理任何迭代
  4. 动态地为所有不同的调度策略执行此操作。

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

现在,假设您知道在循环中跳出的某个条件非常罕见,而且您一心想在并行循环中使用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。


@dlib,“OpenMP”应该大写“O”。我只是评论一下,因为你一直(而且一贯地)用小写字母“o”写它。 - Konrad Rudolph

0
我将这个作为一个正式的答案添加进来;想一想:你有一个带有停止条件的循环,例如:for(int a=0; a<10; a++) ...

如果在循环中,你只是将a设置为9,并执行continue语句,它会隐式地跳出循环。


0

OpenMP不支持在for子句中使用break。


开个玩笑,但为什么不将循环变量设置为停止条件减1的值呢? - Yvain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接