annotate src/fftw-3.3.8/genfft/gen_twidsq.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 = "rio"
Chris@82 65 and iioarray = "iio"
Chris@82 66 and rs = "rs" and vs = "vs"
Chris@82 67 and twarray = "W"
Chris@82 68 and m = "m" and mb = "mb" and me = "me" and ms = "ms" in
Chris@82 69
Chris@82 70 let sign = !Genutil.sign
Chris@82 71 and name = !Magic.codelet_name in
Chris@82 72
Chris@82 73 let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 false in
Chris@82 74 let nt = num_twiddles n in
Chris@82 75
Chris@82 76 let svs = either_stride (!uvs) (C.SVar vs)
Chris@82 77 and srs = either_stride (!urs) (C.SVar rs) in
Chris@82 78
Chris@82 79 let byw =
Chris@82 80 if !reload_twiddle then
Chris@82 81 array n (fun v -> bytwiddle n sign (twiddle_array nt twarray))
Chris@82 82 else
Chris@82 83 let a = bytwiddle n sign (twiddle_array nt twarray)
Chris@82 84 in fun v -> a
Chris@82 85 in
Chris@82 86
Chris@82 87 let locations = unique_v_array_c n n in
Chris@82 88
Chris@82 89 let ioi =
Chris@82 90 locative_v_array_c n n
Chris@82 91 (C.varray_subscript rioarray svs srs)
Chris@82 92 (C.varray_subscript iioarray svs srs)
Chris@82 93 locations "BUG"
Chris@82 94 and ioo =
Chris@82 95 locative_v_array_c n n
Chris@82 96 (C.varray_subscript rioarray svs srs)
Chris@82 97 (C.varray_subscript iioarray svs srs)
Chris@82 98 locations "BUG"
Chris@82 99 in
Chris@82 100
Chris@82 101 let lioi = load_v_array_c n n ioi in
Chris@82 102 let output =
Chris@82 103 match !ditdif with
Chris@82 104 | DIT -> array n (fun v -> Fft.dft sign n (byw v (lioi v)))
Chris@82 105 | DIF -> array n (fun v -> byw v (Fft.dft sign n (lioi v)))
Chris@82 106 in
Chris@82 107
Chris@82 108 let odag = store_v_array_c n n ioo (transpose output) in
Chris@82 109 let annot = standard_optimizer odag in
Chris@82 110
Chris@82 111 let vm = CVar m and vmb = CVar mb and vme = CVar me in
Chris@82 112
Chris@82 113 let body = Block (
Chris@82 114 [Decl ("INT", m)],
Chris@82 115 [For (list_to_comma
Chris@82 116 [Expr_assign (vm, vmb);
Chris@82 117 Expr_assign (CVar twarray,
Chris@82 118 CPlus [CVar twarray;
Chris@82 119 ctimes (vmb, Integer nt)])],
Chris@82 120 Binop (" < ", vm, vme),
Chris@82 121 list_to_comma
Chris@82 122 [Expr_assign (vm, CPlus [vm; Integer 1]);
Chris@82 123 Expr_assign (CVar rioarray, CPlus [CVar rioarray; CVar ms]);
Chris@82 124 Expr_assign (CVar iioarray, CPlus [CVar iioarray; CVar ms]);
Chris@82 125 Expr_assign (CVar twarray, CPlus [CVar twarray; Integer nt]);
Chris@82 126 make_volatile_stride (2*n) (CVar rs);
Chris@82 127 make_volatile_stride (2*0) (CVar vs)
Chris@82 128 ],
Chris@82 129 Asch annot)]) in
Chris@82 130
Chris@82 131 let tree =
Chris@82 132 Fcn (("static void"), name,
Chris@82 133 [Decl (C.realtypep, rioarray);
Chris@82 134 Decl (C.realtypep, iioarray);
Chris@82 135 Decl (C.constrealtypep, twarray);
Chris@82 136 Decl (C.stridetype, rs);
Chris@82 137 Decl (C.stridetype, vs);
Chris@82 138 Decl ("INT", mb);
Chris@82 139 Decl ("INT", me);
Chris@82 140 Decl ("INT", ms)],
Chris@82 141 finalize_fcn body)
Chris@82 142 in
Chris@82 143 let twinstr =
Chris@82 144 Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n"
Chris@82 145 (Twiddle.twinstr_to_c_string (twdesc n))
Chris@82 146
Chris@82 147 and desc =
Chris@82 148 Printf.sprintf
Chris@82 149 "static const ct_desc desc = {%d, \"%s\", twinstr, &GENUS, %s, %s, %s, %s};\n\n"
Chris@82 150 n name (flops_of tree)
Chris@82 151 (stride_to_solverparm !urs) (stride_to_solverparm !uvs)
Chris@82 152 (stride_to_solverparm !ums)
Chris@82 153
Chris@82 154 and register =
Chris@82 155 match !ditdif with
Chris@82 156 | DIT -> "X(kdft_ditsq_register)"
Chris@82 157 | DIF -> "X(kdft_difsq_register)"
Chris@82 158 in
Chris@82 159 let init =
Chris@82 160 "\n" ^
Chris@82 161 twinstr ^
Chris@82 162 desc ^
Chris@82 163 (declare_register_fcn name) ^
Chris@82 164 (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register name)
Chris@82 165 in
Chris@82 166
Chris@82 167 (unparse tree) ^ "\n" ^ init
Chris@82 168
Chris@82 169
Chris@82 170 let main () =
Chris@82 171 begin
Chris@82 172 parse (speclist @ Twiddle.speclist) usage;
Chris@82 173 print_string (generate (check_size ()));
Chris@82 174 end
Chris@82 175
Chris@82 176 let _ = main()