我正在使用 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。代码总是编译没有问题,但运行时崩溃。