Chris@10
|
1 /* not worth copyrighting */
|
Chris@10
|
2
|
Chris@10
|
3
|
Chris@10
|
4 #include "bench.h"
|
Chris@10
|
5
|
Chris@10
|
6 static void bounds(bench_problem *p, int *ilb, int *iub, int *olb, int *oub)
|
Chris@10
|
7 {
|
Chris@10
|
8 bench_tensor *t = tensor_append(p->sz, p->vecsz);
|
Chris@10
|
9 tensor_ibounds(t, ilb, iub);
|
Chris@10
|
10 tensor_obounds(t, olb, oub);
|
Chris@10
|
11 tensor_destroy(t);
|
Chris@10
|
12 }
|
Chris@10
|
13
|
Chris@10
|
14 /*
|
Chris@10
|
15 * Allocate I/O arrays for a problem.
|
Chris@10
|
16 *
|
Chris@10
|
17 * This is the default routine that can be overridden by the user in
|
Chris@10
|
18 * complicated cases.
|
Chris@10
|
19 */
|
Chris@10
|
20 void problem_alloc(bench_problem *p)
|
Chris@10
|
21 {
|
Chris@10
|
22 int ilb, iub, olb, oub;
|
Chris@10
|
23 int isz, osz;
|
Chris@10
|
24
|
Chris@10
|
25 bounds(p, &ilb, &iub, &olb, &oub);
|
Chris@10
|
26 isz = iub - ilb;
|
Chris@10
|
27 osz = oub - olb;
|
Chris@10
|
28
|
Chris@10
|
29 if (p->kind == PROBLEM_COMPLEX) {
|
Chris@10
|
30 bench_complex *in, *out;
|
Chris@10
|
31
|
Chris@10
|
32 p->iphyssz = isz;
|
Chris@10
|
33 p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
|
Chris@10
|
34 p->in = in - ilb;
|
Chris@10
|
35
|
Chris@10
|
36 if (p->in_place) {
|
Chris@10
|
37 p->out = p->in;
|
Chris@10
|
38 p->outphys = p->inphys;
|
Chris@10
|
39 p->ophyssz = p->iphyssz;
|
Chris@10
|
40 } else {
|
Chris@10
|
41 p->ophyssz = osz;
|
Chris@10
|
42 p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
|
Chris@10
|
43 p->out = out - olb;
|
Chris@10
|
44 }
|
Chris@10
|
45 } else if (p->kind == PROBLEM_R2R) {
|
Chris@10
|
46 bench_real *in, *out;
|
Chris@10
|
47
|
Chris@10
|
48 p->iphyssz = isz;
|
Chris@10
|
49 p->inphys = in = (bench_real *) bench_malloc(isz * sizeof(bench_real));
|
Chris@10
|
50 p->in = in - ilb;
|
Chris@10
|
51
|
Chris@10
|
52 if (p->in_place) {
|
Chris@10
|
53 p->out = p->in;
|
Chris@10
|
54 p->outphys = p->inphys;
|
Chris@10
|
55 p->ophyssz = p->iphyssz;
|
Chris@10
|
56 } else {
|
Chris@10
|
57 p->ophyssz = osz;
|
Chris@10
|
58 p->outphys = out = (bench_real *) bench_malloc(osz * sizeof(bench_real));
|
Chris@10
|
59 p->out = out - olb;
|
Chris@10
|
60 }
|
Chris@10
|
61 } else if (p->kind == PROBLEM_REAL && p->sign < 0) { /* R2HC */
|
Chris@10
|
62 bench_real *in;
|
Chris@10
|
63 bench_complex *out;
|
Chris@10
|
64
|
Chris@10
|
65 isz = isz > osz*2 ? isz : osz*2;
|
Chris@10
|
66 p->iphyssz = isz;
|
Chris@10
|
67 p->inphys = in = (bench_real *) bench_malloc(p->iphyssz * sizeof(bench_real));
|
Chris@10
|
68 p->in = in - ilb;
|
Chris@10
|
69
|
Chris@10
|
70 if (p->in_place) {
|
Chris@10
|
71 p->out = p->in;
|
Chris@10
|
72 p->outphys = p->inphys;
|
Chris@10
|
73 p->ophyssz = p->iphyssz / 2;
|
Chris@10
|
74 } else {
|
Chris@10
|
75 p->ophyssz = osz;
|
Chris@10
|
76 p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
|
Chris@10
|
77 p->out = out - olb;
|
Chris@10
|
78 }
|
Chris@10
|
79 } else if (p->kind == PROBLEM_REAL && p->sign > 0) { /* HC2R */
|
Chris@10
|
80 bench_real *out;
|
Chris@10
|
81 bench_complex *in;
|
Chris@10
|
82
|
Chris@10
|
83 osz = osz > isz*2 ? osz : isz*2;
|
Chris@10
|
84 p->ophyssz = osz;
|
Chris@10
|
85 p->outphys = out = (bench_real *) bench_malloc(p->ophyssz * sizeof(bench_real));
|
Chris@10
|
86 p->out = out - olb;
|
Chris@10
|
87
|
Chris@10
|
88 if (p->in_place) {
|
Chris@10
|
89 p->in = p->out;
|
Chris@10
|
90 p->inphys = p->outphys;
|
Chris@10
|
91 p->iphyssz = p->ophyssz / 2;
|
Chris@10
|
92 } else {
|
Chris@10
|
93 p->iphyssz = isz;
|
Chris@10
|
94 p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
|
Chris@10
|
95 p->in = in - ilb;
|
Chris@10
|
96 }
|
Chris@10
|
97 } else {
|
Chris@10
|
98 BENCH_ASSERT(0); /* TODO */
|
Chris@10
|
99 }
|
Chris@10
|
100 }
|
Chris@10
|
101
|
Chris@10
|
102 void problem_free(bench_problem *p)
|
Chris@10
|
103 {
|
Chris@10
|
104 if (p->outphys && p->outphys != p->inphys)
|
Chris@10
|
105 bench_free(p->outphys);
|
Chris@10
|
106 if (p->inphys)
|
Chris@10
|
107 bench_free(p->inphys);
|
Chris@10
|
108 tensor_destroy(p->sz);
|
Chris@10
|
109 tensor_destroy(p->vecsz);
|
Chris@10
|
110 }
|