------- Comment #1 from dominiq at lps dot ens dot fr  2010-08-23 12:20 -------
Reduced test

! --------------------------------------------------------------------
MODULE kinds
   INTEGER, PARAMETER :: RK8 = SELECTED_REAL_KIND(15, 300)
END MODULE kinds
! --------------------------------------------------------------------
PROGRAM TEST_FPU  ! A number-crunching benchmark using matrix inversion.
USE kinds         ! Implemented by:    David Frank  dave_fr...@hotmail.com
IMPLICIT NONE     ! Gauss  routine by: Tim Prince   n...@aol.com

REAL(RK8) :: pool(101,101,1000), pool3(1001,1001) ! random numbers to invert
EQUIVALENCE (pool,pool3)               ! use same pool numbers for test 3,4
REAL(RK8) :: a(101,101), a3(1001,1001)     ! working matrices
REAL(RK8) :: avg_err, dt
INTEGER :: i, n, t(8), clock1, clock2, rate
CHARACTER (LEN=36) :: invert_id = &
                      'Test1 - Gauss 2000 (101x101) inverts'

   CALL DATE_AND_TIME ( values = t )
   CALL RANDOM_NUMBER(pool)         ! fill pool with random data ( 0. -> 1. )
   CALL SYSTEM_CLOCK (clock1,rate)  ! get benchmark (n) start time

   DO i = 1,1000
      a = pool(:,:,i)         ! get next matrix to invert
      CALL Gauss (a,101)  ! invert a
      CALL Gauss (a,101)  ! invert a
   END DO

   avg_err = SUM(ABS(a-pool(:,:,1000)))/(101*101)   ! last matrix error
   CALL SYSTEM_CLOCK (clock2,rate)
   dt = (clock2-clock1)/DBLE(rate)  ! get benchmark (n) elapsed sec.
   WRITE (*,92) invert_id, dt, ' sec  Err=', avg_err
92 FORMAT (A,F5.1,A,F18.15)

END PROGRAM TEST_FPU

! --------------------------------------------------------------------
SUBROUTINE Gauss (a,n)       ! Invert matrix by Gauss method
! --------------------------------------------------------------------
USE kinds
IMPLICIT NONE

INTEGER :: n
REAL(RK8) :: a(n,n)

! - - - Local Variables - - -
REAL(RK8) :: b(n,n), c, d, temp(n)
INTEGER :: i, j, k, m, imax(1), ipvt(n)
! - - - - - - - - - - - - - -
b = a
ipvt = (/ (i, i = 1, n) /)

DO k = 1,n
   imax = MAXLOC(ABS(b(k:n,k)))
   m = k-1+imax(1)

   IF (m /= k) THEN
      ipvt( (/m,k/) ) = ipvt( (/k,m/) )
      b((/m,k/),:) = b((/k,m/),:)
   END IF
   d = 1/b(k,k)

   temp = b(:,k)
   DO j = 1, n
      c = b(k,j)*d
      b(:,j) = b(:,j)-temp*c
      b(k,j) = c
   END DO
   b(:,k) = temp*(-d)
   b(k,k) = d
END DO
a(:,ipvt) = b

END SUBROUTINE Gauss

gfcp is r163277, gfc is r163455

[macbook] lin/test% gfcp -Ofast -funroll-loops test_fpu_red.f90
[macbook] lin/test% time a.out
Test1 - Gauss 2000 (101x101) inverts  1.9 sec  Err= 0.000000000000006
2.156u 0.064s 0:02.22 99.5%     0+0k 0+0io 0pf+0w
[macbook] lin/test% gfc -Ofast -funroll-loops test_fpu_red.f90
[macbook] lin/test% time a.out
Test1 - Gauss 2000 (101x101) inverts  2.7 sec  Err= 0.000000000000006
2.906u 0.067s 0:02.99 98.9%     0+0k 0+0io 0pf+0w


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45379

Reply via email to