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

📄 whets.c

📁 keilc pic的版本 才搞到的 希望对大家有帮助
💻 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.                 */
/*                                                                      */
/************************************************************************/

/* This program is not according the new ANSI rules,
   therefore we disable the warnings 35 and 135 */

#pragma WARNING disable = 35, 135

#include <math.h>
#include <stdio.h>

/* #define CPU8051 */
#define CPU80166
/* #define NOPRINT */

#ifdef CPU8051
extern void initserial (void);
#define HZ  125   /* 125 Interrupt per Second for time function */
#elif defined CPU80166
extern void initserial (void);
#define HZ  2500000L   /* 2 500 000 Hz Timer input frequency */
#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
#ifdef CPU80166
        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 (" Exec-Time = %ld * 400ns\n",time1-time0);
        printf (" Single Whetstone KIPS %d\n",(int)((100*LOOP*II*HZ)/(time1-time0)));
#ifdef CPU8051
        while (1);
#elif defined CPU80166
        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(int N, int J, int K, float X1, float X2, float X3, float 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
// time1 = time0 = ptime = 0;
        printf ("%3d%3d %7d%7d", (int)((time1-time0)/ 10000),(int)((time1-ptime)/10000),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 + -