exp 函数运行时比较 ifort 与 gfortran

时间:2021-05-18 08:33:43

标签: performance assembly fortran gfortran intel-fortran

我写了这段代码:

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 一样快?

1 个答案:

答案 0 :(得分:4)

ifort 的速度主要是因为它使用自己的优化数学库,称为 SVML(随英特尔编译器提供)。这个库通常更快,因为它提供了优化的矢量化原语,即使没有 -ffastmath。此外,英特尔编译器倾向于更好地矢量化循环(尤其是像这样的减少)。

您可以看到不同之处 on GodBolt:ifort 版本通过一次处理 2 个数字来向量化循环,而 gfortran 版本使用较慢的标量指数。

请注意,由于 AVX 指令集,使用 -mavx2 有助于 ifort 生成更快的代码。使用 AVX-512 指令(如果在目标机器上可用)可能会更快。 gfortran 可以在 GodBolt 上用 -march=native 向量化循环(但奇怪的是不能用 -march=skylake-ffast-math)。

相关问题