annotate fft/fftw/fftw-3.3.4/libbench2/allocate.c @ 40:223f770b5341 kissfft-double tip

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