多くのOpenMPタスクを作成し、taskwait
を使用しない場合、プログラムはそのタスクの完了をどこで待つのですか?次の例を考えてみましょう:暗黙のバリアでOpenMPタスクの完了を待っていますか?
#pragma omp parallel
{
#pragma omp single
{
for (int i = 0; i < 1000; i++) {
#pragma omp task
... // e.g., call some independent function
}
// no taskwait here
}
// all the tasks completed now?
}
プログラムはsingle
ブロックの最後に暗黙のバリアでタスクの完了を待っていますか?私はそう仮定しますが、この問題に関する情報はOpenMP仕様書では見つかりません。
EDIT
のOpenMP仕様でbarrier
説明から:
バリア領域と結合されたすべての明示的 タスクの完全な実行を実行する必要があります結合並列領域を実行しているチームのすべてのスレッドいずれかがバリアを越えて実行を続けることができるようになる前に、この並列領域に移動してください。
しかし、これは私がタスクの完了を担当しているのか、OpenMPランタイムがそれを担当しているのかは言いません。 OpenMPの中
ありがとうございました。私は、SpecのGlossaryセクションでこれが定義されるとは思っていませんでした。 –