回 帖 发 新 帖 刷新版面

主题:请教一问题:GFORTRAN咋跟IVF速度差距如此之大?

我的程序:
非线性杆系有限元(带梁单元)
算例:
近千个工况,几百个节点,近千个杆件。
IVF下:
3秒
GFORTRAN下:
13秒
。。。。
我纠结啊~~~~~

IVF是最大优化;
GF是O3。

为什么啊,难道GF没有别的更有效的优化么?
有没有哪位有经验的帮想想这是咋回事儿,有什么解决办法么?
谢谢了:)

回复列表 (共26个回复)

11 楼

那天忘了这个选项 -funroll-loops
展开循环,据我所知,ivf是默认循环展开的,
gcc官方说这个选项可能加快也可能减慢且会大大增加目标代码体积
据我的使用来看,针对已知次数的循环来说,这个选项大多会加快代码执行

另外我注意到,gcc的数学库在Linux和Windows下处理是不一样的,
Windows下并不使用libm.a库,而是由cygwin/mingw各自解释执行(由他们各自的Runtime实现)
对三角函数计算来说,mingw32的数学库为最慢,cygwin次之,最快的是,mingw64 crt项目,这个差不多速度是mingw32的2倍,lz如果在windows下用gcc的话可以考虑把mingw32的库更换成mingw64 crt。

12 楼

那天忘了这个选项 -funroll-loops
展开循环,据我所知,ivf是默认循环展开的,
gcc官方说这个选项可能加快也可能减慢且会大大增加目标代码体积
据我的使用来看,针对已知次数的循环来说,这个选项大多会加快代码执行

另外,ivf可能会默认使用/fp:fast之类,这个可能在一般情形下和gcc的-ffast-math差不多,这个会加快浮点运算性能,但是可能会导致错误的结果,如果ivf使用/fp:precise之类,性能也会泯然众人了。

ps:我注意到,gcc的数学库在Linux和Windows下处理是不一样的,
Windows下并不使用libm.a库,而是由cygwin/mingw各自解释执行(由他们各自的Runtime实现)
对三角函数计算来说,mingw32的数学库为最慢,cygwin次之,最快的是,mingw64 crt项目,这个差不多速度是mingw32的2倍,lz如果在windows下用gcc的话可以考虑把mingw32的库更换成mingw64 crt。
关于libm.a,我查了下gcc的源码,并不在gcc之内,不知道Linux下怎么编译出libm.a,源码在哪里?

13 楼

謝謝董兄,我明兒回單位再試試:)
因為我這程序需要給用戶使用,所以不能鏈接為64位的了:)另:有沒有自動將函數展開的優化選項啊?

14 楼

[quote]謝謝董兄,我明兒回單位再試試:)
因為我這程序需要給用戶使用,所以不能鏈接為64位的了:)另:有沒有自動將函數展開的優化選項啊?[/quote]
你是说-finline-functions这个?
我记得从4.x开始,这个选项已经被包含进-O3了

15 楼

這個參數需要不需要在程序上動手腳呢?比如跨文件的函數它能自動展開么?

16 楼

[quote]這個參數需要不需要在程序上動手腳呢?比如跨文件的函數它能自動展開么?[/quote]
说到底我并不清楚这个开关对gfortran有无影响
c里可以用inline之类的进行指定 fortran的没做研究过
等有时间看看反汇编到底展开了没有

17 楼

我很疑惑的一件事情是:
當程序崩潰時,它會返回是哪個文件的第哪行出的錯。。。
這樣相當于它保留了很多調試信息,這樣的話會不會影響正常執行的速度呢?我還沒有做更具體的考證。

另:gfortran有一個“全局優化”的功能,看著好像是支持跨文件優化。但我卻發現好像開了這選項我的程序中“program”所在文件將無法鏈接通過。。。

18 楼

另外,如果你的程序属于编译好了给用户用的,又是那种计算比较密集的,需要重复使用的
可以考虑采用PGO优化。
PGO使用方法为
gcc先采用编译优化选项+-fprofile-generate 编译,然后把目标代码运行若干次,
再用编译优化开关+-fprofile-use 重新编译,这样会使得程序有一定的提升,
我的测试在10%-30%(仅供参考,可能和本地环境有关)

19 楼

[quote]我很疑惑的一件事情是:
當程序崩潰時,它會返回是哪個文件的第哪行出的錯。。。
這樣相當于它保留了很多調試信息,這樣的話會不會影響正常執行的速度呢?我還沒有做更具體的考證。

另:gfortran有一個“全局優化”的功能,看著好像是支持跨文件優化。但我卻發現好像開了這選項我的程序中“program”所在文件將無法鏈接通過。。。[/quote]
调试信息对调试有影响,对速度影响程度无从考证,很难讲,也许代码体积增大后,对程序的载入内存速度有影响吧
你说的那个全局优化大概是指-fwhole-program和-fwhole-file吧
这两个选项对产生可执行代码有很强的作用(必须编译期间和链接期间都采用这个选项)
但是我测试发现,这2个选项会把外部符号去除,如果是链接lib的话,可能会造成找不到符号的问题
-fwhole-file大概要在4.6里变成gfortran的默认选项,可能还在开发吧,不太完善,如果你想用全局优化功能,4.5之后可以使用-flto或-fwhopr代替(编译和链接阶段必须同时使用,否则没效果),这2个选项我的感觉还是比较安全的,编译lapack之类的库 upx之类的开源程序都没有发现什么问题

20 楼

不知道lz用的哪个版本的gfortran for windows
比较流行的有
tdm http://www.tdragon.net/recentgcc/
comp.lang.fortran group http://www.equation.com/servlet/equation.cmd?call=fortran
二者都有32位和64位版
comp.lang.fortran编译的很保守,没有把-flto加入
tdm的综合性能不错,但他的32位版是用的mingw32库,三角函数工作也是很慢
这二者都是shared版本,编译出来的版本可能依赖一堆dll

我把mingw64 crt移植到mingw32中,编译了gcc4.5.1 static版(不是shared版,不需要依赖dll,代价是增加exe体积,包含-flto之类,archergdb),使用intel提供的int_sin.f90(主要测试三角函数计算速度)进行基准测试,耗时8秒左右,而我原来以mingw32为蓝本编译的gcc4.5.1需要耗时16秒左右,速度提高了很多。
lz有兴趣可以下载测试
http://code.google.com/p/pcxprj/downloads/list
mingw-w64_win32_gcc4.5.1.7z 

我来回复

您尚未登录,请登录后再回复。点此登录或注册