我正在运行一个类似于下面代码的脚本。在过去,当我运行脚本f90 -o fakefile fakefile.f
然后./fakefile
时,它运行了,但现在它没有,并立即返回segmentation fault (core dumped)
错误。当我使用gfortran fakefile.f
然后./a.out
时,代码运行正常。我无法弄清楚使用两种编译方法之间的差异。
program fakefile
implicit real*8(a-h,o-z)
parameter(im9=4320,jm9=2160)
parameter(im1=360,jm1=180)
parameter(im25=1440,jm25=720)
parameter(nlt=2)
real*4 rrs(im9,jm9,nlt)
real*8 rrsa25(im25,jm25,nlt)
real*8 area25(im25,jm25,nlt)
real*8 rrsa1(im1,jm1,nlt)
real*8 area1(im1,jm1,nlt)
rrsa1 = 0.0
area1 = 0.0
rrsa25 = 0.0
area25 = 0.0
rrs = 0.0
print *, rrs
end
答案 0 :(得分:2)
您的分段错误是由于您的大型阵列使堆栈过载。这是Absoft和英特尔Fortran编译器的常见问题。对于您的编译器(Absoft),使用-s
标志告诉编译器在堆而不是堆栈上分配数组。另一种方法是增加shell中的堆栈大小限制(可能受管理员限制)。
请参阅Absoft常见问题解答:When I declare large arrays (>8 MB of variables), I get a segmentation violation from Linux.
一个。使用" -s"要移动的编译器选项(静态存储) 从堆栈到堆的数据或使用ulimit 命令(ulimit是一个bash命令 - 相当于的csh ' ulimit -s'是限制堆栈')来提高堆栈大小限制
#ulimit -s 8192
#ulimit -s 32768
#ulimit -s 32768一旦上升,限制适用于当前 过程和该过程的任何孩子。