annotate src/fftw-3.3.3/dft/dftw-directsq.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 89f5e221ed7b
children
rev   line source
cannam@95 1 /*
cannam@95 2 * Copyright (c) 2003, 2007-11 Matteo Frigo
cannam@95 3 * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
cannam@95 4 *
cannam@95 5 * This program is free software; you can redistribute it and/or modify
cannam@95 6 * it under the terms of the GNU General Public License as published by
cannam@95 7 * the Free Software Foundation; either version 2 of the License, or
cannam@95 8 * (at your option) any later version.
cannam@95 9 *
cannam@95 10 * This program is distributed in the hope that it will be useful,
cannam@95 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@95 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@95 13 * GNU General Public License for more details.
cannam@95 14 *
cannam@95 15 * You should have received a copy of the GNU General Public License
cannam@95 16 * along with this program; if not, write to the Free Software
cannam@95 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
cannam@95 18 *
cannam@95 19 */
cannam@95 20
cannam@95 21
cannam@95 22 #include "ct.h"
cannam@95 23
cannam@95 24 typedef struct {
cannam@95 25 ct_solver super;
cannam@95 26 const ct_desc *desc;
cannam@95 27 kdftwsq k;
cannam@95 28 } S;
cannam@95 29
cannam@95 30 typedef struct {
cannam@95 31 plan_dftw super;
cannam@95 32 kdftwsq k;
cannam@95 33 INT r;
cannam@95 34 stride rs, vs;
cannam@95 35 INT m, ms, v, mb, me;
cannam@95 36 twid *td;
cannam@95 37 const S *slv;
cannam@95 38 } P;
cannam@95 39
cannam@95 40
cannam@95 41 static void apply(const plan *ego_, R *rio, R *iio)
cannam@95 42 {
cannam@95 43 const P *ego = (const P *) ego_;
cannam@95 44 INT mb = ego->mb, ms = ego->ms;
cannam@95 45 ego->k(rio + mb*ms, iio + mb*ms, ego->td->W, ego->rs, ego->vs,
cannam@95 46 mb, ego->me, ms);
cannam@95 47 }
cannam@95 48
cannam@95 49 static void awake(plan *ego_, enum wakefulness wakefulness)
cannam@95 50 {
cannam@95 51 P *ego = (P *) ego_;
cannam@95 52
cannam@95 53 X(twiddle_awake)(wakefulness, &ego->td, ego->slv->desc->tw,
cannam@95 54 ego->r * ego->m, ego->r, ego->m);
cannam@95 55 }
cannam@95 56
cannam@95 57 static void destroy(plan *ego_)
cannam@95 58 {
cannam@95 59 P *ego = (P *) ego_;
cannam@95 60 X(stride_destroy)(ego->rs);
cannam@95 61 X(stride_destroy)(ego->vs);
cannam@95 62 }
cannam@95 63
cannam@95 64 static void print(const plan *ego_, printer *p)
cannam@95 65 {
cannam@95 66 const P *ego = (const P *) ego_;
cannam@95 67 const S *slv = ego->slv;
cannam@95 68 const ct_desc *e = slv->desc;
cannam@95 69
cannam@95 70 p->print(p, "(dftw-directsq-%D/%D%v \"%s\")",
cannam@95 71 ego->r, X(twiddle_length)(ego->r, e->tw), ego->v, e->nam);
cannam@95 72 }
cannam@95 73
cannam@95 74 static int applicable(const S *ego,
cannam@95 75 INT r, INT irs, INT ors,
cannam@95 76 INT m, INT ms,
cannam@95 77 INT v, INT ivs, INT ovs,
cannam@95 78 INT mb, INT me,
cannam@95 79 R *rio, R *iio,
cannam@95 80 const planner *plnr)
cannam@95 81 {
cannam@95 82 const ct_desc *e = ego->desc;
cannam@95 83 UNUSED(v);
cannam@95 84
cannam@95 85 return (
cannam@95 86 1
cannam@95 87 && r == e->radix
cannam@95 88
cannam@95 89 /* transpose r, v */
cannam@95 90 && r == v
cannam@95 91 && irs == ovs
cannam@95 92 && ivs == ors
cannam@95 93
cannam@95 94 /* check for alignment/vector length restrictions */
cannam@95 95 && e->genus->okp(e, rio, iio, irs, ivs, m, mb, me, ms, plnr)
cannam@95 96
cannam@95 97 );
cannam@95 98 }
cannam@95 99
cannam@95 100 static plan *mkcldw(const ct_solver *ego_,
cannam@95 101 INT r, INT irs, INT ors,
cannam@95 102 INT m, INT ms,
cannam@95 103 INT v, INT ivs, INT ovs,
cannam@95 104 INT mstart, INT mcount,
cannam@95 105 R *rio, R *iio,
cannam@95 106 planner *plnr)
cannam@95 107 {
cannam@95 108 const S *ego = (const S *) ego_;
cannam@95 109 P *pln;
cannam@95 110 const ct_desc *e = ego->desc;
cannam@95 111
cannam@95 112 static const plan_adt padt = {
cannam@95 113 0, awake, print, destroy
cannam@95 114 };
cannam@95 115
cannam@95 116 A(mstart >= 0 && mstart + mcount <= m);
cannam@95 117 if (!applicable(ego,
cannam@95 118 r, irs, ors, m, ms, v, ivs, ovs, mstart, mstart + mcount,
cannam@95 119 rio, iio, plnr))
cannam@95 120 return (plan *)0;
cannam@95 121
cannam@95 122 pln = MKPLAN_DFTW(P, &padt, apply);
cannam@95 123
cannam@95 124 pln->k = ego->k;
cannam@95 125 pln->rs = X(mkstride)(r, irs);
cannam@95 126 pln->vs = X(mkstride)(v, ivs);
cannam@95 127 pln->td = 0;
cannam@95 128 pln->r = r;
cannam@95 129 pln->m = m;
cannam@95 130 pln->ms = ms;
cannam@95 131 pln->v = v;
cannam@95 132 pln->mb = mstart;
cannam@95 133 pln->me = mstart + mcount;
cannam@95 134 pln->slv = ego;
cannam@95 135
cannam@95 136 X(ops_zero)(&pln->super.super.ops);
cannam@95 137 X(ops_madd2)(mcount/e->genus->vl, &e->ops, &pln->super.super.ops);
cannam@95 138
cannam@95 139 return &(pln->super.super);
cannam@95 140 }
cannam@95 141
cannam@95 142 static void regone(planner *plnr, kdftwsq codelet,
cannam@95 143 const ct_desc *desc, int dec)
cannam@95 144 {
cannam@95 145 S *slv = (S *)X(mksolver_ct)(sizeof(S), desc->radix, dec, mkcldw, 0);
cannam@95 146 slv->k = codelet;
cannam@95 147 slv->desc = desc;
cannam@95 148 REGISTER_SOLVER(plnr, &(slv->super.super));
cannam@95 149 if (X(mksolver_ct_hook)) {
cannam@95 150 slv = (S *)X(mksolver_ct_hook)(sizeof(S), desc->radix, dec,
cannam@95 151 mkcldw, 0);
cannam@95 152 slv->k = codelet;
cannam@95 153 slv->desc = desc;
cannam@95 154 REGISTER_SOLVER(plnr, &(slv->super.super));
cannam@95 155 }
cannam@95 156 }
cannam@95 157
cannam@95 158 void X(regsolver_ct_directwsq)(planner *plnr, kdftwsq codelet,
cannam@95 159 const ct_desc *desc, int dec)
cannam@95 160 {
cannam@95 161 regone(plnr, codelet, desc, dec+TRANSPOSE);
cannam@95 162 }