メインプログラム:このopenmpコードでセグメンテーションフォルトが発生しているのはなぜですか?
program main
use omp_lib
use my_module
implicit none
integer, parameter :: nmax = 202000
real(8) :: e_in(nmax) = 0.D0
integer i
call omp_set_num_threads(2)
!$omp parallel default(firstprivate)
!$omp do
do i=1,2
print *, e_in(i)
print *, eTDSE(i)
end do
!$omp end do
!$omp end parallel
end program main
モジュール:使用してコンパイル
module my_module
implicit none
integer, parameter, private :: ntmax = 202000
double complex :: eTDSE(ntmax) = (0.D0,0.D0)
!$omp threadprivate(eTDSE)
end module my_module
:
ifort -openmp main.f90 my_module.f90
実行それは、セグメンテーションフォールトを与えます。メインプログラムで印刷コマンドの1つを削除すると正常に動作します。また、omp関数を削除し、-openmpオプションを指定せずにコンパイルしても、うまく動作します。
私は、これらの配列は、ちょうど2つの要素であると考え、ことを逃しました。とにかく私はしばしば-fstack-arraysを使って配列の大きさを大きくしています。しかし、Ifortではなく。 –
'gfortran'と' ifort'の両方で、静的配列のプライベートコピーは、通常の配列の配置に影響を与える可能性のあるコンパイラオプションにもかかわらずスレッドスタックに常に自動的に割り当てられます。 –