omp sections ディレクティブは、定義済みの並列領域にバインドされたスレッド間で作業を配布します。
#pragma omp sections [clause[ clause] ...] { [#pragma omp section] statement-block [#pragma omp section] statement-block . . . }
ここで、clause は、次のいずれかです。
private (list) | list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 list 内のデータ変数は、コンマで区切られています。 |
firstprivate (list) | list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。それぞれの新規の private オブジェクトは、ステートメント・ブロック内に暗黙の宣言がある場合のように初期化されます。 list 内のデータ変数は、コンマで区切られています。 |
lastprivate (list) | list 内のデータ変数のスコープが各スレッドに対して private であることを宣言します。 list 内の各変数の最終値は、割り当てられる場合、最後の section でその変数に割り当てられる値となります。値が割り当てられていない変数は、不確定値を持っています。 list 内のデータ変数は、コンマで区切られています。 |
num_threads (int_exp) | int_exp の値は、並列領域用に使用するスレッドの数を指定する整数式です。スレッドの数の動的調整も使用可能である場合、 int_exp は使用されるスレッドの最大数を指定します。 |
reduction (operator: list) | 指定された operator を使用して、
list 内のすべてのスカラー変数の縮約を実行します。
list 内の縮約変数は、コンマで区切られています。
list 内の各変数の private コピーは、スレッドごとに作成されます。ステートメント・ブロックの最後で、縮約変数のすべての private コピーの最終値は、その演算子に適切な方法で結合され、その結果は、共用の縮約変数の元の値に戻されます。
reduction 文節で指定する変数は、以下のとおりでなければなりません。
|
nowait | この文節は、 sections ディレクティブ終了時の暗黙の barrier を回避するために使用します。これは、指定した並列領域内の複数の独立した作業共有セクションがある場合に有効です。 nowait 文節が、所定の sections ディレクティブ上に現れるのは、1 回のみです。 |
omp section ディレクティブは、 omp sections ディレクティブの中にある最初のプログラム・コードのセグメントのためのオプションです。後に続くセグメントは、その前に omp section ディレクティブがなければなりません。すべての omp section ディレクティブは、 omp sections ディレクティブに関連したプログラム・ソース・コードのセグメントの字句構成内になければなりません。
プログラム実行が omp sections ディレクティブに到達すると、後続の omp section ディレクティブによって定義されたプログラム・セグメントは、並列実行のために使用可能なスレッド間で配布されます。 nowait 文節が指定されていない限り、 barrier は omp sections ディレクティブに関連した、より広いプログラム領域の終了地点に暗黙的に定義されます。