home *** CD-ROM | disk | FTP | other *** search
- C The following line is for the Lawrence Livermore Labs Fortran Compiler
- C*$*OPTION FREE FORMAT
- C
- C WHETSTONE BENCHMARK
- C
- C SINGLE-PRECISION VERSION
- C
- C This program is the result of extensive research to
- C determine the instruction mix of a typical Fortran
- C program. The results of this program on different
- C machines should give a good indication of which
- C machine performs better under a typical load of
- C Fortran programs. The statements are purposely
- C arranged to defeat optimization by the compiler.
- C
- DIMENSION CPU(2)
- COMMON T,T1,T2,E1(4),J,K,L
- C
- T = 0.499975
- T1 = 0.50025
- T2 = 2.0
- PRINT 999
- 999 FORMAT (// ' WHETSTONE BENCHMARK (SINGLE PRECISION)')
- 1 PRINT 1000
- 1000 FORMAT (// ' NUMBER OF ITERATIONS? ')
- READ 1001, ITER
- 1001 FORMAT (I8)
- IPASS = 1
- C
- 5 IF (IPASS.EQ.2) ITER = ITER + 10
- IF (IPASS.EQ.2) PRINT 1002, ITER
- 1002 FORMAT (' PASS 2:', I10, ' ITERATIONS'/)
- I = ITER
- 10 SSEC = SECOND()
- C
- N1 = 0
- N2 = 12 * I
- N3 = 14 * I
- N4 = 345 * I
- N5 = 0
- N6 = 210 * I
- N7 = 32 * I
- N8 = 899 * I
- N9 = 616 * I
- N10 = 0
- N11 = 93 * I
- N12 = 0
- C
- X1 = 1.0
- X2 = -1.0
- X3 = -1.0
- X4 = -1.0
- C
- IF (N1) 19, 19, 11
- 11 DO 18 I = 1, N1, 1
- X1 = (X1 + X2 + X3 - X4) * T
- X2 = (X1 + X2 - X3 + X4) * T
- X4 = (-X1+ X2 + X3 + X4) * T
- X3 = (X1 - X2 + X3 + X4) * T
- 18 CONTINUE
- 19 CONTINUE
- CALL POUT(N1,N1,N1,X1,X2,X3,X4)
- C
- E1(1) = 1.0
- E1(2) = -1.0
- E1(3) = -1.0
- E1(4) = -1.0
- IF (N2) 29, 29, 21
- 21 DO 28 I = 1, N2, 1
- E1(1) = ( E1(1) + E1(2) + E1(3) - E1(4)) * T
- E1(2) = ( E1(1) + E1(2) - E1(3) + E1(4)) * T
- E1(3) = ( E1(1) - E1(2) + E1(3) + E1(4)) * T
- E1(4) = (-E1(1) + E1(2) + E1(3) + E1(4)) * T
- 28 CONTINUE
- 29 CONTINUE
- CALL POUT(N2,N3,N2,E1(1),E1(2),E1(3),E1(4))
- C
- IF (N3) 39, 39, 31
- 31 DO 38 I = 1, N3, 1
- 38 CALL PA(E1)
- 39 CONTINUE
- CALL POUT(N3,N2,N2,E1(1),E1(2),E1(3),E1(4))
- C
- J = 1
- IF (N4) 49, 49, 41
- 41 DO 48 I = 1, N4, 1
- IF (J-1) 43, 42, 43
- 42 J = 2
- GO TO 44
- 43 J = 3
- 44 IF (J-2) 46, 46, 45
- 45 J = 0
- GO TO 47
- 46 J = 1
- 47 IF (J-1) 411, 412, 412
- 411 J = 1
- GO TO 48
- 412 J = 0
- 48 CONTINUE
- 49 CONTINUE
- CALL POUT(N4,J,J,X1,X2,X3,X4)
- C
- J = 1
- K = 2
- L = 3
- IF (N6) 69, 69, 61
- 61 DO 68 I = 1, N6, 1
- J = J * (K-J) * (L-K)
- K = L * K - (L-J) * K
- L = (L-K) * (K+J)
- E1(L-1) = J + K + L
- E1(K-1) = J * K * L
- 68 CONTINUE
- 69 CONTINUE
- CALL POUT(N6,J,K,E1(1),E1(2),E1(3),E1(4))
- C
- X = 0.5
- Y = 0.5
- IF (N7) 79, 79, 71
- 71 DO 78 I = 1, N7, 1
- X = T * ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0))
- Y = T * ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0))
- 78 CONTINUE
- 79 CONTINUE
- CALL POUT(N7,J,K,X,X,Y,Y)
- C
- X = 1.0
- Y = 1.0
- Z = 1.0
- IF (N8) 89, 89, 81
- 81 DO 88 I = 1, N8, 1
- 88 CALL P3(X,Y,Z)
- 89 CONTINUE
- CALL POUT(N8,J,K,X,Y,Z,Z)
- C
- J = 1
- K = 2
- L = 3
- E1(1) = 1.0
- E1(2) = 2.00
- E1(3) = 3.0
- IF (N9) 99, 99, 91
- 91 DO 98 I = 1, N9, 1
- 98 CALL P0
- 99 CONTINUE
- CALL POUT(N9,J,K,E1(1),E1(2),E1(3),E1(4))
- C
- J = 2
- K = 3
- IF (N10) 109, 109, 101
- 101 DO 108 I = 1, N10, 1
- J = J + K
- K = J + K
- J = J - K
- K = K - J - J
- 108 CONTINUE
- 109 CONTINUE
- CALL POUT(N10,J,K,X1,X2,X3,X4)
- C
- X = 0.75
- IF (N11) 119, 119, 111
- 111 DO 118 I = 1, N11, 1
- 118 X = SQRT(EXP(ALOG(X)/T1))
- 119 CONTINUE
- CALL POUT(N11,J,K,X,X,X,X)
- C
- FSEC = SECOND()
- CPU(IPASS) = FSEC - SSEC
- PRINT 2000, IPASS, CPU(IPASS)
- 2000 FORMAT (/ ' PASS',I2,':',F10.4,' SEC CPU TIME'//)
- IPASS = IPASS + 1
- IF (IPASS.LE.2) GO TO 5
- C
- WIPS = 1000.0 / (CPU(2) - CPU(1))
- PRINT 3000, WIPS
- 3000 FORMAT (// ' WHETSTONE INSTRUCTIONS PER SECOND:', F7.1)
- C
- STOP 'END SINGLE-PRECISION TEST'
- END
- C
- SUBROUTINE PA(E)
- COMMON T, T1, T2
- DIMENSION E(4)
- J = 0
- 1 E(1) = ( E(1) + E(2) + E(3) - E(4)) * T
- E(2) = ( E(1) + E(2) - E(3) + E(4)) * T
- E(3) = ( E(1) - E(2) + E(3) + E(4)) * T
- E(4) = (-E(1) + E(2) + E(3) + E(4)) / T2
- J = J + 1
- IF (J-6) 1, 2, 2
- 2 CONTINUE
- RETURN
- END
- C
- SUBROUTINE P0
- COMMON T, T1, T2, E1(4), J, K, L
- E1(J) = E1(K)
- E1(K) = E1(L)
- E1(L) = E1(J)
- RETURN
- END
- C
- SUBROUTINE P3(X,Y,Z)
- COMMON T, T1, T2
- X1 = X
- Y1 = Y
- X1 = T * (X1 + Y1)
- Y1 = T * (X1 + Y1)
- Z = (X1 + Y1) / T2
- RETURN
- END
- C
- SUBROUTINE POUT(N,J,K,X1,X2,X3,X4)
- PRINT 3000, N, J, K, X1, X2, X3, X4
- 3000 FORMAT(1H , 3I7, 4E12.4)
- RETURN
- END
-