使用Absolft Fortran但不使用gfortran时,代码在运行时崩溃
我正在运行一个类似于下面代码的脚本。在过去,当我运行脚本使用Absolft Fortran但不使用gfortran时,代码在运行时崩溃,fortran,gfortran,Fortran,Gfortran,我正在运行一个类似于下面代码的脚本。在过去,当我运行脚本f90-o fakefile fakefile.f和/fakefile时,它工作正常,但现在它没有工作,并立即返回一个分段错误(内核转储)错误。当我使用gfortran fakefile.f然后使用/a.out时,代码运行良好。我无法找出使用这两种编译方法之间的差异 program fakefile implicit real*8(a-h,o-z) parameter(im9=4320,jm9=2160) paramet
f90-o fakefile fakefile.f
和/fakefile
时,它工作正常,但现在它没有工作,并立即返回一个分段错误(内核转储)
错误。当我使用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
您的分段错误是由于使用大型阵列覆盖堆栈造成的。这是Absolft和Intel Fortran编译器上的常见问题。对于编译器(Absoft),使用
-s
标志告诉编译器在堆上而不是堆栈上分配数组。另一种方法是增加shell中的堆栈大小限制(管理员可能会限制)
请参阅Absolft常见问题解答:
A.使用“-s”编译器选项(静态存储)移动
从堆栈到堆的数据或使用ulimit
command(ulimit是一个bash命令-csh相当于
“ulimit-s”是“限制堆栈”),以提高堆栈大小限制
#ulimit-s 8192#ulimit-s32768
#ulimit-s 32768 一旦提高,限值适用于电流 进程及其任何子进程
你知道是哪一条线引起的问题吗?把陈述一个接一个地拿出来,直到你找到了冒犯的陈述。那么,当试图打印9331200个零实数时,屏幕看起来如何?可能会将数组的大小更改为也进行检查。@ja72程序似乎不喜欢:real*4 rrs(im9、jm9、nlt),数组大小是否大于f90允许的大小?到目前为止,我还没有遇到过这个问题,并且我使用了具有相同数组大小的类似脚本。
f90
使用的是什么编译器(请尝试f90-v
查看)?gfortran是Fortran 90(95/2003/2008)编译器。我正要问同样的问题!我见过f90
甚至是链接到gfortran
的系统。您正在谈论一个名为f90
…的脚本。。。你能发布脚本吗?@casey它返回:Absolft 64位Pro Fortran 11.5.2。我想我可能已经发现我的问题是服务器上的堆栈大小限制。在c shell中执行限制返回:stacksize 10240kbytes