111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* not worth copyrighting */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #include "libbench2/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; | ||
|  | 
 | ||
|  | 	  isz = isz > osz*2 ? isz : osz*2; | ||
|  | 	  p->iphyssz = 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; | ||
|  | 
 | ||
|  | 	  osz = osz > isz*2 ? osz : isz*2; | ||
|  | 	  p->ophyssz = 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); | ||
|  | } |