2

parallel forいくつかの反復までループする必要がある C++ プログラムを使用しています。各反復は、アルゴリズムの可能な解を計算します。有効な解が見つかったら、ループを終了したいと思います (追加の反復が数回行われれば問題ありません)。の最初から反復回数を固定する必要があることはわかっていparallel forますが、次のコードでは反復回数を増やしていないため、スレッドが現在の反復を続行する前に条件をチェックするという保証はありますか?

void fun()
{
  int max_its = 100;

  #pragma omp parallel for schedule(dynamic, 1)
  for(int t = 0; t < max_its; ++t)
  {
    ...
    if(some condition)
      max_its = t; // valid to make threads exit the for?
  }
}
4

3 に答える 3

1

標準では、ループ不変式max_itsでなければならないと言われているため、変更することはできません。

ただし、できることは、ブール共有変数をフラグとして使用することです。

void fun()
{
  int max_its = 100;
  bool found = false;
  #pragma omp parallel for schedule(dynamic, 1) shared(found)
  for(int t = 0; t < max_its; ++t)
  {
    if( ! found ) {
    ...
    }
    if(some condition) {
  #pragma omp atomic
      found = true; // valid to make threads exit the for?
    }
  }
}

この種のロジックは、ワークシェアリング構造の代わりにタスクを使用して実装することもできます。コードのスケッチは次のようになります。

void algorithm(int t, bool& found) {
#pragma omp task shared(found)
{
  if( !found ) {
    // Do work
    if ( /* conditionc*/ ) {
      #pragma omp atomic
      found = true
    }
  }
} // task
} // function


void fun()
{
  int max_its = 100;
  bool found  = false;
  #pragma omp parallel 
  {
    #pragma omp single
    {
      for(int t = 0; t < max_its; ++t)
      {
        algorithm(t,found);
      }
    } // single
  } // parallel
}

アイデアは、単一のスレッドがmax_itsタスクを作成するというものです。各タスクは、待機中のスレッドに割り当てられます。一部のタスクが有効な解を見つけた場合、他のすべてのタスクは見つかった共有変数によって通知されます。

于 2013-09-16T10:44:15.617 に答える