回 帖 发 新 帖 刷新版面

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

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

IVF是最大优化;
GF是O3。

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

回复列表 (共26个回复)

沙发

intel fortran 对硬件优化的优势非常大。

现代处理器都是超标量乱序执行、内置SIMD矢量整数和浮点数单元、多核心的了,编译器能利用多少呢?

gfortran的新版本也开始支持了,但比interl编译器还落后不少。其选项也没有包含在-O3中。

应该使用gfortran 4.5 4.6,并且加上-ftree-vectorize之类的选项。另外,多数程序都多少可以利用并行化的,openmp也不是很难,应该尽量使用。

板凳

加下面的开关试试
-pipe -O3 -ftracer -fivopts -ftree-loop-linear -ftree-vectorize -fforce-addr -fomit-frame-pointer -fno-bounds-check -mtune=core2 -march=core2 -mfpmath=sse -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1  (-mtune -march -m 依据你的cpu架构添加)

4.5之后
还可以用-floop-parallelize-all -ftree-loop-distribution -ftree-parallelize-loops=n(n代表cpu核心数)

当然要尽量使用openmp

另外,gfortran的内部函数库在O3优化时比ivf的要慢很多(如matmul,三角函数之类),matmul之类可以采用atlas、gotoblas等第3方优化库代替,gfortran加入 -fexternal-blas即可,这样会比ivf还快很多,三角函数暂时没有办法改善,lz如果在Linux下的吧可以考虑链接intel的函数库。其他只在纯粹的循环上和openmp并行、四则运算上,gfortran和ivf速度差不多,大多数情形gfortran稍快些。

3 楼

就我所知,GCC的编译器支持几乎所有的硬件平台(从单片机到超级计算机),通用性很好。
而INTEL的编译器只支持X86 和IA 的指令集,而且对其它厂商的X86支持还比较弱。
我认为由于GCC支持硬件支持太过广泛必然会导致考虑因素过多,从而使效率改进方面进度较慢。

此外,GCC编译器的设计也比较特殊(先进),核心编译程序只有一个,只是不同语言采用不同的的语法分析前端。因此我觉得也可能会导致编译出来的fortran程序执行效率较低。(非计算机专业出身,术语不当请见谅)

幸运的是按照标准的Fortran语言这两个编译器都支持。因此建议你考虑以下几个问题
1.程序运行平台硬件(intel or amd , X86 or arm ,不在特殊的平台上运行就可以用intel)
2.计算强度 (算几秒还是几天,计算时间短就无所谓了)

4 楼

謝謝各位,我明天試試用董兄提供的編譯選項試試吧:)
我的程序確實用了matmul,不過都是3X3的矩陣與3X1向量的乘積,所以改用gotoblas也沒啥根本性的改進,解方程部分也因為結構具有特殊性,故做了一些特殊處理,所以完全是自己寫的,沒有用庫函數:)
三角函數倒是不少用,因為坐標轉換需要用到:)

根本上來說,應該還是沒有加向量運算優化選項導致計算緩慢的:)
再次感謝了:)

5 楼

另,回3樓兩個問題:
1、就是在X86平臺,我可以假設用戶的機器至少在pentium4及以上。但我想用gfortran替代ivf,一個是降低成本,再一個是對跨平臺的支持及fortran標準的支持。
2、強度如果按原先ivf來說,少則不到一秒,多則1小時以上。

6 楼

按2楼的选项都加上了,貌似还是不行。不知道是不是文件IO或是屏幕IO导致?

7 楼

[quote]按2楼的选项都加上了,貌似还是不行。不知道是不是文件IO或是屏幕IO导致?[/quote]
性能剖析下 主要瓶颈是三角函数的话就没法子了

8 楼

有一定的基础的话,可以先弄清楚慢在哪里。

如果是三角函数倒好办。intel认为x87指令集中的三角函数太慢,那些指令的延迟和吞吐量都是100多个时钟周期的。所以intel开发了基于sse2矢量指令集的“软三角”函数集合,那就是MKL中的ivf和svml两个库。既然intel宣称ifort与gcc兼容,那么gfortran就可以调用这些函数,我做过实验,三角函数的速度快了几乎4倍。

gfortran 4.4 , 4.5 ,4.6开始,使用cloog-ppl这个库开始尝试矢量话,具体我也不清楚,但是很显然,这些库的“智商”与intel编译器相距甚远 。

9 楼

以前用CVF時分析過,90%以上的時間耗在解方程里了。現在未知,估計得重分析了。。。

我解方程的函數與調用處不在一個文件中,并且也沒有用MODULE,不知道會不會有關系。。。

在CVF/IVF中,打開文件間優化程序可以正常編譯,但在GF里竟然編譯不過~~~~整得我老郁悶了:)

再次感謝兩位:)

10 楼

[quote]有一定的基础的话,可以先弄清楚慢在哪里。

如果是三角函数倒好办。intel认为x87指令集中的三角函数太慢,那些指令的延迟和吞吐量都是100多个时钟周期的。所以intel开发了基于sse2矢量指令集的“软三角”函数集合,那就是MKL中的ivf和svml两个库。既然intel宣称ifort与gcc兼容,那么gfortran就可以调用这些函数,我做过实验,三角函数的速度快了几乎4倍。

gfortran 4.4 , 4.5 ,4.6开始,使用cloog-ppl这个库开始尝试矢量话,具体我也不清楚,但是很显然,这些库的“智商”与intel编译器相距甚远 。[/quote]
Linux下是兼容的
Windows下我测试了下并不兼容(ivf11.1.067、gfortran4.5.1)

据我所知,ppl和cloog-ppl的Graphite循环体优化是从4.5开始并入trunk的,4.4好像没有。

我来回复

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