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_;
            }
 }

我该如何解决?谢谢!

4

3 回答 3

9

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

于 2012-04-17T11:30:00.437 回答
0

openmp 不支持插入 for 子句。

于 2012-04-30T13:43:52.567 回答
0

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

如果在循环中,您只是将 a 设置为 9,然后执行一条continue语句,它将隐式中断循环。

于 2019-06-28T23:43:27.647 回答