1

この並列は正常に機能します。

!$OMP PARALLEL Private(irep)
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

これも問題なく動作します。

!$OMP PARALLEL
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

Default句を使用しても何も返されないのはなぜですか?

!$OMP PARALLEL DEFAULT(Private)
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

どうもありがとう!

4

1 に答える 1

6

もっと簡単なケースを見てみましょう。

program testprivate
use omp_lib

integer :: nrep
nrep=16

!$OMP PARALLEL DEFAULT(Private)
print *, "Thread: ", omp_get_thread_num(), "sees nrep = ", nrep
!$OMP END PARALLEL

end program testprivate

これを実行して取得します。

$ gfortran -o private private.f90 -fopenmp
$ export OMP_NUM_THREADS=8
$ ./private
 Thread:            3 sees nrep =            0
 Thread:            0 sees nrep =            0
 Thread:            1 sees nrep =        32581
 Thread:            7 sees nrep =            0
 Thread:            4 sees nrep =            0
 Thread:            5 sees nrep =            0
 Thread:            2 sees nrep =            0
 Thread:            6 sees nrep =            0

OpenMPプライベート変数は、デフォルトでプライベートであるかどうかにかかわらず、プライベートセクションに入るときに未定義です。irepこれは、doループで設定されるループインデックスには関係ありません。ただし、(たとえば)コンパイラがnrepプライベートセクション内で各スレッドをゼロに設定している場合、ループは実行されません。さらに悪いことに、各スレッドはnrepに対して異なる値を持つ可能性があり、何かが起こる可能性があります。

だからあなたはなりたくnrepないprivate。各スレッドに独自のを持たせることに利点はありませんが、それでもdefault(private) shared(nrep)、またはさえ持つことができます。firstprivate(nrep)nrep

于 2013-02-03T03:58:49.690 に答える