annotate src/fftw-3.3.5/libbench2/allocate.c @ 127:7867fa7e1b6b

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