gpt4 book ai didi

fortran - ifort 和 gfortran 之间令人费解的性能差异

转载 作者:行者123 更新时间:2023-12-02 00:25:55 25 4
gpt4 key购买 nike

最近看了一篇post on Stack Overflow关于找到完全平方的整数。由于我想玩这个,我写了以下小程序:

PROGRAM PERFECT_SQUARE
IMPLICIT NONE
INTEGER*8 :: N, M, NTOT
LOGICAL :: IS_SQUARE

N=Z'D0B03602181'
WRITE(*,*) IS_SQUARE(N)

NTOT=0
DO N=1,1000000000
IF (IS_SQUARE(N)) THEN
NTOT=NTOT+1
END IF
END DO
WRITE(*,*) NTOT ! should find 31622 squares
END PROGRAM

LOGICAL FUNCTION IS_SQUARE(N)
IMPLICIT NONE
INTEGER*8 :: N, M

! check if negative
IF (N.LT.0) THEN
IS_SQUARE=.FALSE.
RETURN
END IF

! check if ending 4 bits belong to (0,1,4,9)
M=IAND(N,15)
IF (.NOT.(M.EQ.0 .OR. M.EQ.1 .OR. M.EQ.4 .OR. M.EQ.9)) THEN
IS_SQUARE=.FALSE.
RETURN
END IF

! try to find the nearest integer to sqrt(n)
M=DINT(SQRT(DBLE(N)))
IF (M**2.NE.N) THEN
IS_SQUARE=.FALSE.
RETURN
END IF

IS_SQUARE=.TRUE.
RETURN
END FUNCTION

使用 gfortran -O2 编译时,运行时间为 4.437 秒,-O3 为 2.657 秒。然后我想用 ifort -O2 编译可能更快,因为它可能更快 SQRT函数,但结果显示运行时间现在是 9.026 秒,并且使用 ifort -O3相同。我尝试使用 Valgrind 对其进行分析,Intel 编译的程序确实使用了更多指令。

我的问题是为什么?有没有办法找出差异的确切来源?

编辑:
  • gfortran 版本 4.6.2 和 ifort 版本 12.0.2
  • 时间是从运行中获得的 time ./a.out并且是真实/用户时间(系统总是几乎为 0)
  • 这是在 Linux x86_64 上,gfortran 和 ifort 都是 64 位版本
  • ifort 内联所有内容,gfortran 仅在 -O3 处,但后者的汇编代码比 ifort 的汇编代码简单,后者大量使用 xmm 寄存器
  • 固定代码行,添加 NTOT=0在循环之前,应该修复其他 gfortran 版本的问题

  • 当复 IF语句被删除,gfortran 需要大约 4 倍的时间(10-11 秒)。这是可以预料的,因为该语句大约抛出了大约 75% 的数字,避免执行 SQRT在他们。另一方面,ifort 只使用稍微多一点的时间。我的猜测是当 ifort 尝试优化 IF 时出现问题。陈述。

    编辑2:

    我尝试使用 ifort 版本 12.1.2.273 它要快得多,所以看起来他们修复了这个问题。

    最佳答案

    您使用的是什么编译器版本?
    有趣的是,它看起来像是从 11.1 到 12.0 的性能回归——例如对我来说,11.1(ifort -fast square.f90)需要 3.96 秒,而 12.0(相同选项)需要 13.3 秒。
    gfortran (4.6.1) (-O3) 仍然更快(3.35s)。
    我以前见过这种回归,虽然没有那么戏剧化。
    顺便说一句,用 if 语句替换

    is_square = any(m == [0, 1, 4, 9])
    if(.not. is_square) return

    使其在 ifort 12.0 中运行速度提高两倍,但在 gfortran 和 ifort 11.1 中运行速度较慢。

    问题的一部分似乎是 12.0 在尝试矢量化事物时过于激进:添加
    !DEC$ NOVECTOR

    在 DO 循环之前(不更改代码中的任何其他内容)将运行时间缩短到 4.0 秒。

    此外,还有一个附带好处:如果您有一个多核 CPU,请尝试在 ifort 命令行中添加 -parallel :)

    关于fortran - ifort 和 gfortran 之间令人费解的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893192/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com