浮点加法运行时之间的差异

时间:2018-01-28 10:54:24

标签: fortran intel-fortran

当我意识到一条线占用了大量时间时,我正在编写代码。这是一个简化版本(该行由!*表示)

program main

implicit none

real*8, allocatable :: x(:), y(:), f(:)
real*8 :: one, two, six, alpha, sigma, eps, m, n, r2, r, ff, start, finish, rr
integer*8 :: q, i, j

q = 10000
one = 1.
two = 2.
six = 6.
alpha = 4.
n = 12.
m = 6.
eps = 5.
sigma = 1.
rr = 2.1234567654324556

allocate(x(q), y(q), f(q))
call RANDOM_NUMBER(x)
call RANDOM_NUMBER(y)
f(:) = 0.
call CPU_TIME(start)

do i=1,q
    do j=i+1,q
        r2 = (x(i)-x(j))**two+(y(i)-y(j))**two
        ff = six*alpha*eps*(one/r2*(sigma**m/(r2**(m/two))-two*sigma**n/(r2**(n/two))))
        r = -(x(i)-x(j))*ff
        f(i) = f(i) + r     !*
    end do
end do

call CPU_TIME(finish)
print*, finish-start


end program main

运行此代码所需的时间大约为10秒,但如果您在r指示的行中使用rr更改!*,则时间将为0.01。 有谁能解释一下? rrr之间有什么区别real*8

我正在使用Windows 8.1,Visual Studio 12 Ultimate,Intel Composer XE 2013和-O2标志。

1 个答案:

答案 0 :(得分:3)

将评论转换为答案......

如果你在标记的行中rr而不是r,那么该循环的所有计算都是无关紧要的,编译器可以将它们优化掉。我的猜测是,这会带来性能提升"你看。

此外,您在循环中执行的大多数计算都不依赖于x和y。您可以轻松地预先计算它们。另请注意(根据编译器的智能),x**2x**2.0快。