回 帖 发 新 帖 刷新版面

主题:gfortran編譯器有沒有設置所有函數調用方式的參數?

例如設置成fastcall?

回复列表 (共6个回复)

沙发

开了新帖了……
据我所知,gcc没这个编译器开关
lz如果想让函数调用使用寄存器的话,有2种简单的方法
1、使用64位编译器,64位默认传递参数使用寄存器
2、使用-msseregparm(浮点数传递)
           -mregparm=N(整数传递)
     这两个选项的缺点是,编译出来的库只能和使用这两个参数编译的程序链接,别的未使用该选项编译的程序不能调用使用该选项编译出来的库。(亦即必须重编译所有的代码)

板凳

呵呵,夠糾結的啊。。。
那是不是還需要重編譯GCC啊?

3 楼

[quote]呵呵,夠糾結的啊。。。
那是不是還需要重編譯GCC啊?[/quote]
不是这个意思
我是说假设你的目标代码A用了a1,a2...模块
用这2个选项编译的时候,要把A的a1,a2....所有模快都要重新编译
如果a1调用了a2,而其中一个没有使用该选项编译,那么会造成链接失败

原因是 32位默认使用堆栈传递参数,而这个开关会使用寄存器

4 楼

嗯,我再試試吧。
profile的結果出來了,和原來用CVF編譯的基本一樣,看來沒啥辦法可以優化了。。。
總不能讓我把程序中所有的函數都手工展開到代碼里吧。。。
太糾結了。

5 楼

[quote]嗯,我再試試吧。
profile的結果出來了,和原來用CVF編譯的基本一樣,看來沒啥辦法可以優化了。。。
總不能讓我把程序中所有的函數都手工展開到代碼里吧。。。
太糾結了。[/quote]
我做了个gfortran的简单测试
使用objdump来查看反汇编后的结果
结果发现

只有在主程序里contains的function才会被内联
其他subroutine、module里的、外部的function和subroutine都不会被内联

有无其他方式,我没见过这方面的说明

另外,我测试了-fwhole-file,发现这个开关把function和subroutine都内联了

6 楼

我又用我最新编译的gcc4.5.2pre版做了测试
用-fwhole-file编译lapack和blas,与程序链接,发现又没问题了
记得用我原来编译的版本是有找不到符号的问题的
http://code.google.com/p/pcxprj/downloads/list

我来回复

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