代码在运行时与Absoft Fortran崩溃但不与gfortran

时间:2015-05-27 19:44:18

标签: fortran gfortran

我正在运行一个类似于下面代码的脚本。在过去,当我运行脚本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

1 个答案:

答案 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

     

一旦上升,限制适用于当前   过程和该过程的任何孩子。