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 に答える