annotate src/fftw-3.3.3/libbench2/allocate.c @ 10:37bf6b4a2645

Add FFTW3
author Chris Cannam
date Wed, 20 Mar 2013 15:35:50 +0000
parents
children
rev   line source
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 }