浮点加法运行时之间的区别
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。
谁能解释一下? r
和 rr
都是 real*8
有什么区别?
我正在使用 Windows 8.1、Visual Studio 12 Ultimate、Intel Composer XE 2013 和 -O2
标志。
正在将评论转化为答案...
如果您在标记行中使用 rr
而不是 r
,则该循环的所有计算都是无关紧要的,编译器可以将它们优化掉。我的猜测是这会导致您看到 "performance increase"。
此外,您在循环中执行的大部分计算都不依赖于 x 和 y。您可以轻松地预先计算它们。另外,请注意(取决于您的编译器的智能),x**2
比 x**2.0
快。
当我意识到一行要花费大量时间时,我正在编写代码。这是一个简化版本(该行由 !* 表示)
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。
谁能解释一下? r
和 rr
都是 real*8
有什么区别?
我正在使用 Windows 8.1、Visual Studio 12 Ultimate、Intel Composer XE 2013 和 -O2
标志。
正在将评论转化为答案...
如果您在标记行中使用 rr
而不是 r
,则该循环的所有计算都是无关紧要的,编译器可以将它们优化掉。我的猜测是这会导致您看到 "performance increase"。
此外,您在循环中执行的大部分计算都不依赖于 x 和 y。您可以轻松地预先计算它们。另外,请注意(取决于您的编译器的智能),x**2
比 x**2.0
快。