43
void loop12_f77(const int& N, double* y, double* a, double* x, double* b, double* c, double* d, const double& u);
45
void loop12_f77overhead(const int& N, double* y, double* a, double* x, double* b, double* c, double* d, const double& u);
47
void loop12_f90(const int& N, double* y, double* a, double* x, double* b, double* c, double* d, const double& u);
49
void loop12_f90overhead(const int& N, double* y, double* a, double* x, double* b, double* c, double* d, const double& u);
42
void loop12_f77(const int& N, double* y, double* x, double* a, double* b, double* c, double* d, const double& u);
43
void loop12_f77overhead(const int& N, double* y, double* x, double* a, double* b, double* c, double* d, const double& u);
44
void loop12_f90(const int& N, double* y, double* x, double* a, double* b, double* c, double* d, const double& u);
45
void loop12_f90overhead(const int& N, double* y, double* x, double* a, double* b, double* c, double* d, const double& u);
53
49
void VectorVersion(BenchmarkExt<int>& bench, double u);
54
50
void ArrayVersion(BenchmarkExt<int>& bench, double u);
51
void ArrayVersion_unaligned(BenchmarkExt<int>& bench, double u);
52
void ArrayVersion_misaligned(BenchmarkExt<int>& bench, double u);
53
void ArrayVersion_index(BenchmarkExt<int>& bench, double u);
54
void doTinyVectorVersion(BenchmarkExt<int>& bench, double u);
55
55
void F77Version(BenchmarkExt<int>& bench, double u);
57
57
void F90Version(BenchmarkExt<int>& bench, double u);
60
60
void ValarrayVersion(BenchmarkExt<int>& bench, double u);
63
const int numSizes = 80;
64
const bool runvector=false; // no point as long as Vector is Array<1>
67
68
int numBenchmarks = 5;
68
#ifndef BENCHMARK_VALARRAY
69
numBenchmarks--; // No valarray
72
numBenchmarks--; // No fortran 90
75
BenchmarkExt<int> bench("loop12: $y=u+$a;$x=$a+$b+$c+$d", numBenchmarks);
77
const int numSizes = 23;
69
if (runvector) numBenchmarks++;
70
#ifdef BENCHMARK_VALARRAY
77
BenchmarkExt<int> bench("loop12: $y = u+$a; $x = $a+$b+$c+$d", numBenchmarks);
78
79
bench.setNumParameters(numSizes);
79
bench.setRateDescription("Mflops/s");
81
Vector<int> parameters(numSizes);
82
Vector<long> iters(numSizes);
83
Vector<double> flops(numSizes);
85
for (int i=0; i < numSizes; ++i)
87
parameters[i] = (int)pow(10.0, (i+1)/4.0);
88
iters[i] = 10000000L / parameters[i];
91
flops[i] = 4 * parameters[i];
81
Array<int,1> parameters(numSizes);
82
Array<long,1> iters(numSizes);
83
Array<double,1> flops(numSizes);
85
parameters=pow(pow(2.,0.25),tensor::i)+tensor::i;
86
flops = 4 * parameters;
87
iters = 100000000L / flops;
88
iters = where(iters<2, 2, iters);
89
cout << iters << endl;
94
91
bench.setParameterVector(parameters);
95
92
bench.setIterations(iters);
96
bench.setFlopsPerIteration(flops);
93
bench.setOpsPerIteration(flops);
94
bench.setDependentVariable("flops");
98
95
bench.beginBenchmarking();
100
97
double u = 0.39123982498157938742;
102
VectorVersion(bench, u);
103
100
ArrayVersion(bench, u);
101
ArrayVersion_unaligned(bench, u);
102
ArrayVersion_misaligned(bench, u);
103
ArrayVersion_index(bench, u);
104
//doTinyVectorVersion(bench, u);
104
105
F77Version(bench, u);
105
106
#ifdef FORTRAN_90
106
107
F90Version(bench, u);
159
161
Vector<double> d(N);
160
162
initializeRandomDouble(d.data(), N);
163
166
for (long i=0; i < iters; ++i)
168
y = u+a; x = a+b+c+d;
170
173
bench.startOverhead();
171
for (long i=0; i < iters; ++i)
174
for (long i=0; i < iters; ++i) {
173
178
bench.stopOverhead();
176
181
bench.endImplementation();
179
void ArrayVersion(BenchmarkExt<int>& bench, double u)
185
void ArrayVersion(BenchmarkExt<int>& bench, double u)
181
187
bench.beginImplementation("Array<T,1>");
183
189
while (!bench.doneImplementationBenchmark())
185
191
int N = bench.getParameter();
186
cout << "Array<T,1>: N = " << N << endl;
189
long iters = bench.getIterations();
191
Array<double, 1> y(N);
192
initializeRandomDouble(y.dataFirst(), N);
193
Array<double, 1> a(N);
194
initializeRandomDouble(a.dataFirst(), N);
195
Array<double, 1> x(N);
196
initializeRandomDouble(x.dataFirst(), N);
197
Array<double, 1> b(N);
198
initializeRandomDouble(b.dataFirst(), N);
199
Array<double, 1> c(N);
200
initializeRandomDouble(c.dataFirst(), N);
201
Array<double, 1> d(N);
202
initializeRandomDouble(d.dataFirst(), N);
205
for (long i=0; i < iters; ++i)
212
bench.startOverhead();
213
for (long i=0; i < iters; ++i)
192
long iters = bench.getIterations();
194
cout << bench.currentImplementation() << ": N = " << N << endl;
196
Array<double,1> y(N);
197
initializeRandomDouble(y.dataFirst(), N);
198
Array<double,1> x(N);
199
initializeRandomDouble(x.dataFirst(), N);
200
Array<double,1> a(N);
201
initializeRandomDouble(a.dataFirst(), N);
202
Array<double,1> b(N);
203
initializeRandomDouble(b.dataFirst(), N);
204
Array<double,1> c(N);
205
initializeRandomDouble(c.dataFirst(), N);
206
Array<double,1> d(N);
207
initializeRandomDouble(d.dataFirst(), N);
211
for (long i=0; i < iters; ++i)
213
y = u+a; x = a+b+c+d;
218
bench.startOverhead();
219
for (long i=0; i < iters; ++i) {
223
bench.stopOverhead();
226
bench.endImplementation();
230
void ArrayVersion_index(BenchmarkExt<int>& bench, double u)
232
bench.beginImplementation("Array<T,1> (indexexpr.)");
234
while (!bench.doneImplementationBenchmark())
236
int N = bench.getParameter();
237
long iters = bench.getIterations();
239
cout << bench.currentImplementation() << ": N = " << N << endl;
241
Array<double,1> y(N);
242
initializeRandomDouble(y.dataFirst(), N);
243
Array<double,1> x(N);
244
initializeRandomDouble(x.dataFirst(), N);
245
Array<double,1> a(N);
246
initializeRandomDouble(a.dataFirst(), N);
247
Array<double,1> b(N);
248
initializeRandomDouble(b.dataFirst(), N);
249
Array<double,1> c(N);
250
initializeRandomDouble(c.dataFirst(), N);
251
Array<double,1> d(N);
252
initializeRandomDouble(d.dataFirst(), N);
256
for (long i=0; i < iters; ++i)
258
y = u+a(tensor::i); x = a(tensor::i)+b(tensor::i)+c(tensor::i)+d(tensor::i);;
263
bench.startOverhead();
264
for (long i=0; i < iters; ++i) {
268
bench.stopOverhead();
271
bench.endImplementation();
274
void ArrayVersion_unaligned(BenchmarkExt<int>& bench, double u)
276
bench.beginImplementation("Array<T,1> (unal.)");
278
while (!bench.doneImplementationBenchmark())
280
int N = bench.getParameter();
281
long iters = bench.getIterations();
283
cout << bench.currentImplementation() << ": N = " << N << endl;
286
Array<double,1> yfill(N+1);
287
Array<double,1> y(yfill(Range(1,N)));
288
initializeRandomDouble(y.dataFirst(), N);
290
Array<double,1> xfill(N+1);
291
Array<double,1> x(xfill(Range(1,N)));
292
initializeRandomDouble(x.dataFirst(), N);
294
Array<double,1> afill(N+1);
295
Array<double,1> a(afill(Range(1,N)));
296
initializeRandomDouble(a.dataFirst(), N);
298
Array<double,1> bfill(N+1);
299
Array<double,1> b(bfill(Range(1,N)));
300
initializeRandomDouble(b.dataFirst(), N);
302
Array<double,1> cfill(N+1);
303
Array<double,1> c(cfill(Range(1,N)));
304
initializeRandomDouble(c.dataFirst(), N);
306
Array<double,1> dfill(N+1);
307
Array<double,1> d(dfill(Range(1,N)));
308
initializeRandomDouble(d.dataFirst(), N);
312
for (long i=0; i < iters; ++i)
314
y = u+a; x = a+b+c+d;
319
bench.startOverhead();
320
for (long i=0; i < iters; ++i) {
324
bench.stopOverhead();
327
bench.endImplementation();
330
void ArrayVersion_misaligned(BenchmarkExt<int>& bench, double u)
332
bench.beginImplementation("Array<T,1> (misal.)");
334
while (!bench.doneImplementationBenchmark())
336
int N = bench.getParameter();
337
long iters = bench.getIterations();
339
cout << bench.currentImplementation() << ": N = " << N << endl;
342
Array<double,1> yfill(N+6);
343
Array<double,1> y(yfill(Range(0,N+0-1)));
344
initializeRandomDouble(y.dataFirst(), N);
346
Array<double,1> xfill(N+6);
347
Array<double,1> x(xfill(Range(1,N+1-1)));
348
initializeRandomDouble(x.dataFirst(), N);
350
Array<double,1> afill(N+6);
351
Array<double,1> a(afill(Range(2,N+2-1)));
352
initializeRandomDouble(a.dataFirst(), N);
354
Array<double,1> bfill(N+6);
355
Array<double,1> b(bfill(Range(3,N+3-1)));
356
initializeRandomDouble(b.dataFirst(), N);
358
Array<double,1> cfill(N+6);
359
Array<double,1> c(cfill(Range(4,N+4-1)));
360
initializeRandomDouble(c.dataFirst(), N);
362
Array<double,1> dfill(N+6);
363
Array<double,1> d(dfill(Range(5,N+5-1)));
364
initializeRandomDouble(d.dataFirst(), N);
368
for (long i=0; i < iters; ++i)
370
y = u+a; x = a+b+c+d;
375
bench.startOverhead();
376
for (long i=0; i < iters; ++i) {
215
380
bench.stopOverhead();
269
435
while (!bench.doneImplementationBenchmark())
271
437
int N = bench.getParameter();
273
cout << "Fortran 77: N = " << N << endl;
438
cout << bench.currentImplementation() << ": N = " << N << endl;
276
440
int iters = bench.getIterations();
278
442
double* y = new double[N];
279
443
initializeRandomDouble(y, N);
444
double* x = new double[N];
445
initializeRandomDouble(x, N);
280
446
double* a = new double[N];
281
447
initializeRandomDouble(a, N);
282
double* x = new double[N];
283
initializeRandomDouble(x, N);
284
448
double* b = new double[N];
285
449
initializeRandomDouble(b, N);
286
450
double* c = new double[N];
287
451
initializeRandomDouble(c, N);
288
452
double* d = new double[N];
289
453
initializeRandomDouble(d, N);
292
457
for (int iter=0; iter < iters; ++iter)
293
loop12_f77(N, y, a, x, b, c, d, u);
458
loop12_f77(N, y, x, a, b, c, d, u);
296
461
bench.startOverhead();
297
462
for (int iter=0; iter < iters; ++iter)
298
loop12_f77overhead(N, y, a, x, b, c, d, u);
463
loop12_f77overhead(N, y, x, a, b, c, d, u);
300
465
bench.stopOverhead();
309
476
bench.endImplementation();