主题:gfortran編譯器有沒有設置所有函數調用方式的參數?
cgl_lgs
[专家分:21040] 发布于 2010-10-11 14:26:00
例如設置成fastcall?
回复列表 (共6个回复)
沙发
dongyuanxun [专家分:7180] 发布于 2010-10-11 14:56:00
开了新帖了……
据我所知,gcc没这个编译器开关
lz如果想让函数调用使用寄存器的话,有2种简单的方法
1、使用64位编译器,64位默认传递参数使用寄存器
2、使用-msseregparm(浮点数传递)
-mregparm=N(整数传递)
这两个选项的缺点是,编译出来的库只能和使用这两个参数编译的程序链接,别的未使用该选项编译的程序不能调用使用该选项编译出来的库。(亦即必须重编译所有的代码)
板凳
cgl_lgs [专家分:21040] 发布于 2010-10-11 17:29:00
呵呵,夠糾結的啊。。。
那是不是還需要重編譯GCC啊?
3 楼
dongyuanxun [专家分:7180] 发布于 2010-10-11 17:38:00
[quote]呵呵,夠糾結的啊。。。
那是不是還需要重編譯GCC啊?[/quote]
不是这个意思
我是说假设你的目标代码A用了a1,a2...模块
用这2个选项编译的时候,要把A的a1,a2....所有模快都要重新编译
如果a1调用了a2,而其中一个没有使用该选项编译,那么会造成链接失败
原因是 32位默认使用堆栈传递参数,而这个开关会使用寄存器
4 楼
cgl_lgs [专家分:21040] 发布于 2010-10-12 09:27:00
嗯,我再試試吧。
profile的結果出來了,和原來用CVF編譯的基本一樣,看來沒啥辦法可以優化了。。。
總不能讓我把程序中所有的函數都手工展開到代碼里吧。。。
太糾結了。
5 楼
dongyuanxun [专家分:7180] 发布于 2010-10-12 13:06:00
[quote]嗯,我再試試吧。
profile的結果出來了,和原來用CVF編譯的基本一樣,看來沒啥辦法可以優化了。。。
總不能讓我把程序中所有的函數都手工展開到代碼里吧。。。
太糾結了。[/quote]
我做了个gfortran的简单测试
使用objdump来查看反汇编后的结果
结果发现
只有在主程序里contains的function才会被内联
其他subroutine、module里的、外部的function和subroutine都不会被内联
有无其他方式,我没见过这方面的说明
另外,我测试了-fwhole-file,发现这个开关把function和subroutine都内联了
6 楼
dongyuanxun [专家分:7180] 发布于 2010-10-12 13:25:00
我又用我最新编译的gcc4.5.2pre版做了测试
用-fwhole-file编译lapack和blas,与程序链接,发现又没问题了
记得用我原来编译的版本是有找不到符号的问题的
http://code.google.com/p/pcxprj/downloads/list
我来回复