Fortran と OpenMP を使用していますが、大きな配列がある場合に OpenMP を使用してループを並列化しようとすると、問題が発生し続けます。たとえば、次のコード:
PROGRAM main
IMPLICIT NONE
INTEGER, PARAMETER :: NUMLOOPS = 300000
REAL(8) :: TESTMAT(NUMLOOPS)
INTEGER :: i,j
!$OMP PARALLEL SHARED(TESTMAT)
!$OMP DO
DO i=1,NUMLOOPS
TESTMAT(i) = i
END DO
!$OMP END DO
!$OMP END PARALLEL
write(*,*) SUM(TESTMAT)/(NUMLOOPS)
END PROGRAM main
この Makefile を使用してコンパイル:
.SUFFIXES: .f90
F90 = gfortran
FFLAGS_PFM = -ffree-form -ffree-line-length-none -fopenmp
LIB = -llapack
OBJ90 = main.o
main: $(OBJ90)
$(F90) $(FFLAGS_PFM) -o $@ $(LIB) $(OBJ90)
${OBJ90}: %.o: %.f90
$(F90) $(FFLAGS_PFM) $(LIB) -c -o $@ $<
gfortran を使用してコンパイルされた Windows マシンでクラッシュします。ただし、NUMLOOPS 値を約 260000 未満に変更すると、プログラムは正常に実行されます。同様に、約 1000x1000 のマトリックスはクラッシュします (実際、約 500x500 を超えるものは機能しません)。したがって、OpenMP を使用する場合に許容される最大配列サイズがあるように見えますか? 私はこの種のものに出くわしたことはありません。複数のWindowsマシンで試してみましたが、同じ結果になりましたが、すべて同じ構成を使用しています.gfortranコンパイラを使用したWindows 7などです。コードは常に問題なくコンパイルされますが、実行するとクラッシュします。