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