我被硬特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,所以不得不跳这些坑了。