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