Gfortran 使用说明.docx
- 文档编号:10283331
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:43
- 大小:585.15KB
Gfortran 使用说明.docx
《Gfortran 使用说明.docx》由会员分享,可在线阅读,更多相关《Gfortran 使用说明.docx(43页珍藏版)》请在冰豆网上搜索。
Gfortran使用说明
1、source中未使用外部库链接的,直接执行:
gfortranfoo.f/f90-ofoo
./foo
如没有"-o"选项,生成a.out文件,这显然不是我想要的。
:
D
2、gFortran分两部分:
compilerandlibrary。
如果gFortran不是标准安装的,编译source后执行,可能找不到lib,这时可以加入"-static"选项:
gfortran-staticfoo.f/f90-ofoo
gFortran会将库建在所生成程序内部。
3、FortranSource有77和90两种书写格式,gFortran默认根据后缀进行compile。
如果想自定义,例如foo.f是用90格式写的,可执行:
gfortran-ffree-formfoo.f-ofoo
大写的后缀名,gFortran会预执行该程序。
4、多source文件时,先compile不含PROGRAM语句段的source文件,各自生成foo1.o,foo2.o等。
再一起编译。
例如:
gfortran-cfoo1.f/f90
gfortran-cfoo2.f/f90
gfortranmain.f/f90foo1.ofoo2.o-omain
5、foo.f95的,加选项"-std=f95",.f2003的,目前支持尚不完整。
顺便说,gFortranunstable版4.3.x将支持pointer。
下面还有一些可能常用到的options。
"-fbounds-check":
检查列表序列脚标是否超出
"-ffree/ffix-line-length-n":
设置最大columns。
77默认:
72;90默认:
132。
n若设为"0"或"none",则不限有效行数
"-fimplicit-none":
等同于在f90每段sub中声明"IMPLICITNONE",且source中implicit语句优先
"-fmax-error-n":
意义如词义
"-fsyntax-only":
不编译,只检查语法
"-fexternal-blas":
使用BLAS库函数,替代gFortran默认的函数
主题:
关于Fortran编译器的选择
作者:
jason388发表时间:
2007-12-3010:
51:
00
楼主
在几个Fortran论坛中都看到有很多人在求助编译器的问题,在此发表一下我的看法。
1.开发商业软件者,建议购买正版的Fortan编译器,比如Intel、IBM或其他公司的产品,因为无论在运行速度还是对新标准的支持上,这些大公司的产品都走在了前面。
如IBM的产品,基本上做到了对2003标准的完全支持。
2.对于非商业软件开发,建议采用开源软件,如GFortran,G95。
这些软件目前已经完全支持Fortran95,且部分支持Fortran2003。
由于两者都属于GCC系列,因此与其他语言混合编程也非常方便。
除此之外,GFortran通过GCC对OpenMP的支持,也支持并行编程。
当然由于他们都是跨平台的,因此具有很好的可移植性,也方便对已有资源的利用。
3.如果采用GFortran或G95这样的命令行编译器,建议采用SciTE或CodeBlocks作为编辑器,这两款编辑器即开源,同时也都内建了对Fortran的支持,且通过简单的设置即可直接调用GFortran或G95。
4.当然对于个人用户,Ftn95也是一个很好的选择。
作者:
f2003发表时间:
2007-12-3013:
06:
00
第1楼
有时需要在速度与兼容性(跨操作系统兼容性与库的兼容性)之间取舍。
intel等商业编译器只能针对glibc的某些版本,有的也调用gcc的库,如intelfortran就调用了libstdc++。
从而有兼容问题。
gfortran就没有这些问题了,因为是调用你的系统的库定制编译的。
兼容性好的速度就慢,gcc要照顾几十种cpu和OS,intelfortran只满足x86/ia64两种cpu和win/linux/macOS三种操作系统,术业有专攻,集中了精力,从而提供了更好的性能。
很多时候,intelfortran编译的程序的速度都能达到gfortran两倍。
作者:
jason388发表时间:
2007-12-318:
23:
00
第2楼
关于GFortran运行速度可以参考http:
//gcc.gnu.org/wiki/GFortranResults。
确实在选择编译器时应该在速度和可移植性方面进行取舍。
如果偶尔使用Fortran,没必要考虑太多,只要好用就可以了。
如果长时间(比如若干年)使用Fortran,那仔细考虑编译器的选择就很必要了。
因为操作系统的更换,机器的升级,新的算法或资源的获得等等都有可能造成已开发程序的改写或重新编译,在这种情况下,如果原来用的编译器无法使用就很麻烦了。
比如WindowsVista就不支持以前的很多编译器;VS的MFC框架在VSExpress版本中不支持;Unix下的很多资源向Windows环境的移植等等。
程序运行的速度,除了编译器的原因外,编译器命令行参数的选择是非常重要的。
当然最重要的还在于数据结构和算法。
作者:
jason388发表时间:
2007-12-319:
03:
00
第3楼
GCC是开源社群普遍使用的编译器集合,GFortran是其中的一员。
对于科学研究及工程计算来说,网上有大量的免费资源值得我们学习和借鉴。
所以我推荐个人用户采用GFortran。
对于Fortran编程爱好者来说,与其花很多时间去找破解的商用编译器,为什么不去下载一个小巧又各项功能都不错的开源软件呢?
作者:
f2003发表时间:
2007-12-3112:
29:
00
第4楼
gfortran的一个较大的劣势是优化水平落后,当然gfortran只是个前端,应该说是gcc优化水平落后.
只说对处理器优化这一项.现在的x86处理器都带有simd指令,比如sse.苹果使用intel处理器的原因就是它,intel处理器带上sse后打得传统的risc工作站没有还手之力.sse指令对数值计算也非常有用,intel/pgi/absoft都在这里精雕细琢.而gcc基本上没有这能力,还是老掉牙的x87浮点处理器,虽然也能使用sse提高点速度,但基本上只能是标量sse,完全没有发挥出simd的威力.从2005年开始,无数人在gcc的邮件列表上呼吁提供基于simd指令的intrinsics,可考虑到abi兼容性等等,至今都没有达到.
用sin函数为例,libm的sin函数就是gcc的内联汇编达到的,使用x87浮点指令fsin,而intel的libimf.so提供了sin函数的基于sse的软件模拟.结果是intel的速度快了3倍多.
当然,gfortran也有优点,尤其是开源,bug少.intelfortran比较buggy.
作者:
sjohn发表时间:
2007-12-3112:
46:
00
第5楼
楼上两位Fortran爱好者的水平好高的说
占个位子来学习一下,呵呵
作者:
maxperson发表时间:
2007-12-3114:
12:
00
第6楼
刚刚装gfortran,我的系统是XP的!
达人推荐一个好用的编辑器,用命令行编译有点不适应,
vf6.6中的调试程序方便啊,可是用gfortran命令行就给的信息太少,
不方便调试!
作者:
jason388发表时间:
2007-12-3117:
00:
00
第7楼
本人认为SciTE和CodeBlocks都不错。
CodeBlocks下载地址:
http:
//forums.codeblocks.org/index.php/topic,7515.0.html
CodeBlocks采用GFortran作为编译器时的设置方法见:
http:
//wiki.codeblocks.org/index.php?
title=Installing_Fortran_Compiler
SciTE下载地址:
http:
//www.scintilla.org/SciTE.html
作者:
maxperson发表时间:
2007-12-3118:
27:
00
第8楼
去试试看
有问题多向你请教
作者:
齐东野人发表时间:
2008-1-15:
42:
00
第9楼
楼主忽略了SunStudio(IDE加一套C/Cpp/Fortran/Java编译器),以前的商业软件,卖3000美元,现在开源了。
作者:
jason388发表时间:
2008-1-18:
29:
00
第10楼
谢谢F2003!
有时间去试一试。
作者:
jason388发表时间:
2008-1-18:
42:
00
第11楼
感谢9楼。
找时间去试一试SunStudio。
我推荐GFortran,SciTE及CodeBlocks还有一个原因是他们都很小巧。
对于编程爱好者来说,熟悉命令行工作方式也很重要喔。
作者:
fangp2007发表时间:
2008-1-19:
00:
00
第12楼
z很好啊,又了解了一些东西
谢谢了
作者:
谁是谁的谁发表时间:
2008-1-215:
57:
00
第13楼
jason388f2003都好强的说
作者:
f2003发表时间:
2008-1-216:
36:
00
第14楼
引用:
感谢9楼。
找时间去试一试SunStudio。
我推荐GFortran,SciTE及CodeBlocks还有一个原因是他们都很小巧。
对于编程爱好者来说,熟悉命令行工作方式也很重要喔。
我下载安装了scite,真的很不错。
codeblocks好像只有win版本?
我也很喜欢gfortran,但是他目前至少有两点不足:
1)gcc不支持simd单指令多数据优化。
这一点真的很要命。
举个例子,下面的程序请用ifort-O3-xN编译,gfortran的优化选项随便你指定,速度都要相差4倍以上。
是否支持sse就决定了这一点。
programtest_sse
!
useomp_lib
implicitnone
integer:
:
i,j,k
integer,parameter:
:
N=1000
real(4):
:
v=0.0,ve=0.0
!
$ompparalleldoschedule(static,2)private(j,k,v)reduction(+:
ve)
doi=1,8
doj=1,N
dok=1,N
v=tan(real(i))*sin(real(j))*cos(real(k))*tan(real(k))*sin(real(i))*cos(real(j))
ve=ve+v
enddo
enddo
enddo
!
$ompendparalleldo
print*,ve
!
print*,omp_get_num_procs()
endprogramtest_sse
2)对fortran2003/8的支持落在后面。
gfortran的新年献词已经出来了,仅说了句2008年将实现函数指针,其他都没有承诺。
http:
//gcc.gnu.org/ml/fortran/2008-01/msg00005.html
如能解决这两条,那么正如楼主说的,基本上可以送ifort等等商业编译器归西了。
作者:
fcInter发表时间:
2008-1-71:
14:
00
第15楼
GCC的SSE的三角函数支持早就已经有了,在X86_64下默认打开,X86下可用-mfpmath=sse打开
作者:
fcInter发表时间:
2008-1-71:
19:
00
第16楼
gfortran有自动向量化,不过没有ifort那么强,
-O3-msse2-ftree-vectorize.-ftree-vectorizer-verbose=9-mfpmath=sse
作者:
f2003发表时间:
2008-1-72:
03:
00
第17楼
欢迎楼上的来讨论。
x86_64的浮点就是使用sse,因为寄存器方式更好。
但是32位的gcc还没有simdintrinsics。
gfortran使用-ftree-vectorize基本上是聊胜于无。
反汇编没几个"PD","PS"后缀的矢量sse指令。
后来我想到了一个办法。
由于intel的sse2intrinsics是在libimf.so库中,我使用-O3-march=pentium4-mfpmath=sse-ftree-vectorize-limf为优化选项编译我的fortran程序,用libimf取代libm。
效果绝对惊人,计算结果也正确。
大家自己试试就知我所言非虚。
我对simd指令情有独钟。
后来我用上述带-limf的选项编译了差不多整个linux,包括xorg,gtk+,mpfr,gmp,gcc,glibc,binutils,firefox以及kde,不知道是不是我的心理作用,fortran编程当然不在画下,即使上ZOL之类的网页好像也是快了点。
有人呼吁fortran2008之后的标准中在也引入内联汇编,我绝对要支持!
作者:
fcInter发表时间:
2008-1-77:
43:
00
第18楼
呵呵,谢谢.
其实早些年某人搞过个libgccm,就是为了SSE的函数优化,不过其中用了AMD捐赠的代码,不符合RMS的政策,因此被毙了.
但是该高手不死心,搞了个变通的方法,GCC本身不提供库,让用户自己下载然后链接.
GCCcannowutilizetheACMLlibraryforvectorizingcallstoasetofC99functionsonx86_64if-mveclibabi=acmlisspecifiedandyoulinktoanACMLABIcompatiblelibrary.
其实不只是能链接acml,自己做个adapter,照样可以用mkl里面的libsvml
另外,现在邮件列表中有人讨论为fortran加入SIMD的instrisnic,我认为这个才是fortran的正确方向.
最好能提供下其它的优化,不用显式使用SIMD,这样可移植性更高,另一方面,加入汇编关键字之后,fortran可能就和C/C++没区别了,这就是舍本逐末.
作者:
f2003发表时间:
2008-1-711:
10:
00
第19楼
内联汇编跟舰炮和是一个道理,现在早就不是战列舰万炮对轰的时代了,作战都依靠导弹,但军舰还是要装大炮:
最后的依靠。
对处理器优化并不容易,对gcc是个不小的技术障碍。
浏览ifort所编译的程序的汇编代码,里面仍然有少许x87浮点指令,不少sse指令使用到x87寄存器,FISTTP这个sse指令更象是一个x87指令,我觉得intel未必想用sse取代x87,而是以sse为主的互相补充。
如果是这样,优化的时候就更要小心了,弄得不好大量时间浪费在反复在sse与x87的寄存器之间转移数据。
我觉得intel应该把代码捐赠出来,一方面做点贡献,另一方面也让大家帮助继续优化+找bug。
作者:
jason388发表时间:
2008-1-93:
40:
00
第20楼
感谢楼上两位关于GFortran性能的讨论。
大部分的开源软件,在性能方面,都或多或少存在与商业软件的差距,即使由商业软件改为开源的也不例外,如OpenOffice。
但开源软件的优点也并不是商业软件都具备的,对此想必对开源软件感兴趣的同人都有很多的认识。
Intel的Fortran编译器在Linux下可以免费使用,什么时候在Windows也。
。
。
正如本人在前面强调的,对于商品化软件开发当然要选择大公司的产品:
有性能完善的IDE、良好的支持、优秀的性能等等。
但对编程爱好者而言,特别是使用某种编程语言较多的人来说,在选择上个人认为还是GFortran这样的开源软件略好:
能满足绝大部分编程的需要、对标准的支持尚可、体积小巧(没有太多花哨的东西)、跨平台、容易得到,当然如果你是编程高手又对某些方面的性能有极端需求的话,你自己也可以对其改进(G95的开发者据说就是这样的原因)等等。
总之,还是那句话,适用的就是好的。
论坛上有对Fortran语言排名的讨论,我相信不论排名多少,再过20年只要有人需要,Fortran还会存在,因为Fortran更适合科学计算,这是其他语言无法比拟的。
对编程爱好者来说,编译器只是工具,算法及数据结构才是关注的重点啊!
CompilingFortran
出自Ubuntu中文
[隐藏]
∙1写在前面
∙2Fortran编程中相关文件后缀
∙3单个源文件生成可执行程序
∙4多个源文件生成可执行程序
∙5生成汇编代码
∙6编译预处理
∙7理解gfortran是gcc的前端
∙8其他参考
[编辑]写在前面
注意:
本文是关于gfortran的文章。
如果你不清楚gfortran,g77,g95等等的概念的话,不妨看看GCC的Fortran语言编译器介绍;如果你要用g77的话,这是一篇g77入门。
[编辑]Fortran编程中相关文件后缀
.a
静态库(archive)
.f,.for,.FOR
.ftn*,.f90*,.f95*,.f03*
Fortran源代码(不需编译预处理)
.F,.fpp,.FPP
.FTN*,.F90*,.F95*,.F03*
Fortran源代码(需要编译预处理)
.r
Fortran源代码(需要RatFor编译预处理)
.o
对象文件
.s
汇编语言代码
.so
动态库
其中,标*的后缀名是gfortran的文件后缀,g77不能识别。
[编辑]单个源文件生成可执行程序
传统的Fortran程序(也就是以Fortran77为代表的)只能用大写字符书写,而且每行前六个字符为特定用途所保留。
第一列为字符C或*所保留,用来表征整行都是注释。
第二列到第六列是为标号预留的。
代码从第七列开始,到72列结束(73列及以后将被直接忽略,可作注释)。
下面是示例程序采用的是传统的Fortran格式:
Chelloworld.f
C
PROGRAMHELLOWORLD
WRITE(*,10)
10FORMAT('hello,world')
ENDPROGRAMHELLOWORLD
编译器gfortran并不要求所有代码都大写──程序中任何关键词都可以用小写字母。
下面的命令将该程序编译成可执行文件:
$gfortranhelloworld.f-ohelloworld
注意到:
gfortran默认会将.f,.for,.fpp,.ftn,.F,.FOR,.FPP和.FTN结尾的文件作为固定格式处理,而将.f90,.f95,.f03,.F90,.F95和.F03结尾的文件作为自由格式来处理。
如果我们将上面程序文件重命名为helloworld.f90,那么我们必须手动指定其为固定格式:
$mvhelloworld.fhelloworld.f90
$gfortranhelloworld.f90-ffixed-form-ohelloworld
Fortran90及以后的标准允许并鼓励用自由的格式书写Fortran代码。
注释以感叹号(!
)开始直到行尾。
先前的程序采用自由格式重写如下,其中语句、标号都可从任一列开始:
!
helloworldff.f90
!
ProgramHelloworld
write(*,10)
10format('hello,world')
endProgramHelloworld
后缀名为.f90,故gfortran将其作为自由格式处理
$gfortranhelloworldff.f90-ohelloworldff
同样,如果将程序重命名为传统后缀名,那么要通过在命令行中加入选项-ffree-form进行编译,如下:
$mvhelloworldff.f90helloworldff.for
$gfortran-ffree-formhelloworldff.for-ohelloworldff
由于两种格式的具有很大的区别,程序书写是只能选择其中的一种格式进行书写。
注意:
遵守后缀约定是很重要的。
[编辑]多个源文件生成可执行程序
命令gfortran可将多个fortran源码文件编译链接成为一个单一的可执行程序。
下面列出了一个保存在文件caller.f中的简单程序的主体部分,它调用一个函数并显示出结果:
Ccaller.f
C
PROGRAMCALLER
I=Iaverageof(10,20,83)
WRITE(*,10)'Average=',I
10FORMAT(A,I5)
ENDPROGRAMCALLER
名为Iaverage函数定义在另一个独立的源文件中,如下:
Ccalled.f
C
INTEGERFUNCTIONIaverageof(i,j,k)
Iaverageof=(i+j+k)/3
RETURN
ENDFUNCTIONIaverageof
通过下面的语句这两个源码文件可被编译链接成一个名为caller的可执行程序:
$gfortrancaller.fcalled.f-ocaller
同样的结果可由下面的命令序列得到──先将每一个源码文件编译成对象文件,而后将对象文件链接为可执行程序:
$gfortran-ccaller.f-ocaller.o
$gfortran-ccalled.f-ocalled.o
$gfortrancaller.ocalled.o-ocaller
[编辑]生成汇编代码
选项-S指示编译器gfortran生成汇编语言代码然后结束。
要得到我们本文先前的helloworld.f例子的汇编代码,只需输入以下命令:
$gfortran-Shelloworld.f
生成的汇编语言文件名为helloworld.s。
汇编语言的具体形式依赖于编译器的目标平台。
[编辑]编译预处理
编译以.F,.fpp,.FPP,.FTN,.F90,.F95和.F03结尾的文件时,在它真正编译之前需要预处理。
预处理器原本是为协助C语言工作所设计的。
下面的例子是一个自由格式的Fortran程序,它通过预处理器将一个函数包含进主程序:
!
evenup.F90
!
#defin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Gfortran 使用说明
![提示](https://static.bdocx.com/images/bang_tan.gif)