问题描述
我有一些代码,当用 gfortran 编译时,完成了尾调用优化,但当用 ifort 编译时,它不是。
以下是一些描述问题的非常简单的片段:
因此,代码
function f(a,b)
real,intent(in) :: a,b
real :: f
f = a**b
end function f
使用 gfortran 编译为:
f_:
movss xmm1,DWORD PTR [rsi]
movss xmm0,DWORD PTR [rdi]
jmp powf
并使用 ifort 来:
f_:
push rsi #1.10
movss xmm0,DWORD PTR [rdi] #4.10
movss xmm1,DWORD PTR [rsi] #4.10
call powf #4.10
pop rcx #5.1
ret #5.1
我希望两个编译器都进行尾调用优化,并且我在两个编译器中都使用了 -O3 编译器标志。
我在网上查了一下,但找不到类似的问题。我只找到了这个:Does gfortran support tail call elimination? 但这里 gfortran 没有做优化,代码也复杂得多。
为什么ifort不做尾调用优化?
[编辑]: vtune output of my original code (not the simplified version above)
[编辑]: 下面是 f 的使用示例:
program calling_func
real :: res
res = 0.d0
do i = 1,10000
res = res + f(real(mod(i,3)),real(mod(i,3)))
end do
Print *,res
end program calling_func
function f(a,b)
implicit none
real,b
real :: f
f = a**b
end function f
在 gfortran 上,行 f = a**b
在汇编中转换为 jmp pow
,而在 ifort 中转换为 call pow
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)