Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ST_401_84MHZ mbed
arduino.txt@0:525baf7de2db, 2014-04-28 (annotated)
- 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?
User | Revision | Line number | New 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 |