2012-04-17 93 views
4

我正在使用OpenMP优化一些代码。如果NO_VALUE在循环中遇到,我希望它断裂。但是,编译器告诉我这是openMP不允许的。我怎么能处理这个?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_; 
      } 
} 

我该如何解决?谢谢!

回答

9

没有使用Qt没有问题。
在使用openMP进行并行化的循环中,不能有中断。这背后

推理: 可以说,你有10次迭代的循环。 现在,你想打破循环在迭代5.你说,

if (iteration==5) 
    break; 

现在来看看并行情况下,你已经创建了10个线程和各尽其各自的重复并行。所以,当thread5达到一定的条件下,你希望所有其他线程

  1. 确定此
  2. 撤消其输出
  3. 不处理了迭代iterations
  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 

这只是一个框架。您必须查看角落案例,锁等。 为此,您可以让每个线程在迭代之前检查其输入。如果他们的输入条件导致循环的破坏,他们成立一个反面

+0

很好的解释。 – 2012-04-17 11:32:38

+1

能否解决你的问题,你能接受它:) – 2012-04-17 11:35:29

+0

我写的不对的Qt对于OpenMP(标题颇显) – octoback 2012-04-17 12:23:53

0

OpenMP的不支持打破的条款。