我被硬特fortran编译器坑的事迹 - 悲催的科学匠人 - 冷水's blog

我被硬特fortran编译器坑的事迹

冷水 posted @ 2014年12月07日 14:58 in fortran , 2883 阅读

最早先,gfortran下没有问题的代码在硬特编译后出现segment fault。结果发现数组整体赋值出了问题,比如

w=w1

只要数组w和w1特别大,就fault了。只好遇到比较大的数组,就把用循环。

DO k=0,kb
  w(:,:,:,k)=w1(:,:,:,k)
ENDDO

 

最近又被坑了一次,而且完全与上面这个经验相反。

id=1
DO n=1,num
  ! get i,j,k
  ...
  DO l=ivs,ivt
    buff(id)=w(l,i,j,k)
    id = id +1
  ENDDO
ENDDO

这个片段是将w中的元素按照给定的顺序填充到一维数组buff中。

按照debug模式编译没有问题。但是优化编译后出错。最后改为

id=1
ncmp = ivt-ivs+1
DO n=1,num
  ! get i,j,k
  ...
  buff(id:id+ncmp-1)=w1(ivs:ivt,i,j,k)
  id = id + ncmp

ENDDO
就没有问题了。
原因没法知道,只能是硬特fortran的优化有问题。
 
 
上述问题都是在11.x版本上出现的。第二个问题在后来版本的编译器上没有了。我想这看来就是硬特家以前一直有非商业的免费版fortran编译器的原因吧。不过听说最近没有了,看来不再需要小白鼠了。
 
现在gfortran的性能不比ifort差多少,但是因为天河-1A上的标准配置就是ifort 11.1,所以不得不跳这些坑了。
 
 
 
  • 无匹配
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee