2012-04-17 17 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回繰り返すとしましょう。 さて、あなたはあなたは10個のスレッドを作成して、それぞれが並行して、それぞれの反復を行い、

if (iteration==5) 
    break; 

今すぐパラレルコンテキストに来て、反復5.あなたが言うことでループを切断したいです。 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 

これは単なるフレームワークです。コーナーケース、ロックなどを参照する必要があります。 これは、各スレッドが反復の前に入力を確認できるようにします。入力条件がループを破ると、コンフリクトが発生する

+0

いい説明。 –

+1

あなたの質問を解決したら、それを受け入れることができます:) –

+0

私はそれを間違って書いていますopenMPのQt – octoback

0

openmpはfor句の中断をサポートしていません。