annotate src/fftw-3.3.8/genfft/gen_twidsq_c.ml @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents d0c2a83c1364
children
rev   line source
Chris@82 1 (*
Chris@82 2 * Copyright (c) 1997-1999 Massachusetts Institute of Technology
Chris@82 3 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@82 4 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@82 5 *
Chris@82 6 * This program is free software; you can redistribute it and/or modify
Chris@82 7 * it under the terms of the GNU General Public License as published by
Chris@82 8 * the Free Software Foundation; either version 2 of the License, or
Chris@82 9 * (at your option) any later version.
Chris@82 10 *
Chris@82 11 * This program is distributed in the hope that it will be useful,
Chris@82 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@82 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@82 14 * GNU General Public License for more details.
Chris@82 15 *
Chris@82 16 * You should have received a copy of the GNU General Public License
Chris@82 17 * along with this program; if not, write to the Free Software
Chris@82 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@82 19 *
Chris@82 20 *)
Chris@82 21
Chris@82 22 open Util
Chris@82 23 open Genutil
Chris@82 24 open C
Chris@82 25
Chris@82 26 type ditdif = DIT | DIF
Chris@82 27 let ditdif = ref DIT
Chris@82 28
Chris@82 29 let usage = "Usage: " ^ Sys.argv.(0) ^ " -n <number> [ -dit | -dif ]"
Chris@82 30
Chris@82 31 let reload_twiddle = ref false
Chris@82 32
Chris@82 33 let urs = ref Stride_variable
Chris@82 34 let uvs = ref Stride_variable
Chris@82 35 let ums = ref Stride_variable
Chris@82 36
Chris@82 37 let speclist = [
Chris@82 38 "-dit",
Chris@82 39 Arg.Unit(fun () -> ditdif := DIT),
Chris@82 40 " generate a DIT codelet";
Chris@82 41
Chris@82 42 "-dif",
Chris@82 43 Arg.Unit(fun () -> ditdif := DIF),
Chris@82 44 " generate a DIF codelet";
Chris@82 45
Chris@82 46 "-reload-twiddle",
Chris@82 47 Arg.Unit(fun () -> reload_twiddle := true),
Chris@82 48 " do not collect common twiddle factors";
Chris@82 49
Chris@82 50 "-with-rs",
Chris@82 51 Arg.String(fun x -> urs := arg_to_stride x),
Chris@82 52 " specialize for given input stride";
Chris@82 53
Chris@82 54 "-with-vs",
Chris@82 55 Arg.String(fun x -> uvs := arg_to_stride x),
Chris@82 56 " specialize for given vector stride";
Chris@82 57
Chris@82 58 "-with-ms",
Chris@82 59 Arg.String(fun x -> ums := arg_to_stride x),
Chris@82 60 " specialize for given ms"
Chris@82 61 ]
Chris@82 62
Chris@82 63 let generate n =
Chris@82 64 let rioarray = "x"
Chris@82 65 and rs = "rs" and vs = "vs"
Chris@82 66 and twarray = "W"
Chris@82 67 and m = "m" and mb = "mb" and me = "me" and ms = "ms" in
Chris@82 68
Chris@82 69 let sign = !Genutil.sign
Chris@82 70 and name = !Magic.codelet_name
Chris@82 71 and byvl x = choose_simd x (ctimes (CVar "VL", x))
Chris@82 72 and bytwvl x = choose_simd x (ctimes (CVar "TWVL", x))
Chris@82 73 and bytwvl_vl x = choose_simd x (ctimes (CVar "(TWVL/VL)", x)) in
Chris@82 74 let ename = expand_name name in
Chris@82 75
Chris@82 76 let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 true in
Chris@82 77 let nt = num_twiddles n in
Chris@82 78
Chris@82 79 let svs = either_stride (!uvs) (C.SVar vs)
Chris@82 80 and srs = either_stride (!urs) (C.SVar rs) in
Chris@82 81 let sms = stride_to_string "ms" !ums in
Chris@82 82
Chris@82 83 let byw =
Chris@82 84 if !reload_twiddle then
Chris@82 85 array n (fun v -> bytwiddle n sign (twiddle_array nt twarray))
Chris@82 86 else
Chris@82 87 let a = bytwiddle n sign (twiddle_array nt twarray)
Chris@82 88 in fun v -> a
Chris@82 89 in
Chris@82 90
Chris@82 91 let locations = unique_v_array_c n n in
Chris@82 92
Chris@82 93 let ioi =
Chris@82 94 locative_v_array_c n n
Chris@82 95 (C.varray_subscript rioarray svs srs)
Chris@82 96 (C.varray_subscript "BUG" svs srs)
Chris@82 97 locations sms
Chris@82 98 and ioo =
Chris@82 99 locative_v_array_c n n
Chris@82 100 (C.varray_subscript rioarray svs srs)
Chris@82 101 (C.varray_subscript "BUG" svs srs)
Chris@82 102 locations sms
Chris@82 103 in
Chris@82 104
Chris@82 105 let lioi = load_v_array_c n n ioi in
Chris@82 106 let fft = Trig.dft_via_rdft in
Chris@82 107 let output =
Chris@82 108 match !ditdif with
Chris@82 109 | DIT -> array n (fun v -> fft sign n (byw v (lioi v)))
Chris@82 110 | DIF -> array n (fun v -> byw v (fft sign n (lioi v)))
Chris@82 111 in
Chris@82 112
Chris@82 113 let odag = store_v_array_c n n ioo (transpose output) in
Chris@82 114 let annot = standard_optimizer odag in
Chris@82 115
Chris@82 116 let vm = CVar m and vmb = CVar mb and vme = CVar me in
Chris@82 117
Chris@82 118 let body = Block (
Chris@82 119 [Decl ("INT", m);
Chris@82 120 Decl (C.realtypep, rioarray)],
Chris@82 121 [Stmt_assign (CVar rioarray,
Chris@82 122 CVar (if (sign < 0) then "ri" else "ii"));
Chris@82 123 For (list_to_comma
Chris@82 124 [Expr_assign (vm, vmb);
Chris@82 125 Expr_assign (CVar twarray,
Chris@82 126 CPlus [CVar twarray;
Chris@82 127 ctimes (vmb,
Chris@82 128 bytwvl_vl (Integer nt))])],
Chris@82 129 Binop (" < ", vm, vme),
Chris@82 130 list_to_comma
Chris@82 131 [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]);
Chris@82 132 Expr_assign (CVar rioarray, CPlus [CVar rioarray;
Chris@82 133 byvl (CVar sms)]);
Chris@82 134 Expr_assign (CVar twarray, CPlus [CVar twarray;
Chris@82 135 bytwvl (Integer nt)]);
Chris@82 136 make_volatile_stride (2*n) (CVar rs);
Chris@82 137 make_volatile_stride (2*n) (CVar vs)
Chris@82 138 ],
Chris@82 139 Asch annot)]) in
Chris@82 140
Chris@82 141 let tree =
Chris@82 142 Fcn (("static void"), ename,
Chris@82 143 [Decl (C.realtypep, "ri");
Chris@82 144 Decl (C.realtypep, "ii");
Chris@82 145 Decl (C.constrealtypep, twarray);
Chris@82 146 Decl (C.stridetype, rs);
Chris@82 147 Decl (C.stridetype, vs);
Chris@82 148 Decl ("INT", mb);
Chris@82 149 Decl ("INT", me);
Chris@82 150 Decl ("INT", ms)],
Chris@82 151 finalize_fcn body)
Chris@82 152 in
Chris@82 153 let twinstr =
Chris@82 154 Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n"
Chris@82 155 (twinstr_to_string "VL" (twdesc n))
Chris@82 156
Chris@82 157 and desc =
Chris@82 158 Printf.sprintf
Chris@82 159 "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n"
Chris@82 160 n (stringify name) (flops_of tree)
Chris@82 161 (stride_to_solverparm !urs)
Chris@82 162 (stride_to_solverparm !uvs)
Chris@82 163 (stride_to_solverparm !ums)
Chris@82 164
Chris@82 165 and register =
Chris@82 166 match !ditdif with
Chris@82 167 | DIT -> "X(kdft_ditsq_register)"
Chris@82 168 | DIF -> "X(kdft_difsq_register)"
Chris@82 169 in
Chris@82 170 let init =
Chris@82 171 "\n" ^
Chris@82 172 twinstr ^
Chris@82 173 desc ^
Chris@82 174 (declare_register_fcn name) ^
Chris@82 175 (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename)
Chris@82 176 in
Chris@82 177
Chris@82 178 (unparse tree) ^ "\n" ^ init
Chris@82 179
Chris@82 180
Chris@82 181 let main () =
Chris@82 182 begin
Chris@82 183 parse (speclist @ Twiddle.speclist) usage;
Chris@82 184 print_string (generate (check_size ()));
Chris@82 185 end
Chris@82 186
Chris@82 187 let _ = main()