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