/* 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; }
void doMSC(){ // cpu_clock_set(204); dwim(); };