Windows、Linux下的Fortran编译器简介及推荐 v2.0(4)

  而lz说的gfortran和ifort编译出来程序的运行效率可以差个两三倍,就没有道理了。我曾经比较过,gfortran在除了matmul函数和三角函数远慢于ivf外,其他运算速度要远远高于ivf。

  而matmul和三角函数也有另外的处理方式。gfortran有个开关-fexternal-blas,这个可以把matmul函数解析到外部的blas库,如mkl的blas、比mkl还快的gotoblas、ATLAS,这样得到的目标代码速度要超过ivf的matmul的速度。对于三角函数,Linux下使用-mveclibabi=svml -lsvml -limf -lintlc 可以直接链接到mkl的svml库,或者使用-mveclibabi=acml -lacml_mv 链接到acml库,这样速度就和ivf相同了。Windows下比较麻烦,因为链接到intel的库要依赖vc的库,所以最好链接到svml的dll进行处理。另外的方法即是使用通用的SIMD技术,把三角函数重写(gcc),然后gfortran再去链接它。

  另外考虑到开源跨平台计算库,比如fftw、gotoblas、atlas,这些东西用gcc/gfortran很好编译,用vc/intel编译器基本编译不出来,虽然可以通过动态连接库dll来使得intel使用,还不如直接使用gcc/gfortran来的便捷。

  最后最重要的是免费开源,ivf在windows下收费,Linux下也只是对个人免费而已,商业开发需要授权。开源这个挺好的,编译器有时会不时的出现bug,intel的bug得报告后确认,还得等下个版本,还不一定修复,gfortran就不同了,可以去bugzilla上查阅bug,兴许就有解决的补丁,然后自己重新编译gfortran一下就行了。

  默认编译呢,确实差距很大的,这是因为ivf不加参数是/O1优化,而且fastmath自动开启(有时会产生错误结果,发现不对劲时要手动关闭),而 gfortran默认好像是-O0不优化(反正没有ivf优化级别高),不开启fastmath,所以默认参数表面上产生gfortran远远不如ivf 的假象。在此,引用一个说法,某人说过,intel这样做是想推销他的编译器而已(默认开关就很快)。

5)其他

  关于make,科大论坛上的IceAge朋友推荐了cmake,我挺感兴趣,于是查了下。有空的话就学一学:

  “CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。总之,CMake是一个非常强大的编译自动配置工具,支持各种平台,KDE也是用它编译的,感兴趣的可以试用一下。”

  IceAge还提到了IDB,我没理解错的话,应该是Intel DeBugger,另外还有GNU DeBugger,GDB。我自己在调试工具方面的理解和实践很浅薄,所以在上面没有说。这里特意提到,是想借IceAge的方案来弥补。他的方案是: Vim + cmake + IDB + ifort, 有兴趣的朋友可以仔细调研。这里引以下关于GDB的讨论:

f2003:

  对Fortran最大的两点遗憾是 gdb对Fortran支持不好……

dongyuanxun:

  主要是动态数组gdb支持不好,所以要使用archergdb,但是archergdb不是紧跟gdb的trunk的,所以有些特性也发挥不出来,我曾经试图把archergdb的补丁分离合并到gdb里,编译未果,要改太多东西了。

  补充一下,gcc/gfortran的调试是个硬伤,不如intel编译器的调试器好,所以对个人的调试水平比较高。虽然可以使用archergdb来代替gdb,显示还是没有ivf的好。

三、尾声

  说了那么多,其实都只是一些皮毛性质的介绍。要学会fortran,只需也必须自己亲自花时间去钻研。而fortran语言也只是科研的一件工具,能用就行,科研本身才是最重要的,千万不要舍本逐末。我所写的这些,是根据我的情况、我的需求、我的经历来写的,仅供参考。如果我的这些文字能帮大家节省一些入门时间,那我就非常满足了。我这些文字,贻笑大方本不算什么,不过既然大家耐着性子看到这里,我也提个愿望:希望大家熟悉fortran之后也能如我这般做些力所能及的事情,帮一下后来者。不一定要在人烟稀少的瀚海星云Fortran版,别的什么地方都可以,哪怕只是在现实中教教后辈也是美事;最好对受益的人也提这样的一个愿望,这样一点点传播开去,世界就更美好了~

四、修改记录

2011.04.07     原版。

2011.04.08 

补充了另外一个IDE的简介,Code::Blocks;

发觉对gfortran的评述有失偏颇,故引用dongyuanxun回复,重新修改;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/21493.html