Thomas Kirchner / Mbed 2 deprecated Nucleo_vs_Arduino_Speed_Test

Dependencies:   ST_401_84MHZ mbed

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