cannam@95: /* not worth copyrighting */ cannam@95: cannam@95: cannam@95: #include "bench.h" cannam@95: cannam@95: static void bounds(bench_problem *p, int *ilb, int *iub, int *olb, int *oub) cannam@95: { cannam@95: bench_tensor *t = tensor_append(p->sz, p->vecsz); cannam@95: tensor_ibounds(t, ilb, iub); cannam@95: tensor_obounds(t, olb, oub); cannam@95: tensor_destroy(t); cannam@95: } cannam@95: cannam@95: /* cannam@95: * Allocate I/O arrays for a problem. cannam@95: * cannam@95: * This is the default routine that can be overridden by the user in cannam@95: * complicated cases. cannam@95: */ cannam@95: void problem_alloc(bench_problem *p) cannam@95: { cannam@95: int ilb, iub, olb, oub; cannam@95: int isz, osz; cannam@95: cannam@95: bounds(p, &ilb, &iub, &olb, &oub); cannam@95: isz = iub - ilb; cannam@95: osz = oub - olb; cannam@95: cannam@95: if (p->kind == PROBLEM_COMPLEX) { cannam@95: bench_complex *in, *out; cannam@95: cannam@95: p->iphyssz = isz; cannam@95: p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex)); cannam@95: p->in = in - ilb; cannam@95: cannam@95: if (p->in_place) { cannam@95: p->out = p->in; cannam@95: p->outphys = p->inphys; cannam@95: p->ophyssz = p->iphyssz; cannam@95: } else { cannam@95: p->ophyssz = osz; cannam@95: p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex)); cannam@95: p->out = out - olb; cannam@95: } cannam@95: } else if (p->kind == PROBLEM_R2R) { cannam@95: bench_real *in, *out; cannam@95: cannam@95: p->iphyssz = isz; cannam@95: p->inphys = in = (bench_real *) bench_malloc(isz * sizeof(bench_real)); cannam@95: p->in = in - ilb; cannam@95: cannam@95: if (p->in_place) { cannam@95: p->out = p->in; cannam@95: p->outphys = p->inphys; cannam@95: p->ophyssz = p->iphyssz; cannam@95: } else { cannam@95: p->ophyssz = osz; cannam@95: p->outphys = out = (bench_real *) bench_malloc(osz * sizeof(bench_real)); cannam@95: p->out = out - olb; cannam@95: } cannam@95: } else if (p->kind == PROBLEM_REAL && p->sign < 0) { /* R2HC */ cannam@95: bench_real *in; cannam@95: bench_complex *out; cannam@95: cannam@95: isz = isz > osz*2 ? isz : osz*2; cannam@95: p->iphyssz = isz; cannam@95: p->inphys = in = (bench_real *) bench_malloc(p->iphyssz * sizeof(bench_real)); cannam@95: p->in = in - ilb; cannam@95: cannam@95: if (p->in_place) { cannam@95: p->out = p->in; cannam@95: p->outphys = p->inphys; cannam@95: p->ophyssz = p->iphyssz / 2; cannam@95: } else { cannam@95: p->ophyssz = osz; cannam@95: p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex)); cannam@95: p->out = out - olb; cannam@95: } cannam@95: } else if (p->kind == PROBLEM_REAL && p->sign > 0) { /* HC2R */ cannam@95: bench_real *out; cannam@95: bench_complex *in; cannam@95: cannam@95: osz = osz > isz*2 ? osz : isz*2; cannam@95: p->ophyssz = osz; cannam@95: p->outphys = out = (bench_real *) bench_malloc(p->ophyssz * sizeof(bench_real)); cannam@95: p->out = out - olb; cannam@95: cannam@95: if (p->in_place) { cannam@95: p->in = p->out; cannam@95: p->inphys = p->outphys; cannam@95: p->iphyssz = p->ophyssz / 2; cannam@95: } else { cannam@95: p->iphyssz = isz; cannam@95: p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex)); cannam@95: p->in = in - ilb; cannam@95: } cannam@95: } else { cannam@95: BENCH_ASSERT(0); /* TODO */ cannam@95: } cannam@95: } cannam@95: cannam@95: void problem_free(bench_problem *p) cannam@95: { cannam@95: if (p->outphys && p->outphys != p->inphys) cannam@95: bench_free(p->outphys); cannam@95: if (p->inphys) cannam@95: bench_free(p->inphys); cannam@95: tensor_destroy(p->sz); cannam@95: tensor_destroy(p->vecsz); cannam@95: }