我正在使用Fortran和OpenMP,但当我尝试使用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
编译:
.SUFFIXES: .f90
F90 = gfortran
FFLAGS_PFM = -ffree-form -ffree-line-length-none -fopenmp
LIB = -llapack
OBJ90 = main.o
main: $(OBJ90)
$(F90) $(FFLAGS_PFM) -o [email protected] $(LIB) $(OBJ90)
${OBJ90}: %.o: %.f90
$(F90) $(FFLAGS_PFM) $(LIB) -c -o [email protected] $<
崩溃时的Windows机器上,使用gfortran编译。但是,如果我将NUMLOOPS值更改为小于260000左右,则程序运行得很好。同样,大约1000x1000的矩阵会崩溃(大约500x500以上的任何事实上都不起作用)。因此,使用OpenMP时似乎允许最大数组大小?尽管如此,我还没有遇到过这样的事情。我在多台Windows机器上尝试过,结果相同,但都使用相同的配置,例如带有gfortran编译器的Windows 7。代码始终编译时没有问题,但运行时崩溃。
感谢您的回复。使TESTMAT可分配确实可行!然而,我仍然好奇为什么这首先出现。我想我忘记提到上面的代码工作,如果我删除了OpenMP位,即OMP声明和makefile中的-fopenmp标志,所以行为似乎特定于gfortran + openmp。但无论如何,向前迈进了一步,再次感谢! – user870029 2012-04-22 22:00:47
这可能是,对于OpenMP版本,编译器会将数组放在堆栈中而不是可执行文件中的静态位置,在这种情况下,您可能还会通过限制堆栈大小来解决问题,通常使用“ulimit无限“。 – haraldkl 2012-04-24 22:38:17