PRIVATE 節は、PARALLEL、DO、SECTIONS、SINGLE、PARALLEL DO、および PARALLEL SECTIONS 宣言子で使用し、変数をチーム内の各スレッドに対してプライベートとして宣言します。
変数が PRIVATE として宣言されると、次の処理が行われます。
同じ種類とサイズの新しいオブジェクトがチーム内の各スレッドに対して一度宣言されます。そのオブジェクトはオリジナルのオブジェクトと関連するストレージではありません。
宣言子構造の記述範囲内にあるオリジナルのオブジェクトへの参照はすべて、プライベート・オブジェクトへの参照に置き換えられます。
PRIVATE として定義された変数は、構造の入口では各スレッドに対して未定義であり、対応する共有変数は、並列構造の出口で未定義です。
PRIVATE として定義された変数の内容、割り当て状態、関連付け状態は、呼び出し先のルーチンに実引数として渡されている場合を除き、構造の記述範囲外 (ただし、動的範囲内) での参照時には未定義です。
次の例では、I および J の値は並列領域の出口では未定義です。
例 |
---|
INTEGER I,J I = 1 J = 2 !$OMP PARALLEL PRIVATE(I) FIRSTPRIVATE(J) I = 3 J = J + 2 !$OMP END PARALLEL PRINT *, I, J |
FIRSTPRIVATE 節は、PARALLEL、DO、SECTIONS、SINGLE、PARALLEL DO、PARALLEL SECTIONS 宣言子で使用し、PRIVATE 節機能のスーパーセットを提供します。
PRIVATE 節機能に加えて、変数のプライベート・コピーは、並列構造の前にあるオリジナルのオブジェクトにより初期化されます。
LASTPRIVATE 節は、DO、SECTIONS、PARALLEL DO、PARALLEL SECTIONS 宣言子で使用し、PRIVATE 節機能のスーパーセットを提供します。
LASTPRIVATE 節が、DO または PARALLEL DO 宣言子に置かれている場合、最後の繰り返しをシーケンシャルに実行するスレッドは、その構造に入る前に持っていたオブジェクトのバージョンを更新します。
LASTPRIVATE 節が、SECTIONS または PARALLEL SECTIONS 宣言子に置かれている場合、記述上において最後のセクションを実行するスレッドは、その構造に入る前に持っていたオブジェクトのバージョンを更新します。
DO ループの最後の繰り返し、または記述上において最後の SECTION 宣言子により値を割り当てられていないサブオブジェクトは、その構造の後で未定義となります。
正常に実行されるかどうかは、ループの最後の繰り返しにより割り当てられる変数の値に依存する場合があります。そのような変数は、すべて引数として LASTPRIVATE 節にリストし、変数の値が、ループがシーケンシャルに実行された場合と同じになるようにします。次の例では、並列領域の最後で、I の値は、N+1 と等しく、シーケンシャルに実行された場合と同じになります。
例 |
---|
!$OMP PARALLEL !$OMP DO LASTPRIVATE(I) DO I=1,N A(I) = B(I) + C(I) END DO !$OMP END PARALLEL CALL REVERSE(I) |