annotate src/fftw-3.3.3/genfft/gen_twiddle.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 37bf6b4a2645
children
rev   line source
Chris@10 1 (*
Chris@10 2 * Copyright (c) 1997-1999 Massachusetts Institute of Technology
Chris@10 3 * Copyright (c) 2003, 2007-11 Matteo Frigo
Chris@10 4 * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
Chris@10 5 *
Chris@10 6 * This program is free software; you can redistribute it and/or modify
Chris@10 7 * it under the terms of the GNU General Public License as published by
Chris@10 8 * the Free Software Foundation; either version 2 of the License, or
Chris@10 9 * (at your option) any later version.
Chris@10 10 *
Chris@10 11 * This program is distributed in the hope that it will be useful,
Chris@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@10 14 * GNU General Public License for more details.
Chris@10 15 *
Chris@10 16 * You should have received a copy of the GNU General Public License
Chris@10 17 * along with this program; if not, write to the Free Software
Chris@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@10 19 *
Chris@10 20 *)
Chris@10 21
Chris@10 22 open Util
Chris@10 23 open Genutil
Chris@10 24 open C
Chris@10 25
Chris@10 26
Chris@10 27 type ditdif = DIT | DIF
Chris@10 28 let ditdif = ref DIT
Chris@10 29 let usage = "Usage: " ^ Sys.argv.(0) ^ " -n <number> [ -dit | -dif ]"
Chris@10 30
Chris@10 31 let urs = ref Stride_variable
Chris@10 32 let ums = ref Stride_variable
Chris@10 33
Chris@10 34 let speclist = [
Chris@10 35 "-dit",
Chris@10 36 Arg.Unit(fun () -> ditdif := DIT),
Chris@10 37 " generate a DIT codelet";
Chris@10 38
Chris@10 39 "-dif",
Chris@10 40 Arg.Unit(fun () -> ditdif := DIF),
Chris@10 41 " generate a DIF codelet";
Chris@10 42
Chris@10 43 "-with-rs",
Chris@10 44 Arg.String(fun x -> urs := arg_to_stride x),
Chris@10 45 " specialize for given i/o stride";
Chris@10 46
Chris@10 47 "-with-ms",
Chris@10 48 Arg.String(fun x -> ums := arg_to_stride x),
Chris@10 49 " specialize for given ms"
Chris@10 50 ]
Chris@10 51
Chris@10 52 let generate n =
Chris@10 53 let rioarray = "ri"
Chris@10 54 and iioarray = "ii"
Chris@10 55 and rs = "rs"
Chris@10 56 and twarray = "W"
Chris@10 57 and m = "m" and mb = "mb" and me = "me" and ms = "ms" in
Chris@10 58
Chris@10 59 let sign = !Genutil.sign
Chris@10 60 and name = !Magic.codelet_name
Chris@10 61 and byvl x = choose_simd x (ctimes (CVar "(2 * VL)", x)) in
Chris@10 62 let ename = expand_name name in
Chris@10 63
Chris@10 64 let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 false in
Chris@10 65 let nt = num_twiddles n in
Chris@10 66
Chris@10 67 let byw = bytwiddle n sign (twiddle_array nt twarray) in
Chris@10 68
Chris@10 69 let vrs = either_stride (!urs) (C.SVar rs) in
Chris@10 70 let sms = stride_to_string "ms" !ums in
Chris@10 71
Chris@10 72 let locations = unique_array_c n in
Chris@10 73 let iloc =
Chris@10 74 locative_array_c n
Chris@10 75 (C.array_subscript rioarray vrs)
Chris@10 76 (C.array_subscript iioarray vrs)
Chris@10 77 locations sms
Chris@10 78 and oloc =
Chris@10 79 locative_array_c n
Chris@10 80 (C.array_subscript rioarray vrs)
Chris@10 81 (C.array_subscript iioarray vrs)
Chris@10 82 locations sms
Chris@10 83 in
Chris@10 84 let liloc = load_array_c n iloc in
Chris@10 85 let output =
Chris@10 86 match !ditdif with
Chris@10 87 | DIT -> array n (Fft.dft sign n (byw liloc))
Chris@10 88 | DIF -> array n (byw (Fft.dft sign n liloc))
Chris@10 89 in
Chris@10 90 let odag = store_array_c n oloc output in
Chris@10 91 let annot = standard_optimizer odag in
Chris@10 92
Chris@10 93 let vm = CVar m and vmb = CVar mb and vme = CVar me in
Chris@10 94
Chris@10 95 let body = Block (
Chris@10 96 [Decl ("INT", m)],
Chris@10 97 [For (list_to_comma
Chris@10 98 [Expr_assign (vm, vmb);
Chris@10 99 Expr_assign (CVar twarray,
Chris@10 100 CPlus [CVar twarray;
Chris@10 101 ctimes (vmb, Integer nt)])],
Chris@10 102 Binop (" < ", vm, vme),
Chris@10 103 list_to_comma
Chris@10 104 [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]);
Chris@10 105 Expr_assign (CVar rioarray, CPlus [CVar rioarray;
Chris@10 106 byvl (CVar sms)]);
Chris@10 107 Expr_assign (CVar iioarray, CPlus [CVar iioarray;
Chris@10 108 byvl (CVar sms)]);
Chris@10 109 Expr_assign (CVar twarray, CPlus [CVar twarray;
Chris@10 110 byvl (Integer nt)]);
Chris@10 111 make_volatile_stride (2*n) (CVar rs)
Chris@10 112 ],
Chris@10 113 Asch annot)])
Chris@10 114 in
Chris@10 115
Chris@10 116 let tree =
Chris@10 117 Fcn (((if !Magic.standalone then "" else "static ") ^ "void"),
Chris@10 118 ename,
Chris@10 119 [Decl (C.realtypep, rioarray);
Chris@10 120 Decl (C.realtypep, iioarray);
Chris@10 121 Decl (C.constrealtypep, twarray);
Chris@10 122 Decl (C.stridetype, rs);
Chris@10 123 Decl ("INT", mb);
Chris@10 124 Decl ("INT", me);
Chris@10 125 Decl ("INT", ms)],
Chris@10 126 finalize_fcn body)
Chris@10 127 in
Chris@10 128 let twinstr =
Chris@10 129 Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n"
Chris@10 130 (twinstr_to_string "(2 * VL)" (twdesc n))
Chris@10 131 and desc =
Chris@10 132 Printf.sprintf
Chris@10 133 "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n"
Chris@10 134 n (stringify name) (flops_of tree)
Chris@10 135 (stride_to_solverparm !urs) "0"
Chris@10 136 (stride_to_solverparm !ums)
Chris@10 137 and register =
Chris@10 138 match !ditdif with
Chris@10 139 | DIT -> "X(kdft_dit_register)"
Chris@10 140 | DIF -> "X(kdft_dif_register)"
Chris@10 141
Chris@10 142 in
Chris@10 143 let init =
Chris@10 144 "\n" ^
Chris@10 145 twinstr ^
Chris@10 146 desc ^
Chris@10 147 (declare_register_fcn name) ^
Chris@10 148 (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename)
Chris@10 149 in
Chris@10 150
Chris@10 151 (unparse tree) ^ "\n" ^
Chris@10 152 (if !Magic.standalone then "" else init)
Chris@10 153
Chris@10 154
Chris@10 155 let main () =
Chris@10 156 begin
Chris@10 157 parse (speclist @ Twiddle.speclist) usage;
Chris@10 158 print_string (generate (check_size ()));
Chris@10 159 end
Chris@10 160
Chris@10 161 let _ = main()