0

油田計算に使用されるかなり複雑なシミュレーションコードを並列化しようとしています。モジュール内のプライベートとパブリック変数とOpenMPのサブルーチン

私は、モジュール内に変数または割り当て可能な配列といくつかのサブルーチンを宣言でき、このモジュールを並列領域を含む別のモジュール/サブルーチンで使用すると、それらの変数と配列は各スレッド(つまり、これらの変数のコピーが別々にあり、スレッド内の変数に加えられた変更は他のスレッドには見られません)、または共有されますか?このよう

module m2 
implicit none 
integer :: global 
contains 

    subroutine s2() 
     implicit none 
     integer :: tid 
     tid = ! Some calculation 
    end subroutine s2 
end module m2 

module m1 
    use m2 
    implicit none 
contains 
    subroutine s1 
     !$omp parallel do 
      do i=1, 9 
       call s2() 
      end do 
     !$omp end parallel do 
    end subroutine s1 
end module m1 

tidglobalは専用または共用になりますか?

ご協力いただきありがとうございます。

答えて

1

threadprivateディレクティブを使用しない限り、モジュール変数は常にOpenMPのsharedです。 threadprivateの詳細については、Difference between OpenMP threadprivate and privateを参照してください。したがってglobalは共有されます。

ローカル変数tidはサブルーチンで宣言され、パラレル領域から呼び出されます。したがって、save属性を持たない場合は、privateになります。

integer :: tid = 0のようなその初期化は暗黙的saveが追加されますので、注意が必要です。)答えを

+0

おかげで、それは物事をクリアします。しかし、これは入れ子になったサブルーチンの中で定義された変数に当てはまりますか? 's2'の中に別のサブルーチンを定義し、その中に変数を持つように、それらもプライベートになりますか? –

+1

はい、それらもプライベートになります。 –