2017-11-09 1 views
0

8つの都市があります。各都市の異なる統計値について計算を行います。2つの異なったプラグマはそれらの間に障壁を持っていますか

forループの最後に障壁があるかどうかを知る必要があるので、他の以前の都市の統計が完了した後に次の計算グループが開始されます。

これは、各計算が以前のものと異なるため、このようにする必要があります。

#pragma omp for 
for (int i = 0; i < count; ++i) 
{ 
    // calculate stats about population 
} 

// is there a barrier in here? 
// Or do I need an explicit barrier 
// #pragma omp barrier 

#pragma omp for 
for (int i = 0; i < count; ++i) 
{ 
    // calculate stats about cars 
} 

// is there a barrier in here? 

#pragma omp for 
for (int i = 0; i < count; ++i) 
{ 
    // calculate stats about weather 
} 

// ...same idea 
+1

あなたが '#pragma omp parallel for'を意味すると仮定した場合、すべてのスレッドが終了するのを待つ暗黙のバリアがループの終わりにあります。ただ1つのスレッドだけが次の '#pragma ... 'まで実行フローを継続します。 – Aziz

+0

したがって、それぞれのforループの後に明示的なバリアが必要ないのですか? OK。それを回答として投稿するべきです。 – jack

答えて

2

あなたが#pragma omp parallel forを使用する場合は、[はい、あなたはすべてのスレッドが実行を続行する前に終了するのを待っているループの最後で暗黙のバリアを持つことになります。

お客様は、pragma omp barrierを明示的に配置する必要はありません。

OpenMP 4.0 Complete Specificationsによれば、(1.3ライン10):遭遇スレッド によって実行されるタスクの

タスク領域が一時停止され、新しいチームの各メンバーは、暗黙 タスクを実行します。 並列 構成の最後に暗黙のバリアがあります。

2

アジズ答えは正しいが不完全です。

#pragma omp for 

parallelはまだ完全に素晴らしいです。

OpenMPのワークシェアリングコンストラクト(ループ構造omp forを含む)は、最後に暗黙のバリアを持ちます。これはnowait節で無効にすることができます。

omp parallel forを使用する必要はありません。これは、スレッド管理のオーバーヘッドが増えるためお勧めできません。

+0

しかし、上記のコードは '#pragma omp parallel'節の中にあることが分かりました。しかし、 'nowait'節に感謝します。 – jack

+2

はい、私はあなたのコードが並列構造内にあることを理解しています。 Azizの答えは明示的に** '#pragma omp parallel for' **のみを指していることに注意してください - これはあなたが使っているものではありません。しかし、あなたは 'omp for'だけでうまくいっています... – Zulan

関連する問題