Esempio n. 1
0
/* user interface */
void fftw(fftw_plan plan, int howmany, fftw_complex *in, int istride,
          int idist, fftw_complex *out, int ostride, int odist)
{
    int n = plan->n;

    if (plan->flags & FFTW_IN_PLACE) {
        if (howmany == 1) {
            executor_simple_inplace(n, in, out, plan->root, istride,
                                    plan->recurse_kind);
        } else {
            executor_many_inplace(n, in, out, plan->root, istride, howmany,
                                  idist, plan->recurse_kind);
        }
    } else {
        if (howmany == 1) {
            fftw_executor_simple(n, in, out, plan->root, istride, ostride,
                                 plan->recurse_kind);
        } else {
#ifdef FFTW_ENABLE_VECTOR_RECURSE
            int vector_size = plan->vector_size;
            if (vector_size <= 1)
#endif
                executor_many(n, in, out, plan->root, istride, ostride,
                              howmany, idist, odist, plan->recurse_kind);
#ifdef FFTW_ENABLE_VECTOR_RECURSE
            else {
                int s;
                int num_vects = howmany / vector_size;
                fftw_plan_node *root = plan->root;

                for (s = 0; s < num_vects; ++s)
                    executor_many_vector(n,
                                         in + s * (vector_size * idist),
                                         out + s * (vector_size * odist),
                                         root,
                                         istride, ostride,
                                         vector_size, idist, odist);

                s = howmany % vector_size;
                if (s > 0)
                    executor_many(n,
                                  in + num_vects * (vector_size * idist),
                                  out + num_vects * (vector_size * odist),
                                  root,
                                  istride, ostride,
                                  s, idist, odist,
                                  FFTW_NORMAL_RECURSE);
            }
#endif
        }
    }
}
Esempio n. 2
0
/*
 * Do *not* declare simple executor static--we need to call it
 * from other files...also, preface its name with "fftw_"
 * to avoid any possible name collisions. 
 */
void fftw_executor_simple(int n, const fftw_complex *in,
			  fftw_complex *out,
			  fftw_plan_node *p,
			  int istride,
			  int ostride,
			  fftw_recurse_kind recurse_kind)
{
     switch (p->type) {
	 case FFTW_NOTW:
	      HACK_ALIGN_STACK_ODD;
	      (p->nodeu.notw.codelet)(in, out, istride, ostride);
	      break;

	 case FFTW_TWIDDLE:
	      {
		   int r = p->nodeu.twiddle.size;
		   int m = n / r;
		   fftw_twiddle_codelet *codelet;
		   fftw_complex *W;

#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   if (recurse_kind == FFTW_NORMAL_RECURSE)
#endif
			executor_many(m, in, out,
				      p->nodeu.twiddle.recurse,
				      istride * r, ostride,
				      r, istride, m * ostride,
				      FFTW_NORMAL_RECURSE);
#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   else
			executor_many_vector(m, in, out,
					     p->nodeu.twiddle.recurse,
					     istride * r, ostride,
					     r, istride, m * ostride);
#endif

		   codelet = p->nodeu.twiddle.codelet;
		   W = p->nodeu.twiddle.tw->twarray;

		   HACK_ALIGN_STACK_EVEN;
		   codelet(out, W, m * ostride, m, ostride);

		   break;
	      }

	 case FFTW_GENERIC:
	      {
		   int r = p->nodeu.generic.size;
		   int m = n / r;
		   fftw_generic_codelet *codelet;
		   fftw_complex *W;

#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   if (recurse_kind == FFTW_NORMAL_RECURSE)
#endif
			executor_many(m, in, out,
				      p->nodeu.generic.recurse,
				      istride * r, ostride,
				      r, istride, m * ostride,
                                      FFTW_NORMAL_RECURSE);
#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   else
			executor_many_vector(m, in, out,
					     p->nodeu.generic.recurse,
					     istride * r, ostride,
					     r, istride, m * ostride);
#endif

		   codelet = p->nodeu.generic.codelet;
		   W = p->nodeu.generic.tw->twarray;
		   codelet(out, W, m, r, n, ostride);

		   break;
	      }

	 case FFTW_RADER:
	      {
		   int r = p->nodeu.rader.size;
		   int m = n / r;
		   fftw_rader_codelet *codelet;
		   fftw_complex *W;

#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   if (recurse_kind == FFTW_NORMAL_RECURSE)
#endif
			executor_many(m, in, out,
				      p->nodeu.rader.recurse,
				      istride * r, ostride,
				      r, istride, m * ostride,
                                      FFTW_NORMAL_RECURSE);
#ifdef FFTW_ENABLE_VECTOR_RECURSE
		   else
			executor_many_vector(m, in, out,
					     p->nodeu.rader.recurse,
					     istride * r, ostride,
					     r, istride, m * ostride);
#endif

		   codelet = p->nodeu.rader.codelet;
		   W = p->nodeu.rader.tw->twarray;
		   codelet(out, W, m, r, ostride,
			   p->nodeu.rader.rader_data);

		   break;
	      }

	 default:
	      fftw_die("BUG in executor: invalid plan\n");
	      break;
     }
}