本項では,OpenMP Fortran API 指示文の動的な入れ子とバインドの規則について説明します。
バインドの規則
動的なバインドには,以下の規則が適用されます。DO,SECTIONS,SINGLE,MASTER,および BARRIER 指示文は,それを動的に囲む PARALLEL 指示文にバインドされます (存在する場合)。
ORDERED 指示文は,それを動的に囲む DO 指示文にバインドされます。
ATOMIC 指示文は,現在のチームだけでなく,すべてのスレッド中の ATOMIC 指示文を対象に含めた排他的参照を実現します。
CRITICAL 指示文は,現在のチームだけでなく,すべてのスレッド中の CRITICAL 指示文を対象に含めた排他的参照を実現します。
指示文は,最も近い外側の PARALLEL 指示文よりも外にある指示文にバインドすることはできません。
入れ子の規則
動的な入れ子には,以下の規則が適用されます。
PARALLEL 指示文の中に動的に含まれる PARALLEL 指示文は,論理的に新しいチームを確立します。このチームは,並列処理の入れ子が有効になっていない限り,現在のスレッドだけから構成されます。
同じ PARALLEL 指示文にバインドされた DO,SECTIONS,および SINGLE 指示文は,互いに入れ子にすることはできません。
DO,SECTIONS,および SINGLE 指示文は,CRITICAL および MASTER 指示文の動的寸法中に置くことはできません。
BARRIER 指示文は,DO,SECTIONS,SINGLE,MASTER,および CRITICAL 指示文の動的寸法中に置くことはできません。
MASTER 指示文は,DO,SECTIONS,および SINGLE 指示文の動的寸法中に置くことはできません。
ORDERED セクションは,CRITICAL セクションの動的寸法中に置くことはできません。
PARALLEL 領域中で動的に実行されたときに有効となるすべての指示文の組は,並列領域外で実行された場合も有効です。ユーザー指定の並列領域外で動的に実行された場合,その指示文は,マスタ・スレッドだけから構成されるチームによって実行されます。
例
次の例は,入れ子にされた PARALLEL 領域を示しています。
c$OMP PARALLEL DEFAULT(SHARED) c$OMP DO DO I =1, N c$OMP PARALLEL SHARED(I,N) c$OMP DO DO J =1, N CALL WORK(I,J) END DO c$OMP END PARALLEL END DO c$OMP END PARALLEL
内側と外側の DO 指示文が異なる PARALLEL 領域にバインドされていることに注意してください。
次の例は,上の例のバリエーションを示しています。
c$OMP PARALLEL DEFAULT(SHARED) c$OMP DO DO I =1, N CALL SOME_WORK(I,N) END DO c$OMP END PARALLEL ... SUBROUTINE SOME_WORK(I,N) c$OMP PARALLEL DEFAULT(SHARED) c$OMP DO DO J =1, N CALL WORK(I,J) END DO c$OMP END PARALLEL RETURN END