home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1996 September
/
PCWK996.iso
/
demo
/
wgelectr
/
pk51demo
/
files.2
/
EXAMPLES
/
WHETS
/
WHETS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-08
|
7KB
|
315 lines
/*********************************************************************** */
/* 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 <math.h>
#include <stdio.h>
#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; */