Beispiel #1
0
/* parse a problem description, return a problem */
bench_problem *problem_parse(const char *s)
{
     bench_problem *p;
     bench_iodim last_iodim0 = {1,1,1}, *last_iodim = &last_iodim0;
     bench_iodim *sz_last_iodim;
     bench_tensor *sz;
     n_transform nti = SAME, nto = SAME;
     int transpose = 0;

     p = (bench_problem *) bench_malloc(sizeof(bench_problem));
     p->kind = PROBLEM_COMPLEX;
     p->k = 0;
     p->sign = -1;
     p->in = p->out = 0;
     p->inphys = p->outphys = 0;
     p->iphyssz = p->ophyssz = 0;
     p->in_place = 0;
     p->destroy_input = 0;
     p->split = 0;
     p->userinfo = 0;
     p->scrambled_in = p->scrambled_out = 0;
     p->sz = p->vecsz = 0;
     p->ini = p->outi = 0;
     p->pstring = (char *) bench_malloc(sizeof(char) * (strlen(s) + 1));
     strcpy(p->pstring, s);

 L1:
     switch (tolower(*s)) {
	 case 'i': p->in_place = 1; ++s; goto L1;
	 case 'o': p->in_place = 0; ++s; goto L1;
	 case 'd': p->destroy_input = 1; ++s; goto L1;
	 case '/': p->split = 1; ++s; goto L1;
	 case 'f': 
	 case '-': p->sign = -1; ++s; goto L1;
	 case 'b': 
	 case '+': p->sign = 1; ++s; goto L1;
	 case 'r': p->kind = PROBLEM_REAL; ++s; goto L1;
	 case 'c': p->kind = PROBLEM_COMPLEX; ++s; goto L1;
	 case 'k': p->kind = PROBLEM_R2R; ++s; goto L1;
	 case 't': transpose = 1; ++s; goto L1;
	      
	 /* hack for MPI: */
	 case '[': p->scrambled_in = 1; ++s; goto L1;
	 case ']': p->scrambled_out = 1; ++s; goto L1;

	 default : ;
     }

     s = parsetensor(s, &sz, p->kind == PROBLEM_R2R ? &p->k : 0);

     if (p->kind == PROBLEM_REAL) {
	  if (p->sign < 0) {
	       nti = p->in_place || always_pad_real ? PADDED : SAME;
	       nto = HALFISH;
	  }
	  else {
	       nti = HALFISH;
	       nto = p->in_place || always_pad_real ? PADDED : SAME;
	  }
     }

     sz_last_iodim = sz->dims + sz->rnk - 1;
     if (*s == '*') { /* "external" vector */
	  ++s;
	  p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim);
	  s = parsetensor(s, &sz, 0);
	  p->vecsz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim);
     } else if (*s == 'v' || *s == 'V') { /* "internal" vector */
	  bench_tensor *vecsz;
	  ++s;
	  s = parsetensor(s, &vecsz, 0);
	  p->vecsz = dwim(vecsz, &last_iodim, nti, nto, sz_last_iodim);
	  p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim);
     } else {
	  p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim);
	  p->vecsz = mktensor(0);
     }

     if (transpose) {
	  transpose_tensor(p->sz);
	  transpose_tensor(p->vecsz);
     }

     if (!p->in_place)
	  p->out = ((bench_real *) p->in) + (1 << 20);  /* whatever */

     BENCH_ASSERT(p->sz && p->vecsz);
     BENCH_ASSERT(!*s);
     return p;
}
Beispiel #2
0
void doMSC(){
//	cpu_clock_set(204);
	dwim();
};