TASKLOOP / END TASKLOOP

目的

TASKLOOP ディレクティブは、1 つ以上の関連ループの反復が、OpenMP タスクを使用して並行して実行されることを指定します。 反復は、構文で作成される複数のタスクに分散され、実行のためにスケジュールに入れられます。

必須オプション

-qsmp

構文

構文図を読む構文図をスキップする
             .-+---+---------------.   
             | '-,-'               |   
             V                     |   
>>-TASKLOOP----+-----------------+-+---------------------------><
               '-taskloop_clause-'     

構文図を読む構文図をスキップする
>>-block-------------------------------------------------------><

構文図を読む構文図をスキップする
>>-+--------------+--------------------------------------------><
   '-END TASKLOOP-'   

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 です。

例 1

TASKLOOP 構文は 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
例 2

compute_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