我写了这段代码:
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 一样快?
答案 0 :(得分:4)
ifort 的速度主要是因为它使用自己的优化数学库,称为 SVML(随英特尔编译器提供)。这个库通常更快,因为它提供了优化的矢量化原语,即使没有 -ffastmath
。此外,英特尔编译器倾向于更好地矢量化循环(尤其是像这样的减少)。
您可以看到不同之处 on GodBolt:ifort 版本通过一次处理 2 个数字来向量化循环,而 gfortran 版本使用较慢的标量指数。
请注意,由于 AVX 指令集,使用 -mavx2
有助于 ifort 生成更快的代码。使用 AVX-512 指令(如果在目标机器上可用)可能会更快。
gfortran 可以在 GodBolt 上用 -march=native
向量化循环(但奇怪的是不能用 -march=skylake
和 -ffast-math
)。