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