浮点加法运行时之间的区别

Difference between floating points addition runtime

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

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 标志。

正在将评论转化为答案...

如果您在标记行中使用 rr 而不是 r,则该循环的所有计算都是无关紧要的,编译器可以将它们优化掉。我的猜测是这会导致您看到 "performance increase"。

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