⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whets.c

📁 Keil uVision2
💻 C
字号:
/*********************************************************************** */
/*     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; */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -