Floating-point sum or product reduction operations may be inaccurate due to the following conditions:
The order in which the calculations were performed in parallel was not the same as when performed serially on a single processor.
The order of calculation affected the sum or product of floating-point numbers. Hardware floating-point addition and multiplication are not associative. Roundoff, overflow, or underflow errors may result depending on how the operands associate. For example, (X*Y)*Z and X*(Y*Z) may not have the same numerical significance.
In some situations, the error may not be acceptable.
Example: Overflow and underflow, with and without reduction:
demo% cat t3.f real A(10002), result, MAXFLOAT MAXFLOAT = r_max_normal() do 10 i = 1 , 10000, 2 A(i) = MAXFLOAT A(i+1) = -MAXFLOAT 10 continue A(5001)=-MAXFLOAT A(5002)=MAXFLOAT do 20 i = 1 ,10002 !Add up the array RESULT = RESULT + A(i) 20 continue write(6,*) RESULT end demo% setenv PARALLEL 2 {Number of processors is 2} demo% f77 -silent -autopar t3.f demo% a.out 0. {Without reduction, 0. is correct} demo% f77 -silent -autopar -reduction t3.f demo% a.out Inf {With reduction, Inf. is not correct} demo%
Example: Roundoff, get the sum of 100,000 random numbers between -1 and +1:
demo% cat t4.f parameter ( n = 100000 ) double precision d_lcrans, lb / -1.0 /, s, ub / +1.0 /, v(n) s = d_lcrans ( v, n, lb, ub ) ! Get n random nos. between -1 and +1 s = 0.0 do i = 1, n s = s + v(i) end do write(*, '(" s = ", e21.15)') s end demo% f77 -autopar -reduction t4.f
Results vary with the number of processors. The following table shows the sum of 100,000 random numbers between -1 and +1.
Number of Processors |
Output |
---|---|
1 | s = 0.568582080884714E+02 |
2 | s = 0.568582080884722E+02 |
3 | s = 0.568582080884721E+02 |
4 | s = 0.568582080884724E+02 |
In this situation, roundoff error on the order of 10-14 is acceptable for data that is random to begin with. For more information, see the Sun Numerical Computation Guide.