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