/*********************************************************************** */ /* Benchmark #2 -- Single Precision Whetstone (A001) */ /* */ /* o This is a REAL*4 version of */ /* the Whetstone benchmark program. */ /* */ /* o DO-loop semantics are ANSI-66 compatible. */ /* */ /* o Final measurements are to be made with all */ /* WRITE statements and FORMAT statements removed. */ /* */ /*********************************************************************** */ #include #include #define CPU8051 /* #define NOPRINT */ #ifdef CPU8051 extern initserial (); #define HZ 125 /* 125 Interrupt per Second for time function */ #else #define HZ 1 #endif extern long time (long *); /* prototypes */ POUT(int N, int J, int K, float X1, float X2, float X3, float X4); PA(float E[5]); P0(); P3(float *X, float *Y, float *Z); /* IMPLICIT REAL*4 (A-H,O-Z); */ float T,T1,T2,E1[5]; int J,K,L; float X1,X2,X3,X4; long ptime,time0; main () { int LOOP,I,II,JJ,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11; float X,Y,Z; long time1; /* Start benchmark timing at this point. */ #ifdef CPU8051 initserial (); #endif printf (" Benchmark #2 -- Single Precision Whetstone (A001)\n"); time0 = time((long *) 0); ptime = time0; /* The actual benchmark starts here. */ T = .499975; T1 = 0.50025; T2 = 2.0; /* With loopcount LOOP=10, one million Whetstone instructions */ /* will be executed in EACH MAJOR LOOP..A MAJOR LOOP IS EXECUTED */ /* 'II' TIMES TO INCREASE WALL-CLOCK TIMING ACCURACY. */ LOOP = 1; II = 1; for (JJ=1;JJ<=II;JJ++) { /* DO 500 JJ=1,II; */ /* Establish the relative loop counts of each module. */ N1 = 0; N2 = 12 * LOOP; N3 = 14 * LOOP; N4 = 345 * LOOP; N5 = 0; N6 = 210 * LOOP; N7 = 32 * LOOP; N8 = 899 * LOOP; N9 = 616 * LOOP; N10 = 0; N11 = 93 * LOOP; /* Module 1: Simple identifiers */ X1 = 1.0; X2 = -1.0; X3 = -1.0; X4 = -1.0; if (N1!=0) { /* GO TO 35; */ for(I=1;I<=N1;I++) { /* DO 30 I=1,N1; */ X1 = (X1 + X2 + X3 - X4)*T; X2 = (X1 + X2 - X3 + X4)*T; X3 = (X1 - X2 + X3 + X4)*T; X4 = (-X1 + X2 + X3 + X4)*T; /* 30 */ }; /* 35 */ }; if (JJ==II) POUT(N1,N1,N1,X1,X2,X3,X4); /* Module 2: Array elements */ E1[1] = 1.0; E1[2] = -1.0; E1[3] = -1.0; E1[4] = -1.0; if (N2!=0) { /* GO TO 45; */ for (I=1;I<=N2;I++) { /* DO 40 I=1,N2; */ 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; /* 40 */ }; /* 45 */ }; if (JJ==II) POUT(N2,N3,N2,E1[1],E1[2],E1[3],E1[4]); /* Module 3: Array as parameter */ if (N3!=0) { /* GO TO 59; */ for (I=1;I<=N3;I++) { /* DO 50 I=1,N3; */ PA(E1); /* 50 */ }; /* 59 */ }; if (JJ==II) POUT(N3,N2,N2,E1[1],E1[2],E1[3],E1[4]); /* Module 4: Conditional jumps */ J = 1; if (N4!=0) { /* GO TO 65; */ for (I=1;I<=N4;I++) { /* DO 60 I=1,N4; */ if (J==1) goto L51; J = 3; goto L52; L51: J = 2; L52: if (J > 2) goto L53; J = 1; goto L54; L53: J = 0; L54: if (J < 1) goto L55; J = 0; goto L60; L55: J = 1; L60: ; }; /* 65 */ }; if (JJ==II) POUT(N4,J,J,X1,X2,X3,X4); /* Module 5: Omitted */ /* Module 6: Integer arithmetic */ J = 1; K = 2; L = 3; if (N6!=0) { /* GO TO 75; */ for (I=1;I<=N6;I++) { /* DO 70 I=1,N6; */ 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; /* 70 */ }; /* 75 */ }; if (JJ==II) POUT(N6,J,K,E1[1],E1[2],E1[3],E1[4]); /* Module 7: Trigonometric functions */ X = 0.5; Y = 0.5; if (N7!=0) { /* GO TO 85; */ for (I=1;I<=N7;I++) { /* DO 80 I=1,N7; */ 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)); /* 80 */ }; /* 85 */ }; if (JJ==II) POUT(N7,J,K,X,X,Y,Y); /* Module 8: Procedure calls */ X = 1.0; Y = 1.0; Z = 1.0; if (N8!=0) { /* GO TO 95; */ for (I=1;I<=N8;I++) { /* DO 90 I=1,N8; */ P3(&X,&Y,&Z); /* FORTRAN semantics */ /* 90 */ }; /* 95 */ }; if (JJ==II) POUT(N8,J,K,X,Y,Z,Z); /* Module 9: Array references */ J = 1; K = 2; L = 3; E1[1] = 1.0; E1[2] = 2.0; E1[3] = 3.0; if (N9!=0) { /* GO TO 105; */ for (I=1;I<=N9;I++) { /* DO 100 I=1,N9; */ P0(); /* 100 */ }; /* 105 */ }; if (JJ==II) POUT(N9,J,K,E1[1],E1[2],E1[3],E1[4]); /* Module 10: Integer arithmetic */ J = 2; K = 3; if (N10!=0) { /* GO TO 115; */ for (I=1;I<=N10;I++) { /* DO 110 I=1,N10; */ J = J + K; K = J + K; J = K - J; K = K - J - J; /* 110 */ }; /* 115 */ }; if (JJ==II) POUT(N10,J,K,X1,X2,X3,X4); /* Module 11: Standard functions */ X = 0.75; if (N11!=0) { /* GO TO 125; */ for (I=1;I<=N11;I++) { /* DO 120 I=1,N11; */ X = sqrt(exp(log(X)/T1)); /* 120 */ }; /* 125 */ }; if (JJ==II) POUT(N11,J,K,X,X,X,X); /* THIS IS THE END OF THE MAJOR LOOP. */ /* 500 */ }; /* Stop benchmark timing at this point. */ time1 = time((long *) 0); /*---------------------------------------------------------------- */ /* Performance in Whetstone KIP's per second is given by */ /* (100*LOOP*II*HZ)/TIME */ /* where TIME is in seconds. */ /*-------------------------------------------------------------------- */ printf (" Single Whetstone KIPS %d\n",(int)((100*LOOP*II*HZ)/(time1-time0))); #ifdef CPU8051 while (1); #else exit (0); #endif } /* END; */ PA(E) float E[5]; { /* SUBROUTINE PA(E); */ /* IMPLICIT REAL*4 (A-H,O-Z); */ /* DIMENSION E(4); */ /* COMMON T,T1,T2,E1(4),J,K,L; */ int J1; J1 = 0; L10: 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; J1 = J1 + 1; if ((J1 - 6) < 0) goto L10; /* 10,20,20; */ /* 20 */ return; } /* END; */ P0() { /* SUBROUTINE P0; */ /* IMPLICIT REAL*4 (A-H,O-Z); */ /* COMMON T,T1,T2,E1(4),J,K,L; */ E1[J] = E1[K]; E1[K] = E1[L]; E1[L] = E1[J]; return; } /* END; */ P3(X,Y,Z) float *X,*Y,*Z; { /* SUBROUTINE P3(X,Y,Z); */ /* IMPLICIT REAL*4 (A-H,O-Z); */ /* COMMON T,T1,T2,E1(4),J,K,L; */ float Y1; X1 = *X; Y1 = *Y; X1 = T * (X1 + Y1); Y1 = T * (X1 + Y1); *Z = (X1 + Y1) / T2; return; } /* END; */ POUT(N,J,K,X1,X2,X3,X4) int N,J,K; float X1,X2,X3,X4; { /* SUBROUTINE POUT(N,J,K,X1,X2,X3,X4); */ /* IMPLICIT REAL*4 (A-H,O-Z); */ /* common/ptime/ptime,time0; */ long time1; time1 = time((long *) 0); #ifndef NOPRINT printf ("%3d%3d %7d%7d", (int)(time1-time0),(int)(time1-ptime),N,J); printf ("%7d%12.4g%12.4g" ,K,X1,X2); printf ("%12.4g%12.4g\n",X3,X4); #endif ptime = time1; return; } /* END; */