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
whetstone.cpp@0:525baf7de2db, 2014-04-28 (annotated)
- 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?
| User | Revision | Line number | New 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 |