annotate src/fftw-3.3.3/genfft/gen_notw_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 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 let usage = "Usage: " ^ Sys.argv.(0) ^ " -n <number>"
Chris@10 28
Chris@10 29 let uistride = ref Stride_variable
Chris@10 30 let uostride = ref Stride_variable
Chris@10 31 let uivstride = ref Stride_variable
Chris@10 32 let uovstride = ref Stride_variable
Chris@10 33
Chris@10 34 let speclist = [
Chris@10 35 "-with-istride",
Chris@10 36 Arg.String(fun x -> uistride := arg_to_stride x),
Chris@10 37 " specialize for given input stride";
Chris@10 38
Chris@10 39 "-with-ostride",
Chris@10 40 Arg.String(fun x -> uostride := arg_to_stride x),
Chris@10 41 " specialize for given output stride";
Chris@10 42
Chris@10 43 "-with-ivstride",
Chris@10 44 Arg.String(fun x -> uivstride := arg_to_stride x),
Chris@10 45 " specialize for given input vector stride";
Chris@10 46
Chris@10 47 "-with-ovstride",
Chris@10 48 Arg.String(fun x -> uovstride := arg_to_stride x),
Chris@10 49 " specialize for given output vector stride"
Chris@10 50 ]
Chris@10 51
Chris@10 52 let nonstandard_optimizer list_of_buddy_stores dag =
Chris@10 53 let sched = standard_scheduler dag in
Chris@10 54 let annot = Annotate.annotate list_of_buddy_stores sched in
Chris@10 55 let _ = dump_asched annot in
Chris@10 56 annot
Chris@10 57
Chris@10 58 let generate n =
Chris@10 59 let riarray = "xi"
Chris@10 60 and roarray = "xo"
Chris@10 61 and istride = "is"
Chris@10 62 and ostride = "os"
Chris@10 63 and i = "i"
Chris@10 64 and v = "v"
Chris@10 65 in
Chris@10 66
Chris@10 67 let sign = !Genutil.sign
Chris@10 68 and name = !Magic.codelet_name
Chris@10 69 and byvl x = choose_simd x (ctimes (CVar "VL", x)) in
Chris@10 70 let ename = expand_name name in
Chris@10 71
Chris@10 72 let vistride = either_stride (!uistride) (C.SVar istride)
Chris@10 73 and vostride = either_stride (!uostride) (C.SVar ostride)
Chris@10 74 in
Chris@10 75
Chris@10 76 let sivs = stride_to_string "ivs" !uivstride in
Chris@10 77 let sovs = stride_to_string "ovs" !uovstride in
Chris@10 78
Chris@10 79 let fft = Trig.dft_via_rdft in
Chris@10 80
Chris@10 81 let locations = unique_array_c n in
Chris@10 82 let input =
Chris@10 83 locative_array_c n
Chris@10 84 (C.array_subscript riarray vistride)
Chris@10 85 (C.array_subscript "BUG" vistride)
Chris@10 86 locations sivs in
Chris@10 87 let output = fft sign n (load_array_r n input) in
Chris@10 88 let oloc =
Chris@10 89 locative_array_c n
Chris@10 90 (C.array_subscript roarray vostride)
Chris@10 91 (C.array_subscript "BUG" vostride)
Chris@10 92 locations sovs in
Chris@10 93 let list_of_buddy_stores =
Chris@10 94 let k = !Simdmagic.store_multiple in
Chris@10 95 if (k > 1) then
Chris@10 96 if (n mod k == 0) then
Chris@10 97 List.map
Chris@10 98 (fun i -> List.map (fun j -> (fst (oloc (k * i + j)))) (iota k))
Chris@10 99 (iota (n / k))
Chris@10 100 else failwith "invalid n for -store-multiple"
Chris@10 101 else []
Chris@10 102 in
Chris@10 103 let odag = store_array_r n oloc output in
Chris@10 104 let annot = nonstandard_optimizer list_of_buddy_stores odag in
Chris@10 105
Chris@10 106 let body = Block (
Chris@10 107 [Decl ("INT", i);
Chris@10 108 Decl (C.constrealtypep, riarray);
Chris@10 109 Decl (C.realtypep, roarray)],
Chris@10 110 [Stmt_assign (CVar riarray, CVar (if (sign < 0) then "ri" else "ii"));
Chris@10 111 Stmt_assign (CVar roarray, CVar (if (sign < 0) then "ro" else "io"));
Chris@10 112 For (Expr_assign (CVar i, CVar v),
Chris@10 113 Binop (" > ", CVar i, Integer 0),
Chris@10 114 list_to_comma
Chris@10 115 [Expr_assign (CVar i, CPlus [CVar i; CUminus (byvl (Integer 1))]);
Chris@10 116 Expr_assign (CVar riarray, CPlus [CVar riarray;
Chris@10 117 byvl (CVar sivs)]);
Chris@10 118 Expr_assign (CVar roarray, CPlus [CVar roarray;
Chris@10 119 byvl (CVar sovs)]);
Chris@10 120 make_volatile_stride (2*n) (CVar istride);
Chris@10 121 make_volatile_stride (2*n) (CVar ostride)
Chris@10 122 ],
Chris@10 123 Asch annot);
Chris@10 124 ])
Chris@10 125 in
Chris@10 126
Chris@10 127 let tree =
Chris@10 128 Fcn ((if !Magic.standalone then "void" else "static void"), ename,
Chris@10 129 ([Decl (C.constrealtypep, "ri");
Chris@10 130 Decl (C.constrealtypep, "ii");
Chris@10 131 Decl (C.realtypep, "ro");
Chris@10 132 Decl (C.realtypep, "io");
Chris@10 133 Decl (C.stridetype, istride);
Chris@10 134 Decl (C.stridetype, ostride);
Chris@10 135 Decl ("INT", v);
Chris@10 136 Decl ("INT", "ivs");
Chris@10 137 Decl ("INT", "ovs")]),
Chris@10 138 finalize_fcn body)
Chris@10 139
Chris@10 140 in
Chris@10 141 let desc =
Chris@10 142 Printf.sprintf
Chris@10 143 "static const kdft_desc desc = { %d, %s, %s, &GENUS, %s, %s, %s, %s };\n"
Chris@10 144 n (stringify name) (flops_of tree)
Chris@10 145 (stride_to_solverparm !uistride) (stride_to_solverparm !uostride)
Chris@10 146 (choose_simd "0" (stride_to_solverparm !uivstride))
Chris@10 147 (choose_simd "0" (stride_to_solverparm !uovstride))
Chris@10 148
Chris@10 149 and init =
Chris@10 150 (declare_register_fcn name) ^
Chris@10 151 "{" ^
Chris@10 152 " X(kdft_register)(p, " ^ ename ^ ", &desc);\n" ^
Chris@10 153 "}\n"
Chris@10 154
Chris@10 155 in ((unparse tree) ^ "\n" ^
Chris@10 156 (if !Magic.standalone then "" else desc ^ init))
Chris@10 157
Chris@10 158 let main () =
Chris@10 159 begin
Chris@10 160 Simdmagic.simd_mode := true;
Chris@10 161 parse speclist usage;
Chris@10 162 print_string (generate (check_size ()));
Chris@10 163 end
Chris@10 164
Chris@10 165 let _ = main()