- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了这段代码:
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
输出是:
牛:
17182819.143730670
Time = 0.248 seconds.
英特尔:
17182819.1437313
Time = 0.051 seconds.
当我运行几次时,每次的运行时间几乎相同。
为什么 ifort 比 gfortran 快,我怎样才能使 gfortran 运行得和 ifort 一样快?
最佳答案
ifort 主要更快,因为它使用自己的优化数学库 SVML(随英特尔编译器提供)。这个库通常更快,因为它提供了优化的矢量化原语,即使没有-ffastmath
。此外,英特尔编译器倾向于更好地矢量化循环(尤其是像这样的减少)。
你可以看出区别on GodBolt : ifort 版本通过一次处理 2 个数字来向量化循环,而 gfortran 版本使用较慢的标量指数。
请注意,由于 AVX 指令集,使用 -mavx2
有助于 ifort 生成更快的代码。使用 AVX-512 指令(如果在目标机器上可用)可能会更快。gfortran 可以在 GodBolt 上用 -march=native
向量化循环(但奇怪的是不能用 -march=skylake
和 -ffast-math
)。
关于performance - exp 函数运行时比较 ifort 与 gfortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67582658/
所以似乎有一些关于 gfortran 的线宽限制的问题,但没有一个关于 ifort 的问题。我在编译时遇到以下问题: ../../../src/70_gw/gwls_lineqsolver.F90(2
介绍 我了解英特尔的 Fortran 编译器 ifort执行一些函数内联和 interprocedural optimization (IPO) ,以及其他标准优化。这可以按照以下示例完成: ifor
请考虑以下代码 module t_test implicit none type ttt(tsize) integer, len :: tsize
这个程序崩溃了 Illegal instruction: 4在 MacOSX Lion 和 ifort (IFORT) 12.1.0 20111011 上 program foo real
有几个关于 SO 的精彩讨论已经涵盖了如何在 Linux 上生成可执行共享库: 见 https://unix.stackexchange.com/questions/7066 和 building a
显然,Fortran 编译器中允许的连续行数存在限制。我有一个临时的病态案例(为了快速测试目的而制作),我需要在不打开文件或做任何欺骗的情况下初始化一个巨大的数组,只需将数据作为文字输入即可。该数组相
以下内容适用于 gfortran 或 f95,但不适用于 ifort: interface add procedure addr, addi end interface add
我突然得到了一些非常旧的 Fortran 代码来编译并开始为我的研究小组工作。使用 ifort 编译代码时出现以下错误:错误 #6526:从相应的内部共享-do-构造的范围之外发生了到 do-term
我认为我在 ifort 2015 中观察到一个错误。 $> ifort test.f90 -O1 -g && ./a.out 6 0 0 0 0 0 0 1 0 $> ifort test.f90
gcc 和 cl 是否有 ifort 的等效项 real-size编译器标志?如果没有,我应该用什么来代替?宏观? #ifdef DOUBLE_PRECISION #define REAL dou
我有一个场景,我希望编译器将浮点值舍入为零或负无穷大。它只需要通过编译器选项来完成,我无法找到与此相关的任何编译器选项,因为类似的方法可用于 AIX 平台的 xlf 编译器。 有没有办法在 Linux
我能够编译目标文件“.o”并将其输出到我的“obj”文件夹中。但是,我无法将“.mod”放入我的“mod”文件夹中。以下是我当前的命令: ifort -c foo.f90 -o../obj/foo.o
为什么在这里 ifort 和 gfortran 之间有不同的行为?使用 ifort 编译它返回 false,使用 gfortran 编译返回 true。我之前在自己的代码中遇到过这个问题,并决定改用子
在评估一个带指数后跟乘法的简单表达式时,我在 Portland 和 Intel fortran 编译器之间得到了不同的行为。根据我对运算符优先级的理解,我很确定 pgf90(和 gfortran)可以
如果我在 ifort 中使用 -O0 编译,程序可以正常运行。但是只要我打开优化选项,比如-O,-O3,-fast,就会出现SIGSEGV段错误。 此错误发生在名为 maketable() 的子例程中
嗯,我遇到了这个问题(描述很长,但我认为很容易解决)。我有三个文件: nrtype.f90,它有一些愚蠢的定义,但它被以下文件使用: module nrtype integer, parame
最近看了一篇post on Stack Overflow关于找到完全平方的整数。由于我想玩这个,我写了以下小程序: PROGRAM PERFECT_SQUARE IMPLICIT NONE INTEG
我有两个第 3 方库 A.so 和 B.so,我将与我的可执行文件 executable.exe 链接在一起。 A.so 包含一个由 B.so 解决的错误,也就是说: A::subroutine1()
在英特尔论坛上将此作为编译器错误报告之前,我想知道以下是否符合标准。我的问题是:逻辑运算的顺序在 Fortran 中总是固定的吗? ! main.f90 interface subrou
我正在尝试将程序从 gfortran 移植到 ifort(英特尔 Fortran 编译器 11)。我被两个只能用 gfortran 编译的文件卡住了: gfortran -x f77 -c daedr
我是一名优秀的程序员,十分优秀!