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