diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fftw-3.3.3/libbench2/allocate.c	Wed Mar 20 15:35:50 2013 +0000
@@ -0,0 +1,110 @@
+/* not worth copyrighting */
+
+
+#include "bench.h"
+
+static void bounds(bench_problem *p, int *ilb, int *iub, int *olb, int *oub)
+{
+     bench_tensor *t = tensor_append(p->sz, p->vecsz);
+     tensor_ibounds(t, ilb, iub);
+     tensor_obounds(t, olb, oub);
+     tensor_destroy(t);
+}
+
+/*
+ * Allocate I/O arrays for a problem.
+ *
+ * This is the default routine that can be overridden by the user in
+ * complicated cases.
+ */
+void problem_alloc(bench_problem *p)
+{
+     int ilb, iub, olb, oub;
+     int isz, osz;
+
+     bounds(p, &ilb, &iub, &olb, &oub);
+     isz = iub - ilb;
+     osz = oub - olb;
+
+     if (p->kind == PROBLEM_COMPLEX) {
+	  bench_complex *in, *out;
+
+	  p->iphyssz = isz;
+	  p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
+	  p->in = in - ilb;
+	  
+	  if (p->in_place) {
+	       p->out = p->in;
+	       p->outphys = p->inphys;
+	       p->ophyssz = p->iphyssz;
+	  } else {
+	       p->ophyssz = osz;
+	       p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
+	       p->out = out - olb;
+	  }
+     } else if (p->kind == PROBLEM_R2R) {
+	  bench_real *in, *out;
+
+	  p->iphyssz = isz;
+	  p->inphys = in = (bench_real *) bench_malloc(isz * sizeof(bench_real));
+	  p->in = in - ilb;
+	  
+	  if (p->in_place) {
+	       p->out = p->in;
+	       p->outphys = p->inphys;
+	       p->ophyssz = p->iphyssz;
+	  } else {
+	       p->ophyssz = osz;
+	       p->outphys = out = (bench_real *) bench_malloc(osz * sizeof(bench_real));
+	       p->out = out - olb;
+	  }
+     } else if (p->kind == PROBLEM_REAL && p->sign < 0) { /* R2HC */
+	  bench_real *in;
+	  bench_complex *out;
+
+	  isz = isz > osz*2 ? isz : osz*2;
+	  p->iphyssz = isz;
+	  p->inphys = in = (bench_real *) bench_malloc(p->iphyssz * sizeof(bench_real));
+	  p->in = in - ilb;
+	  
+	  if (p->in_place) {
+	       p->out = p->in;
+	       p->outphys = p->inphys;
+	       p->ophyssz = p->iphyssz / 2;
+	  } else {
+	       p->ophyssz = osz;
+	       p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
+	       p->out = out - olb;
+	  }
+     } else if (p->kind == PROBLEM_REAL && p->sign > 0) { /* HC2R */
+	  bench_real *out;
+	  bench_complex *in;
+
+	  osz = osz > isz*2 ? osz : isz*2;
+	  p->ophyssz = osz;
+	  p->outphys = out = (bench_real *) bench_malloc(p->ophyssz * sizeof(bench_real));
+	  p->out = out - olb;
+	  
+	  if (p->in_place) {
+	       p->in = p->out;
+	       p->inphys = p->outphys;
+	       p->iphyssz = p->ophyssz / 2;
+	  } else {
+	       p->iphyssz = isz;
+	       p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
+	       p->in = in - ilb;
+	  }
+     } else {
+	  BENCH_ASSERT(0); /* TODO */
+     }
+}
+
+void problem_free(bench_problem *p)
+{
+     if (p->outphys && p->outphys != p->inphys)
+	  bench_free(p->outphys);
+     if (p->inphys)
+	  bench_free(p->inphys);
+     tensor_destroy(p->sz);
+     tensor_destroy(p->vecsz);
+}