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
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