PRIVATE、FIRSTPRIVATE、および LASTPRIVATE 節

PRIVATE

PRIVATE 節は、PARALLEL、DO、SECTIONS、SINGLE、PARALLEL 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 節は、PARALLEL、DO、SECTIONS、SINGLE、PARALLEL DO、PARALLEL SECTIONS ディレクティブで使用し、PRIVATE 節機能のスーパーセットを提供します。

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

LASTPRIVATE

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)