6

からまでの 2 つの関数と がdo_step_one(i)ありdo_step_two(i)ます。i0N-1

現在、私はこの(シーケンシャル)コードを持っています:

for(unsigned int i=0; i<N; i++) {
     do_step_one(i);
}

for(unsigned int i=0; i<N; i++) {
     do_step_two(i);
}

do_step_one()との各呼び出しはdo_step2()任意の順序で並列に実行できますが、開始do_step_two()するにはすべての の最後が必要ですdo_step_one()(結果を使用しdo_step_one()ます)。

私は次のことを試しました:

#omp parallel for
for(unsigned int i=0; i<N; i++) {
    do_step_one(i);

#omp barrier

    do_step_two(i);
}

しかし、gccは文句を言います

convolve_slices.c:21: 警告: バリア領域は、ワークシェアリング、クリティカル、順序付き、マスター、または明示的なタスク領域内に密接にネストされていない可能性があります。

私は何を誤解していますか?その問題を解決する方法は?

4

2 に答える 2

11

スレッドが再作成されないようにしたい場合は、parallel の宣言と for の宣言を分けてください。

#pragma omp parallel
{
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_one(i);
  }
  //implicit barrier here
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_two(i);
  }
}
于 2011-11-14T17:22:20.970 に答える
4

このコードで見られる問題の 1 つは、コードが仕様に準拠していないことです:)

すべての do_step_one() を終了する必要がある場合は、次のようなものが必要になります。

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_one(i);
}

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_two(i);
}

この結果は、最初の for の並列処理、次に 2 番目の for の並列処理になります。

于 2009-11-10T18:42:28.460 に答える