PRIVATE 節、FIRSTPRIVATE 節、LASTPRIVATE 節

PRIVATE

PRIVATE 節は、PARALLELDOSECTIONSSINGLEPARALLEL DO、および PARALLEL SECTIONS 宣言子で使用し、変数をチーム内の各スレッドに対してプライベートとして宣言します。

変数が 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

FIRSTPRIVATE 節は、PARALLELDOSECTIONSSINGLEPARALLEL DOPARALLEL SECTIONS 宣言子で使用し、PRIVATE 節機能のスーパーセットを提供します。

PRIVATE 節機能に加えて、変数のプライベート・コピーは、並列構造の前にあるオリジナルのオブジェクトにより初期化されます。

LASTPRIVATE

LASTPRIVATE 節は、DOSECTIONSPARALLEL DOPARALLEL 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)