Whetstone performance benchmark to compare the speed of my new Nucleo STM32 F401RE board to the Arduino. To summarize, while my Arduino Leonardo knockoff running at 16 Mhz runs through the 1,000 loops in 82 seconds for 1.21MIPS the Nucleo takes only 30-31 seconds and yields 3.2-3.3 MIPS. I would have expected better relative performance from a 32 bit ARM M4 processor over an 8 bit AVR. Maybe it will get better once the FPU is enabled in the online compiler.

Dependencies:   ST_401_84MHZ mbed

Whetstone on the Nucleo at 84 MHz:

  • Loops: 1000, Iterations: 1, Duration: 30 sec.
  • C Converted Double Precision Whetstones: 3.3 MIPS
  • Code size: 22.1 kB

Whetstone on the Arduino Leonardo at 16 MHz:

  • Loops: 1000Iterations: 1Duration: 82320 millisec.
  • C Converted Double Precision Whetstones: 1.21 MIPS
  • Code size: 9,086 bytes
Committer:
kirchnet
Date:
Mon Apr 28 00:38:52 2014 +0000
Revision:
0:525baf7de2db
Whetstone performance benchmark to compare my new Nucleo STM32 F401RE board to the Arduino. While my Arduino Leonardo knockoff running at 16 Mhz runs through the 1,000 loops in a mere 82 secs for 1.21 MIPS the Nucleo takes 30 secs and yields 3.3MIPS.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kirchnet 0:525baf7de2db 1 #include "benchmark.h"
kirchnet 0:525baf7de2db 2 #include "mbed.h"
kirchnet 0:525baf7de2db 3 Serial pc(SERIAL_TX, SERIAL_RX);
kirchnet 0:525baf7de2db 4
kirchnet 0:525baf7de2db 5
kirchnet 0:525baf7de2db 6 //Source: http://www.netlib.org/benchmark/whetstonec
kirchnet 0:525baf7de2db 7 /*
kirchnet 0:525baf7de2db 8 * C Converted Whetstone Double Precision Benchmark
kirchnet 0:525baf7de2db 9 * Version 1.2 22 March 1998
kirchnet 0:525baf7de2db 10 *
kirchnet 0:525baf7de2db 11 * (c) Copyright 1998 Painter Engineering, Inc.
kirchnet 0:525baf7de2db 12 * All Rights Reserved.
kirchnet 0:525baf7de2db 13 *
kirchnet 0:525baf7de2db 14 * Permission is granted to use, duplicate, and
kirchnet 0:525baf7de2db 15 * publish this text and program as long as it
kirchnet 0:525baf7de2db 16 * includes this entire comment block and limited
kirchnet 0:525baf7de2db 17 * rights reference.
kirchnet 0:525baf7de2db 18 *
kirchnet 0:525baf7de2db 19 * Converted by Rich Painter, Painter Engineering, Inc. based on the
kirchnet 0:525baf7de2db 20 * www.netlib.org benchmark/whetstoned version obtained 16 March 1998.
kirchnet 0:525baf7de2db 21 *
kirchnet 0:525baf7de2db 22 * A novel approach was used here to keep the look and feel of the
kirchnet 0:525baf7de2db 23 * FORTRAN version. Altering the FORTRAN-based array indices,
kirchnet 0:525baf7de2db 24 * starting at element 1, to start at element 0 for C, would require
kirchnet 0:525baf7de2db 25 * numerous changes, including decrementing the variable indices by 1.
kirchnet 0:525baf7de2db 26 * Instead, the array E1[] was declared 1 element larger in C. This
kirchnet 0:525baf7de2db 27 * allows the FORTRAN index range to function without any literal or
kirchnet 0:525baf7de2db 28 * variable indices changes. The array element E1[0] is simply never
kirchnet 0:525baf7de2db 29 * used and does not alter the benchmark results.
kirchnet 0:525baf7de2db 30 *
kirchnet 0:525baf7de2db 31 * The major FORTRAN comment blocks were retained to minimize
kirchnet 0:525baf7de2db 32 * differences between versions. Modules N5 and N12, like in the
kirchnet 0:525baf7de2db 33 * FORTRAN version, have been eliminated here.
kirchnet 0:525baf7de2db 34 *
kirchnet 0:525baf7de2db 35 * An optional command-line argument has been provided [-c] to
kirchnet 0:525baf7de2db 36 * offer continuous repetition of the entire benchmark.
kirchnet 0:525baf7de2db 37 * An optional argument for setting an alternate LOOP count is also
kirchnet 0:525baf7de2db 38 * provided. Define PRINTOUT to cause the POUT() function to print
kirchnet 0:525baf7de2db 39 * outputs at various stages. Final timing measurements should be
kirchnet 0:525baf7de2db 40 * made with the PRINTOUT undefined.
kirchnet 0:525baf7de2db 41 *
kirchnet 0:525baf7de2db 42 * Questions and comments may be directed to the author at
kirchnet 0:525baf7de2db 43 * r.painter@ieee.org
kirchnet 0:525baf7de2db 44 */
kirchnet 0:525baf7de2db 45 /*
kirchnet 0:525baf7de2db 46 C**********************************************************************
kirchnet 0:525baf7de2db 47 C Benchmark #2 -- Double Precision Whetstone (A001)
kirchnet 0:525baf7de2db 48 C
kirchnet 0:525baf7de2db 49 C o This is a REAL*8 version of
kirchnet 0:525baf7de2db 50 C the Whetstone benchmark program.
kirchnet 0:525baf7de2db 51 C
kirchnet 0:525baf7de2db 52 C o DO-loop semantics are ANSI-66 compatible.
kirchnet 0:525baf7de2db 53 C
kirchnet 0:525baf7de2db 54 C o Final measurements are to be made with all
kirchnet 0:525baf7de2db 55 C WRITE statements and FORMAT sttements removed.
kirchnet 0:525baf7de2db 56 C
kirchnet 0:525baf7de2db 57 C**********************************************************************
kirchnet 0:525baf7de2db 58 */
kirchnet 0:525baf7de2db 59
kirchnet 0:525baf7de2db 60
kirchnet 0:525baf7de2db 61
kirchnet 0:525baf7de2db 62 #include <stdlib.h>
kirchnet 0:525baf7de2db 63 #include <stdio.h>
kirchnet 0:525baf7de2db 64 #include <string.h>
kirchnet 0:525baf7de2db 65 #include <math.h>
kirchnet 0:525baf7de2db 66 /* the following is optional depending on the timing function used */
kirchnet 0:525baf7de2db 67 #include <time.h>
kirchnet 0:525baf7de2db 68
kirchnet 0:525baf7de2db 69 /* map the FORTRAN math functions, etc. to the C versions */
kirchnet 0:525baf7de2db 70 #define DSIN sin
kirchnet 0:525baf7de2db 71 #define DCOS cos
kirchnet 0:525baf7de2db 72 #define DATAN atan
kirchnet 0:525baf7de2db 73 #define DLOG log
kirchnet 0:525baf7de2db 74 #define DEXP exp
kirchnet 0:525baf7de2db 75 #define DSQRT sqrt
kirchnet 0:525baf7de2db 76 #define IF if
kirchnet 0:525baf7de2db 77
kirchnet 0:525baf7de2db 78 /* function prototypes */
kirchnet 0:525baf7de2db 79 void POUT(long N, long J, long K, double X1, double X2, double X3, double X4);
kirchnet 0:525baf7de2db 80 void PA(double E[]);
kirchnet 0:525baf7de2db 81 void P0(void);
kirchnet 0:525baf7de2db 82 void P3(double X, double Y, double *Z);
kirchnet 0:525baf7de2db 83 #define USAGE "usage: whetdc [-c] [loops]\n"
kirchnet 0:525baf7de2db 84
kirchnet 0:525baf7de2db 85 /*
kirchnet 0:525baf7de2db 86 COMMON T,T1,T2,E1(4),J,K,L
kirchnet 0:525baf7de2db 87 */
kirchnet 0:525baf7de2db 88 double T,T1,T2,E1[5];
kirchnet 0:525baf7de2db 89 int J,K,L;
kirchnet 0:525baf7de2db 90
kirchnet 0:525baf7de2db 91 int argc=0;//Mod for nucleo. Change in code below if you want non-default loop count
kirchnet 0:525baf7de2db 92
kirchnet 0:525baf7de2db 93
kirchnet 0:525baf7de2db 94 int
kirchnet 0:525baf7de2db 95 whetstone(int argc)
kirchnet 0:525baf7de2db 96 {
kirchnet 0:525baf7de2db 97 pc.printf("Beginning Whetstone benchmark at ");
kirchnet 0:525baf7de2db 98 if(argc==0)
kirchnet 0:525baf7de2db 99 pc.printf("default speed ...\n");
kirchnet 0:525baf7de2db 100 else
kirchnet 0:525baf7de2db 101 pc.printf("84 MHz ...\n");
kirchnet 0:525baf7de2db 102 /* used in the FORTRAN version */
kirchnet 0:525baf7de2db 103 long I;
kirchnet 0:525baf7de2db 104 long N1, N2, N3, N4, N6, N7, N8, N9, N10, N11;
kirchnet 0:525baf7de2db 105 double X1,X2,X3,X4,X,Y,Z;
kirchnet 0:525baf7de2db 106 long LOOP;
kirchnet 0:525baf7de2db 107 int II, JJ;
kirchnet 0:525baf7de2db 108
kirchnet 0:525baf7de2db 109 /* added for this version */
kirchnet 0:525baf7de2db 110 long loopstart;
kirchnet 0:525baf7de2db 111 long startsec, finisec;
kirchnet 0:525baf7de2db 112 float KIPS;
kirchnet 0:525baf7de2db 113 int continuous;
kirchnet 0:525baf7de2db 114
kirchnet 0:525baf7de2db 115 loopstart = 1000; /* see the note about LOOP below */
kirchnet 0:525baf7de2db 116 continuous = 0;
kirchnet 0:525baf7de2db 117
kirchnet 0:525baf7de2db 118 II = 1; /* start at the first arg (temp use of II here) */
kirchnet 0:525baf7de2db 119 /* while (II < argc) {
kirchnet 0:525baf7de2db 120 if (strncmp(argv[II], "-c", 2) == 0 || argv[II][0] == 'c') {
kirchnet 0:525baf7de2db 121 continuous = 1;
kirchnet 0:525baf7de2db 122 } else if (atol(argv[II]) > 0) {
kirchnet 0:525baf7de2db 123 loopstart = atol(argv[II]);
kirchnet 0:525baf7de2db 124 } else {
kirchnet 0:525baf7de2db 125 // fprintf(stderr, USAGE);//original code
kirchnet 0:525baf7de2db 126 fprintf(stderr, USAGE);//not output toSTM32 version
kirchnet 0:525baf7de2db 127 return(1);
kirchnet 0:525baf7de2db 128 }
kirchnet 0:525baf7de2db 129 II++;
kirchnet 0:525baf7de2db 130 }*/
kirchnet 0:525baf7de2db 131
kirchnet 0:525baf7de2db 132 LCONT:
kirchnet 0:525baf7de2db 133 /*
kirchnet 0:525baf7de2db 134 C
kirchnet 0:525baf7de2db 135 C Start benchmark timing at this point.
kirchnet 0:525baf7de2db 136 C
kirchnet 0:525baf7de2db 137 */
kirchnet 0:525baf7de2db 138 startsec = time(0);
kirchnet 0:525baf7de2db 139
kirchnet 0:525baf7de2db 140 /*
kirchnet 0:525baf7de2db 141 C
kirchnet 0:525baf7de2db 142 C The actual benchmark starts here.
kirchnet 0:525baf7de2db 143 C
kirchnet 0:525baf7de2db 144 */
kirchnet 0:525baf7de2db 145 T = .499975;
kirchnet 0:525baf7de2db 146 T1 = 0.50025;
kirchnet 0:525baf7de2db 147 T2 = 2.0;
kirchnet 0:525baf7de2db 148 /*
kirchnet 0:525baf7de2db 149 C
kirchnet 0:525baf7de2db 150 C With loopcount LOOP=10, one million Whetstone instructions
kirchnet 0:525baf7de2db 151 C will be executed in EACH MAJOR LOOP..A MAJOR LOOP IS EXECUTED
kirchnet 0:525baf7de2db 152 C 'II' TIMES TO INCREASE WALL-CLOCK TIMING ACCURACY.
kirchnet 0:525baf7de2db 153 C
kirchnet 0:525baf7de2db 154 LOOP = 1000;
kirchnet 0:525baf7de2db 155 */
kirchnet 0:525baf7de2db 156 LOOP = loopstart;
kirchnet 0:525baf7de2db 157 II = 1;
kirchnet 0:525baf7de2db 158
kirchnet 0:525baf7de2db 159 JJ = 1;
kirchnet 0:525baf7de2db 160
kirchnet 0:525baf7de2db 161 IILOOP:
kirchnet 0:525baf7de2db 162 N1 = 0;
kirchnet 0:525baf7de2db 163 N2 = 12 * LOOP;
kirchnet 0:525baf7de2db 164 N3 = 14 * LOOP;
kirchnet 0:525baf7de2db 165 N4 = 345 * LOOP;
kirchnet 0:525baf7de2db 166 N6 = 210 * LOOP;
kirchnet 0:525baf7de2db 167 N7 = 32 * LOOP;
kirchnet 0:525baf7de2db 168 N8 = 899 * LOOP;
kirchnet 0:525baf7de2db 169 N9 = 616 * LOOP;
kirchnet 0:525baf7de2db 170 N10 = 0;
kirchnet 0:525baf7de2db 171 N11 = 93 * LOOP;
kirchnet 0:525baf7de2db 172 /*
kirchnet 0:525baf7de2db 173 C
kirchnet 0:525baf7de2db 174 C Module 1: Simple identifiers
kirchnet 0:525baf7de2db 175 C
kirchnet 0:525baf7de2db 176 */
kirchnet 0:525baf7de2db 177 X1 = 1.0;
kirchnet 0:525baf7de2db 178 X2 = -1.0;
kirchnet 0:525baf7de2db 179 X3 = -1.0;
kirchnet 0:525baf7de2db 180 X4 = -1.0;
kirchnet 0:525baf7de2db 181
kirchnet 0:525baf7de2db 182 for (I = 1; I <= N1; I++) {
kirchnet 0:525baf7de2db 183 X1 = (X1 + X2 + X3 - X4) * T;
kirchnet 0:525baf7de2db 184 X2 = (X1 + X2 - X3 + X4) * T;
kirchnet 0:525baf7de2db 185 X3 = (X1 - X2 + X3 + X4) * T;
kirchnet 0:525baf7de2db 186 X4 = (-X1+ X2 + X3 + X4) * T;
kirchnet 0:525baf7de2db 187 }
kirchnet 0:525baf7de2db 188 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 189 IF (JJ==II)POUT(N1,N1,N1,X1,X2,X3,X4);
kirchnet 0:525baf7de2db 190 #endif
kirchnet 0:525baf7de2db 191
kirchnet 0:525baf7de2db 192 /*
kirchnet 0:525baf7de2db 193 C
kirchnet 0:525baf7de2db 194 C Module 2: Array elements
kirchnet 0:525baf7de2db 195 C
kirchnet 0:525baf7de2db 196 */
kirchnet 0:525baf7de2db 197 E1[1] = 1.0;
kirchnet 0:525baf7de2db 198 E1[2] = -1.0;
kirchnet 0:525baf7de2db 199 E1[3] = -1.0;
kirchnet 0:525baf7de2db 200 E1[4] = -1.0;
kirchnet 0:525baf7de2db 201
kirchnet 0:525baf7de2db 202 for (I = 1; I <= N2; I++) {
kirchnet 0:525baf7de2db 203 E1[1] = ( E1[1] + E1[2] + E1[3] - E1[4]) * T;
kirchnet 0:525baf7de2db 204 E1[2] = ( E1[1] + E1[2] - E1[3] + E1[4]) * T;
kirchnet 0:525baf7de2db 205 E1[3] = ( E1[1] - E1[2] + E1[3] + E1[4]) * T;
kirchnet 0:525baf7de2db 206 E1[4] = (-E1[1] + E1[2] + E1[3] + E1[4]) * T;
kirchnet 0:525baf7de2db 207 }
kirchnet 0:525baf7de2db 208
kirchnet 0:525baf7de2db 209 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 210 IF (JJ==II)POUT(N2,N3,N2,E1[1],E1[2],E1[3],E1[4]);
kirchnet 0:525baf7de2db 211 #endif
kirchnet 0:525baf7de2db 212
kirchnet 0:525baf7de2db 213 /*
kirchnet 0:525baf7de2db 214 C
kirchnet 0:525baf7de2db 215 C Module 3: Array as parameter
kirchnet 0:525baf7de2db 216 C
kirchnet 0:525baf7de2db 217 */
kirchnet 0:525baf7de2db 218 for (I = 1; I <= N3; I++)
kirchnet 0:525baf7de2db 219 PA(E1);
kirchnet 0:525baf7de2db 220
kirchnet 0:525baf7de2db 221 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 222 IF (JJ==II)POUT(N3,N2,N2,E1[1],E1[2],E1[3],E1[4]);
kirchnet 0:525baf7de2db 223 #endif
kirchnet 0:525baf7de2db 224
kirchnet 0:525baf7de2db 225 /*
kirchnet 0:525baf7de2db 226 C
kirchnet 0:525baf7de2db 227 C Module 4: Conditional jumps
kirchnet 0:525baf7de2db 228 C
kirchnet 0:525baf7de2db 229 */
kirchnet 0:525baf7de2db 230 J = 1;
kirchnet 0:525baf7de2db 231 for (I = 1; I <= N4; I++) {
kirchnet 0:525baf7de2db 232 if (J == 1)
kirchnet 0:525baf7de2db 233 J = 2;
kirchnet 0:525baf7de2db 234 else
kirchnet 0:525baf7de2db 235 J = 3;
kirchnet 0:525baf7de2db 236
kirchnet 0:525baf7de2db 237 if (J > 2)
kirchnet 0:525baf7de2db 238 J = 0;
kirchnet 0:525baf7de2db 239 else
kirchnet 0:525baf7de2db 240 J = 1;
kirchnet 0:525baf7de2db 241
kirchnet 0:525baf7de2db 242 if (J < 1)
kirchnet 0:525baf7de2db 243 J = 1;
kirchnet 0:525baf7de2db 244 else
kirchnet 0:525baf7de2db 245 J = 0;
kirchnet 0:525baf7de2db 246 }
kirchnet 0:525baf7de2db 247
kirchnet 0:525baf7de2db 248 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 249 IF (JJ==II)POUT(N4,J,J,X1,X2,X3,X4);
kirchnet 0:525baf7de2db 250 #endif
kirchnet 0:525baf7de2db 251
kirchnet 0:525baf7de2db 252 /*
kirchnet 0:525baf7de2db 253 C
kirchnet 0:525baf7de2db 254 C Module 5: Omitted
kirchnet 0:525baf7de2db 255 C Module 6: Integer arithmetic
kirchnet 0:525baf7de2db 256 C
kirchnet 0:525baf7de2db 257 */
kirchnet 0:525baf7de2db 258
kirchnet 0:525baf7de2db 259 J = 1;
kirchnet 0:525baf7de2db 260 K = 2;
kirchnet 0:525baf7de2db 261 L = 3;
kirchnet 0:525baf7de2db 262
kirchnet 0:525baf7de2db 263 for (I = 1; I <= N6; I++) {
kirchnet 0:525baf7de2db 264 J = J * (K-J) * (L-K);
kirchnet 0:525baf7de2db 265 K = L * K - (L-J) * K;
kirchnet 0:525baf7de2db 266 L = (L-K) * (K+J);
kirchnet 0:525baf7de2db 267 E1[L-1] = J + K + L;
kirchnet 0:525baf7de2db 268 E1[K-1] = J * K * L;
kirchnet 0:525baf7de2db 269 }
kirchnet 0:525baf7de2db 270
kirchnet 0:525baf7de2db 271 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 272 IF (JJ==II)POUT(N6,J,K,E1[1],E1[2],E1[3],E1[4]);
kirchnet 0:525baf7de2db 273 #endif
kirchnet 0:525baf7de2db 274
kirchnet 0:525baf7de2db 275 /*
kirchnet 0:525baf7de2db 276 C
kirchnet 0:525baf7de2db 277 C Module 7: Trigonometric functions
kirchnet 0:525baf7de2db 278 C
kirchnet 0:525baf7de2db 279 */
kirchnet 0:525baf7de2db 280 X = 0.5;
kirchnet 0:525baf7de2db 281 Y = 0.5;
kirchnet 0:525baf7de2db 282
kirchnet 0:525baf7de2db 283 for (I = 1; I <= N7; I++) {
kirchnet 0:525baf7de2db 284 X = T * DATAN(T2*DSIN(X)*DCOS(X)/(DCOS(X+Y)+DCOS(X-Y)-1.0));
kirchnet 0:525baf7de2db 285 Y = T * DATAN(T2*DSIN(Y)*DCOS(Y)/(DCOS(X+Y)+DCOS(X-Y)-1.0));
kirchnet 0:525baf7de2db 286 }
kirchnet 0:525baf7de2db 287
kirchnet 0:525baf7de2db 288 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 289 IF (JJ==II)POUT(N7,J,K,X,X,Y,Y);
kirchnet 0:525baf7de2db 290 #endif
kirchnet 0:525baf7de2db 291
kirchnet 0:525baf7de2db 292 /*
kirchnet 0:525baf7de2db 293 C
kirchnet 0:525baf7de2db 294 C Module 8: Procedure calls
kirchnet 0:525baf7de2db 295 C
kirchnet 0:525baf7de2db 296 */
kirchnet 0:525baf7de2db 297 X = 1.0;
kirchnet 0:525baf7de2db 298 Y = 1.0;
kirchnet 0:525baf7de2db 299 Z = 1.0;
kirchnet 0:525baf7de2db 300
kirchnet 0:525baf7de2db 301 for (I = 1; I <= N8; I++)
kirchnet 0:525baf7de2db 302 P3(X,Y,&Z);
kirchnet 0:525baf7de2db 303
kirchnet 0:525baf7de2db 304 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 305 IF (JJ==II)POUT(N8,J,K,X,Y,Z,Z);
kirchnet 0:525baf7de2db 306 #endif
kirchnet 0:525baf7de2db 307
kirchnet 0:525baf7de2db 308 /*
kirchnet 0:525baf7de2db 309 C
kirchnet 0:525baf7de2db 310 C Module 9: Array references
kirchnet 0:525baf7de2db 311 C
kirchnet 0:525baf7de2db 312 */
kirchnet 0:525baf7de2db 313 J = 1;
kirchnet 0:525baf7de2db 314 K = 2;
kirchnet 0:525baf7de2db 315 L = 3;
kirchnet 0:525baf7de2db 316 E1[1] = 1.0;
kirchnet 0:525baf7de2db 317 E1[2] = 2.0;
kirchnet 0:525baf7de2db 318 E1[3] = 3.0;
kirchnet 0:525baf7de2db 319
kirchnet 0:525baf7de2db 320 for (I = 1; I <= N9; I++)
kirchnet 0:525baf7de2db 321 P0();
kirchnet 0:525baf7de2db 322
kirchnet 0:525baf7de2db 323 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 324 IF (JJ==II)POUT(N9,J,K,E1[1],E1[2],E1[3],E1[4]);
kirchnet 0:525baf7de2db 325 #endif
kirchnet 0:525baf7de2db 326
kirchnet 0:525baf7de2db 327 /*
kirchnet 0:525baf7de2db 328 C
kirchnet 0:525baf7de2db 329 C Module 10: Integer arithmetic
kirchnet 0:525baf7de2db 330 C
kirchnet 0:525baf7de2db 331 */
kirchnet 0:525baf7de2db 332 J = 2;
kirchnet 0:525baf7de2db 333 K = 3;
kirchnet 0:525baf7de2db 334
kirchnet 0:525baf7de2db 335 for (I = 1; I <= N10; I++) {
kirchnet 0:525baf7de2db 336 J = J + K;
kirchnet 0:525baf7de2db 337 K = J + K;
kirchnet 0:525baf7de2db 338 J = K - J;
kirchnet 0:525baf7de2db 339 K = K - J - J;
kirchnet 0:525baf7de2db 340 }
kirchnet 0:525baf7de2db 341
kirchnet 0:525baf7de2db 342 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 343 IF (JJ==II)POUT(N10,J,K,X1,X2,X3,X4);
kirchnet 0:525baf7de2db 344 #endif
kirchnet 0:525baf7de2db 345
kirchnet 0:525baf7de2db 346 /*
kirchnet 0:525baf7de2db 347 C
kirchnet 0:525baf7de2db 348 C Module 11: Standard functions
kirchnet 0:525baf7de2db 349 C
kirchnet 0:525baf7de2db 350 */
kirchnet 0:525baf7de2db 351 X = 0.75;
kirchnet 0:525baf7de2db 352
kirchnet 0:525baf7de2db 353 for (I = 1; I <= N11; I++)
kirchnet 0:525baf7de2db 354 X = DSQRT(DEXP(DLOG(X)/T1));
kirchnet 0:525baf7de2db 355
kirchnet 0:525baf7de2db 356 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 357 IF (JJ==II)POUT(N11,J,K,X,X,X,X);
kirchnet 0:525baf7de2db 358 #endif
kirchnet 0:525baf7de2db 359
kirchnet 0:525baf7de2db 360 /*
kirchnet 0:525baf7de2db 361 C
kirchnet 0:525baf7de2db 362 C THIS IS THE END OF THE MAJOR LOOP.
kirchnet 0:525baf7de2db 363 C
kirchnet 0:525baf7de2db 364 */
kirchnet 0:525baf7de2db 365 if (++JJ <= II)
kirchnet 0:525baf7de2db 366 goto IILOOP;
kirchnet 0:525baf7de2db 367
kirchnet 0:525baf7de2db 368 /*
kirchnet 0:525baf7de2db 369 C
kirchnet 0:525baf7de2db 370 C Stop benchmark timing at this point.
kirchnet 0:525baf7de2db 371 C
kirchnet 0:525baf7de2db 372 */
kirchnet 0:525baf7de2db 373 finisec = time(0);
kirchnet 0:525baf7de2db 374
kirchnet 0:525baf7de2db 375 /*
kirchnet 0:525baf7de2db 376 C----------------------------------------------------------------
kirchnet 0:525baf7de2db 377 C Performance in Whetstone KIP's per second is given by
kirchnet 0:525baf7de2db 378 C
kirchnet 0:525baf7de2db 379 C (100*LOOP*II)/TIME
kirchnet 0:525baf7de2db 380 C
kirchnet 0:525baf7de2db 381 C where TIME is in seconds.
kirchnet 0:525baf7de2db 382 C--------------------------------------------------------------------
kirchnet 0:525baf7de2db 383 */
kirchnet 0:525baf7de2db 384 pc.printf("\n");
kirchnet 0:525baf7de2db 385 if (finisec-startsec <= 0) {
kirchnet 0:525baf7de2db 386 pc.printf("Insufficient duration- Increase the LOOP count\n");
kirchnet 0:525baf7de2db 387 return(1);
kirchnet 0:525baf7de2db 388 }
kirchnet 0:525baf7de2db 389
kirchnet 0:525baf7de2db 390 pc.printf("Loops: %ld, Iterations: %d, Duration: %ld sec.\n",
kirchnet 0:525baf7de2db 391 LOOP, II, finisec-startsec);
kirchnet 0:525baf7de2db 392
kirchnet 0:525baf7de2db 393 KIPS = (100.0*LOOP*II)/(float)(finisec-startsec);
kirchnet 0:525baf7de2db 394 if (KIPS >= 1000.0)
kirchnet 0:525baf7de2db 395 pc.printf("C Converted Double Precision Whetstones: %.1f MIPS\n", KIPS/1000.0);
kirchnet 0:525baf7de2db 396 else
kirchnet 0:525baf7de2db 397 pc.printf("C Converted Double Precision Whetstones: %.1f KIPS\n", KIPS);
kirchnet 0:525baf7de2db 398
kirchnet 0:525baf7de2db 399 if (continuous)
kirchnet 0:525baf7de2db 400 goto LCONT;
kirchnet 0:525baf7de2db 401
kirchnet 0:525baf7de2db 402 return(0);
kirchnet 0:525baf7de2db 403 }
kirchnet 0:525baf7de2db 404
kirchnet 0:525baf7de2db 405 void
kirchnet 0:525baf7de2db 406 PA(double E[])
kirchnet 0:525baf7de2db 407 {
kirchnet 0:525baf7de2db 408 J = 0;
kirchnet 0:525baf7de2db 409
kirchnet 0:525baf7de2db 410 L10:
kirchnet 0:525baf7de2db 411 E[1] = ( E[1] + E[2] + E[3] - E[4]) * T;
kirchnet 0:525baf7de2db 412 E[2] = ( E[1] + E[2] - E[3] + E[4]) * T;
kirchnet 0:525baf7de2db 413 E[3] = ( E[1] - E[2] + E[3] + E[4]) * T;
kirchnet 0:525baf7de2db 414 E[4] = (-E[1] + E[2] + E[3] + E[4]) / T2;
kirchnet 0:525baf7de2db 415 J += 1;
kirchnet 0:525baf7de2db 416
kirchnet 0:525baf7de2db 417 if (J < 6)
kirchnet 0:525baf7de2db 418 goto L10;
kirchnet 0:525baf7de2db 419 }
kirchnet 0:525baf7de2db 420
kirchnet 0:525baf7de2db 421 void
kirchnet 0:525baf7de2db 422 P0(void)
kirchnet 0:525baf7de2db 423 {
kirchnet 0:525baf7de2db 424 E1[J] = E1[K];
kirchnet 0:525baf7de2db 425 E1[K] = E1[L];
kirchnet 0:525baf7de2db 426 E1[L] = E1[J];
kirchnet 0:525baf7de2db 427 }
kirchnet 0:525baf7de2db 428
kirchnet 0:525baf7de2db 429 void
kirchnet 0:525baf7de2db 430 P3(double X, double Y, double *Z)
kirchnet 0:525baf7de2db 431 {
kirchnet 0:525baf7de2db 432 double X1, Y1;
kirchnet 0:525baf7de2db 433
kirchnet 0:525baf7de2db 434 X1 = X;
kirchnet 0:525baf7de2db 435 Y1 = Y;
kirchnet 0:525baf7de2db 436 X1 = T * (X1 + Y1);
kirchnet 0:525baf7de2db 437 Y1 = T * (X1 + Y1);
kirchnet 0:525baf7de2db 438 *Z = (X1 + Y1) / T2;
kirchnet 0:525baf7de2db 439 }
kirchnet 0:525baf7de2db 440
kirchnet 0:525baf7de2db 441 #ifdef PRINTOUT
kirchnet 0:525baf7de2db 442 void
kirchnet 0:525baf7de2db 443 POUT(long N, long J, long K, double X1, double X2, double X3, double X4)
kirchnet 0:525baf7de2db 444 {
kirchnet 0:525baf7de2db 445 pc.printf("%7ld %7ld %7ld %12.4e %12.4e %12.4e %12.4e\n",
kirchnet 0:525baf7de2db 446 N, J, K, X1, X2, X3, X4);
kirchnet 0:525baf7de2db 447 }
kirchnet 0:525baf7de2db 448 #endif
kirchnet 0:525baf7de2db 449