Logo Search packages:      
Sourcecode: blender version File versions  Download package

allocate.c

/* not worth copyrighting */

/* $Id: allocate.c,v 1.8 2006-01-05 03:04:27 stevenj Exp $ */

#include "bench.h"

static void bounds(bench_problem *p, int *ilb, int *iub, int *olb, int *oub)
{
     bench_tensor *t = tensor_append(p->sz, p->vecsz);
     tensor_ibounds(t, ilb, iub);
     tensor_obounds(t, olb, oub);
     tensor_destroy(t);
}

/*
 * Allocate I/O arrays for a problem.
 *
 * This is the default routine that can be overridden by the user in
 * complicated cases.
 */
void problem_alloc(bench_problem *p)
{
     int ilb, iub, olb, oub;
     int isz, osz;

     bounds(p, &ilb, &iub, &olb, &oub);
     isz = iub - ilb;
     osz = oub - olb;

     if (p->kind == PROBLEM_COMPLEX) {
        bench_complex *in, *out;

        p->iphyssz = isz;
        p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
        p->in = in - ilb;
        
        if (p->in_place) {
             p->out = p->in;
             p->outphys = p->inphys;
             p->ophyssz = p->iphyssz;
        } else {
             p->ophyssz = osz;
             p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
             p->out = out - olb;
        }
     } else if (p->kind == PROBLEM_R2R) {
        bench_real *in, *out;

        p->iphyssz = isz;
        p->inphys = in = (bench_real *) bench_malloc(isz * sizeof(bench_real));
        p->in = in - ilb;
        
        if (p->in_place) {
             p->out = p->in;
             p->outphys = p->inphys;
             p->ophyssz = p->iphyssz;
        } else {
             p->ophyssz = osz;
             p->outphys = out = (bench_real *) bench_malloc(osz * sizeof(bench_real));
             p->out = out - olb;
        }
     } else if (p->kind == PROBLEM_REAL && p->sign < 0) { /* R2HC */
        bench_real *in;
        bench_complex *out;

        p->iphyssz = p->in_place ? (isz > osz*2 ? isz : osz*2) : isz;
        p->inphys = in = (bench_real *) bench_malloc(p->iphyssz * sizeof(bench_real));
        p->in = in - ilb;
        
        if (p->in_place) {
             p->out = p->in;
             p->outphys = p->inphys;
             p->ophyssz = p->iphyssz / 2;
        } else {
             p->ophyssz = osz;
             p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex));
             p->out = out - olb;
        }
     } else if (p->kind == PROBLEM_REAL && p->sign > 0) { /* HC2R */
        bench_real *out;
        bench_complex *in;

        p->ophyssz = p->in_place ? (osz > isz*2 ? osz : isz*2) : osz;
        p->outphys = out = (bench_real *) bench_malloc(p->ophyssz * sizeof(bench_real));
        p->out = out - olb;
        
        if (p->in_place) {
             p->in = p->out;
             p->inphys = p->outphys;
             p->iphyssz = p->ophyssz / 2;
        } else {
             p->iphyssz = isz;
             p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex));
             p->in = in - ilb;
        }
     } else {
        BENCH_ASSERT(0); /* TODO */
     }
}

void problem_free(bench_problem *p)
{
     if (p->outphys && p->outphys != p->inphys)
        bench_free(p->outphys);
     if (p->inphys)
        bench_free(p->inphys);
     tensor_destroy(p->sz);
     tensor_destroy(p->vecsz);
}

Generated by  Doxygen 1.6.0   Back to index