【发布时间】:2021-05-18 08:33:43
【问题描述】:
我写了这段代码:
program exponent
implicit none
real(8) :: sum
integer(8) :: i
integer :: limit
real :: start, end
sum = 0d0
limit = 10000000
call CPU_TIME(start)
do i=1, limit
sum = sum + exp(i*1.d0/limit)
end do
call CPU_TIME(end)
print *, sum
print '("Time = ",f6.3," seconds.")',end-start
end program exponent
我在 CentOS Linux 7 上使用 gfortran 10.1.0 和 ifort 19.1.3.304 编译它:
ifort *.f90 -O3 -o intel.out
gfortran *.f90 -O3 -o gnu.out
输出如下:
gnu:
17182819.143730670
Time = 0.248 seconds.
英特尔:
17182819.1437313
Time = 0.051 seconds.
我跑了几次,每次的运行时间都差不多。
为什么 ifort 比 gfortran 快,我怎样才能让 gfortran 像 ifort 一样快?
【问题讨论】:
-
这看起来像是
exp实现的不同之处。当 GCC 使用 GLIBC 时,英特尔可能已经在O3上偷工减料了。但是,请尝试以相反的顺序运行测试。测试太小,无法真正让 CPU 完全启动。另外,只为循环计时。 -
我可以确认差异。在没有 CPU 节流的计算机上,尝试一次就足够了。循环中的多次尝试没有任何区别。
-ffast-math使 gfortran 稍微快一点,但速度并不快。 -
就像@VladimirF 已经说过只有时间循环,当使用
time时,您还记录操作系统需要启动/关闭应用程序、加载库等的时间。time是 不可 用于基准测试。 -
应该添加我的时间只是从计时循环开始。再三考虑,英特尔可能正在对循环进行矢量化或以其他方式重新排序,而不是近似 exp
-
在问题中添加了编译器版本和操作系统
标签: performance assembly fortran gfortran intel-fortran