PROGRAM WHET2 *************************************************************************** * * * DOUBLE PRECISION FORTRAN WHETSTONE FOR UTX 1.1 OPERATING SYSTEM * * See fwhet.jcl for compilation and execution instructions. * * * * REVISION HISTORY: * * -------- ------- * * 1. ADDED STATEMENTS TO PRINT OUT CPE GROUP HEADER ON PRINTOUT. * * 2. ADDED STATEMENTS TO CALCULATE ALL CPUTIME FROM TIMES FUNCTION. * * CPE/MFR * * 3. ADDED DOCUMENTATION. * * CPE/CLS 7/29/85 * * ----------------------------------------------------------------------- * * MODULE NAME: STANDARD DOUBLE PRECISION FORTRAN WHETSTONE BENCHMARK * * AUTHOR: PRODUCT QUALITY ASSURANCE * * MODIFIED: COMPUTER PEFORMANCE EVALUATION 08/01/85 * * ----------------------------------------------------------------------- * * PURPOSE: * * ------- * * TO IMPLEMENT THE DOUBLE PRECISION FORTRAN WHETSTONE BENCHMARK * * ----------------------------------------------------------------------- * * OPERATION: * * --------- * * THE WHETSTONE CODE IS EXECUTED ONE HUNDRED TIMES WITH I = 10 * * THE WHETSTONE RATING IS COMPUTED BASED ON THE TOTAL TIME FOR * * THESE ONE HUNDRED ITERATIONS. * * THE VARIABLE 'LOOP' IS USED TO CONTROL THE OUTER LOOP. ITS VALUE * * IS TESTED BEFORE EACH I/O STATEMENT. I/O IS DONE ONLY ON THE * * LAST ITERATION. * * * * THIS PROGRAM MUST BE RUN STANDALONE. * * ----------------------------------------------------------------------- * * INPUTS: * * ------ * * THE LOOP VARIABLE I IS THE INPUT PARAMETER WHICH DETERMINES, * * WHEN SUITABLY WEIGHTED, THE NUMBER OF TIMES EACH OF THE TEN * * CONSTITUENT LOOPS IS EXECUTED. THIS VALUE IS SET TO 10 IN THE * * PROGRAM. * * ----------------------------------------------------------------------- * * OUTPUTS: * * ------- * * THIS PROGRAM PRINTS OUT A 10 BY 7 ARRAY OF RESULTS AS FOLLOWS: * * * * 0 0 0 0.1000E+01 -0.1000E+01 -0.1000E+01 -0.1000E+01 * * 120 140 120 -0.6834E-01 -0.4626E+00 -0.7297E+00 -0.1124E+01 * * 140 120 120 -0.5535E-01 -0.4475E+00 -0.7110E+00 -0.1103E+01 * * 3450 1 1 0.1000E+01 -0.1000E+01 -0.1000E+01 -0.1000E+01 * * 2100 1 2 0.6000E+01 0.6000E+01 -0.7110E+00 -0.1103E+01 * * 320 1 2 0.4904E+00 0.4904E+00 0.4904E+00 0.4904E+00 * * 8990 1 2 0.1000E+01 0.1000E+01 0.9999E+00 0.9999E+00 * * 6160 1 2 0.1000E+01 0.2000E+01 0.3000E+01 -0.1103E+01 * * 0 2 3 0.1000E+01 -0.1000E+01 -0.1000E+01 -0.1000E+01 * * 930 2 3 0.8347E+00 0.8347E+00 0.8347E+00 0.8347E+00 * * * * THESE VALUES VARY WITH THE VALUE OF I, CURRENTLY EQUAL TO 10 * * * *************************************************************************** DOUBLE PRECISION X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1 DIMENSION NTIME1(4),NTIME0(4) COMMON T,T1,T2,E1(4) WRITE(6,2000) 2000 FORMAT(' ') WRITE(6,2001) 2001 FORMAT(20X,'GOULD COMPUTER SYSTEMS DIVISION',/18X X 'COMPUTER PERFORMANCE EVALUATION GROUP'//13X, X 'STANDARD BENCHMARK: DOUBLE PRECISION WHETSTONE'/,13X, X '------------------ F77 ON UTX '/) CALL TIMER(NTIME0) T=0.499975 T1=0.50025 T2=2.0 I = 10 LOOP=100 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 DO 500 JJ=1,LOOP X1=1.0 X2=-1.0 X3=-1.0 X4=-1.0 IF (N1) 19,19,11 11 DO 18 I=1,N1,1 X1=(X1+X2+X3-X4)*T X2=(X1+X2 -X3+X4)*T X3=(X1-X2+X3+X4)*T X4=(-X1+X2+X3+X4)*T 18 CONTINUE 19 CONTINUE IF(JJ.EQ.LOOP) CALL POUT(N1,N1,N1,X1,X2,X3,X4) 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 IF(JJ.EQ.LOOP) CALL POUT(N2,N3,N2,E1(1),E1(2),E1(3),E1(4)) IF(N3) 39,39,31 31 DO 38 I=1,N3,1 38 CALL PA(E1) 39 CONTINUE IF(JJ.EQ.LOOP) CALL POUT(N3,N2,N2,E1(1),E1(2),E1(3),E1(4)) J=1 IF(N4) 49,49,41 41 DO 48 I=1,N4,1 IF(J-1) 43,42,43 42 J=2 GOTO 44 43 J=3 44 IF(J-2) 46,46,45 45 J=0 GOTO 47 46 J=1 47 IF(J-1) 411,412,412 411 J=1 GOTO 48 412 J=0 48 CONTINUE 49 CONTINUE IF(JJ.EQ.LOOP) CALL POUT(N4,J,J,X1,X2,X3,X4) 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 IF(JJ.EQ.LOOP) CALL POUT(N6,J,K,E1(1),E1(2),E1(3),E1(4)) 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 IF(JJ.EQ.LOOP) CALL POUT(N7,J,K,X,X,Y,Y) 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 IF(JJ.EQ.LOOP) CALL POUT(N8,J,K,X,Y,Z,Z) J=1 K=2 L=3 E1(1)=1.0 E1(2)=2.0 E1(3)=3.0 IF(N9) 99,99,91 91 DO 98 I=1,N9,1 98 CALL P0 99 CONTINUE IF (JJ.EQ.LOOP) CALL POUT (N9,J,K,E1(1),E1(2),E1(3),E1(4)) 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 IF(JJ.EQ.LOOP) CALL POUT(N10,J,K,X1,X2,X3,X4) X=0.75 IF(N11) 119,119,111 111 DO 118 I=1,N11,1 118 X= DSQRT( DEXP(DLOG(X)/T1)) 119 CONTINUE IF(JJ.EQ.LOOP) CALL POUT(N11,J,K,X,X,X,X) 500 CONTINUE CALL TIMER(NTIME1) XTIM = NTIME1(1)-NTIME0(1) + NTIME1(2)-NTIME0(2) + NTIME1(3)-NTIME0(3) X + NTIME1(4)-NTIME0(4) WRITE(6,2000) XTIM=XTIM/60 WHETS=(1/XTIM)*LOOP*1000 WRITE(6,2002) XTIM WRITE(6,2003) WHETS 2002 FORMAT(/,2X,' CPU TIME =',f7.0,' SECONDS.') 2003 FORMAT(/,2X,' RATE IN THOUSANDS OF WHETSTONE INSTRUCTIONS PER' + ' SECOND IS ', F7.0) WRITE(6,2000) STOP END SUBROUTINE PA(E) DOUBLE PRECISION T,T1,T2,E COMMON T,T1,T2,E1(4) DIMENSION E(4) INTEGER J 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 SUBROUTINE P0 DOUBLE PRECISION T,T1,T2,E1 COMMON T,T1,T2,E1(4) E1(J)=E1(K) E1(K)=E1(L) E1(L)=E1(J) RETURN END SUBROUTINE P3(X,Y,Z) DOUBLE PRECISION T1,T2,T,X1,Y1,X,Y,Z COMMON T,T1,T2,E1(4) X1=X Y1=Y X1=T*(X1+Y1) Y1=T*(X1+Y1) Z=(X1+Y1)/T2 RETURN END SUBROUTINE POUT(N,J,K,X1,X2,X3,X4) DOUBLE PRECISION X1,X2,X3,X4 WRITE (6 ,1) N,J,K,X1,X2,X3,X4 1 FORMAT(1H ,3I7,4E12.4) RETURN END