TASKLOOP / END TASKLOOP
目的
TASKLOOP ディレクティブは、1 つ以上の関連ループの反復が、OpenMP タスクを使用して並行して実行されることを指定します。 反復は、構文で作成される複数のタスクに分散され、実行のためにスケジュールに入れられます。
必須オプション
-qsmp
構文
taskloop_clause は以下のとおりです。
>>-+-collapse_clause-----+------------------------------------->< +-default_clause------+ +-final_clause--------+ +-firstprivate_clause-+ +-grainsize_clause----+ +-if_clause-----------+ +-lastprivate_clause--+ +-mergeable_clause----+ +-nogroup_clause------+ +-num_tasks_clause----+ +-priority_clause-----+ +-private_clause------+ +-shared_clause-------+ '-untied_clause-------'
- collapse_clause
- TASKLOOP 構文に関連付けられるループの数を指定します。 構文は COLLAPSE(n) です。 n は正定数の整数の式でなければなりません。
- collapse_clause を指定しないと、TASKLOOP ディレクティブの直後のループのみが TASKLOOP 構文に関連付けられます。
- default_clause
- 生成された各タスク内の変数のデフォルト・データ・スコープを定義します。 構文は DEFAULT(FIRSTPRIVAT|PRIVATE|SHARED|NONE) です。
- TASKLOOP ディレクティブで指定できる default_clause は 1 つのみです。
- final_clause
- 指定された式がゼロ以外の値に評価された場合に最終タスクを生成します。 構文は FINAL(exp) です。
- exp が変数の場合は、すべての囲み構文内の変数に対する暗黙的参照が発生します。
- firstprivate_clause
- リストにあるデータ変数のスコープが各タスクに対して private であることを宣言します。それぞれの新規の private オブジェクトは、あたかもステートメント・ブロック内に暗黙の宣言があるように、 元の変数の値を使用して初期化されます。 構文は FIRSTPRIVATE(list) です。list 内のデータ変数はコンマで区切ります。
- grainsize_clause
- 作成された各タスクに割り当てられる論理ループ反復の数を制御します。 構文は GRAINSIZE(grain-size) です。 作成された各タスクに割り当てられる論理ループ反復の数は、grain-size の値と論理ループ反復数の小さい方以上ですが、grain-size の 2 倍未満です。 grain-size は正整数の式でなければなりません。
- if_clause
- スカラー式がゼロ以外の値に評価された場合に未定義タスクを生成します。 構文は IF([TASKLOOP:]exp) です。 IF 節は 1 つのみ指定することができます。
- lastprivate_clause
- リストにあるデータ変数のスコープが各タスクに対して private であることを宣言します。リストされた各変数の最終値が割り当てられると、この値は、最後の反復でその変数に割り当てられる値になります。 値が割り当てられていない変数は、不確定値を持っています。 構文は LASTPRIVATE(list) です。list 内のデータ変数はコンマで区切ります。
- mergeable_clause
- 生成された各タスクがマージ可能タスク であることを指定します。 マージ可能タスク は、そのタスクが非据え置きタスクまたは組み込みタスクである場合に、マージ可能タスクである可能性があるタスクです。 構文は MERGEABLE です。
- nogroup_clause
- TASKLOOP 構文を囲む暗黙的 TASKGROUP 領域を削除します。 構文は NOGROUP です。
- num_tasks_clause
- 指定された数と論理ループ反復数のいずれか小さい方と同数のタスクを作成します。 構文は NUM_TASKS(num-tasks) です。num-tasks は、正整数に評価される必要があります。
- priority_clause
- 指定された優先順位値を、各タスクに個々に指定されたかのように、生成されたタスクに適用します。 構文は PRIORITY(priority-value) です。 priority_clause を指定しないと、生成されたタスクの優先順位はデフォルトのゼロになります。
- private_clause
- リストにあるデータ変数のスコープが各タスクに対して private であることを宣言します。構文は PRIVATE(list) です。list 内のデータ変数はコンマで区切ります。
- shared_clause
- リストにあるコンマで区切られたデータ変数のスコープがすべてのタスクの間で共有されることを宣言します。 構文は SHARED(list) です。
- untied_clause
- 作成されたすべてのタスクが untied タスクであることを指定します。 構文は UNTIED です。
例
例 1TASKLOOP 構文は 20 のタスクを生成します。 DO ループの反復は、TASKLOOP 構文用に生成された複数のタスクに分散されます。
!$OMP PARALLEL
!$OMP SINGLE
!$OMP TASKLOOP NUM_TASKS(20)
DO i= 1, N
A(i) = i * i
END DO
!$OMP END TASKLOOP
!$OMP END SINGLE
!$OMP END PARALLEL
例 2compute_update ルーチンを呼び出すタスクは、TASKLOOP 構文内の計算からは独立しています。 計算は別のタスクに分散できます。 TASKGROUP 構文はすべての兄弟タスクが実行を完了することを保証するため、TASKLOOP 構文の NOGROUP 節は TASKLOOP 構文の暗黙的 TASKGROUP を削除することになります。
!$OMP PARALLEL
!$OMP SINGLE
!$OMP TASKGROUP
!$OMP TASK
CALL compute_update(data1)
!$OMP END TASK
!$OMP TASKLOOP COLLAPSE(2) NOGROUP
DO i = 1, n
DO j = 1, m
data2(i,j) = data2(i,j) + 1.3
END DO
END DO
!$OMP END TASKLOOP
!$OMP END TASKGROUP
! Both data1 and data2 are updated
!$OMP END SINGLE
!$OMP END PARALLEL
