1

私は並列コンピューティングが初めてで、OpenMP を使用して、以前に取り組んだ逐次 Fortran プログラムを並列化しようとしています。私のメイン コードは次の例のようになります。

    program main
use omp_lib
implicit none
integer :: i
double precision :: y , test , a(5)
common/y/y
external :: test
a=[1,2,3,4,5]
do i=1,5
    y=a(i)
    print*,test(2.d0)
end do
end program main

double precision function test(x)
   implicit none
   double precision :: y , x
   common/y/y
   test=y*x
   return
end function

$OMP PARALLEL DO を使用しようとしていますが、グローバルに宣言され、関数「test」で使用される変数「y」に問題がありますが、各スレッド内で変更されます。関数「test」の引数として「y」を宣言せずに、このようなコードを並列化するにはどうすればよいですか?

また、各スレッドが反復カウンター「i」の値をプログラム全体(関数を含む)でプライベートに運ぶ方法はありますか?

4

1 に答える 1

1

OMP は、OMP 構造の開始前に存在するすべての変数に DEFAULT() 型を使用します。DEFAULT() のデフォルト値は共有です。これは、共通ブロック変数がデフォルトで共有変数であることを意味します。ただし、OMP コンストラクト内の関数は、ローカル スコープを使用して関数ローカル変数のプライベート バージョンを作成します。ただし、COMMON ブロックを介して関数に渡す y 変数は関数ローカルではありません。つまり、共有型を保持し、すべてのスレッドで共通です。

これが単なる別の変数である場合は、OMP 構文で y を PRIVATE() 変数として宣言することで解決できます。代わりに、これは COMMON ブロック内にあるため、共通ブロックを参照するすべての場所で y を THREADPRIVATE として宣言する必要があります。1 か所でも忘れると、デフォルトですべてのスレッドで共有変数になります。コンパイルさえされていると仮定します。

于 2018-05-10T23:38:37.453 に答える