Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/mid-to-low/field-to-low.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/mid-to-low/field-to-low.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3741 - (view) (download)

1 : jhr 3727 (* field-to-low.sml
2 :     *
3 :     * NOTE: this code will need to be changed if we ever want to support different kernels
4 :     * for different axes
5 :     *
6 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
7 :     *
8 :     * COPYRIGHT (c) 2016 The University of Chicago
9 :     * All rights reserved.
10 :     *)
11 :    
12 :     structure FieldToLow : sig
13 :    
14 :     (* expand a MidIR probe to LowIR code. The arguments are:
15 :     *
16 : jhr 3728 * avail -- available LowIR assignments
17 :     * mapp -- mapping from iteration indices to deBruijn indices
18 :     * sx -- summation bounds
19 :     * prod -- body of summation, which is a product of Ein expressions
20 :     * lowArgs -- the actual arguments of the enclosing Ein expression
21 : jhr 3727 *)
22 :     val expand : {
23 :     avail : AvailRHS.t,
24 :     mapp : int IntRedBlackMap.map,
25 :     sx : Ein.sumrange list,
26 : jhr 3728 prod : Ein.ein_exp list,
27 :     lowArgs : LowIR.var list
28 : jhr 3727 } -> LowIR.var
29 :    
30 :     end = struct
31 :    
32 :     structure IR = LowIR
33 :     structure Ty = LowTypes
34 :     structure Op = LowOps
35 :     structure Var = LowIR.Var
36 :     structure E = Ein
37 :     structure Mk = MkLowIR
38 :     structure IMap = IntRedBlackMap
39 :    
40 : cchiw 3741 (*Index cons at piece*)
41 :     fun getHolder(args, id, piece) = let
42 :     val t = List.nth(args, id)
43 :     in (case IR.Var.binding (t)
44 :     of IR.VB_RHS(IR.CONS(eargs, _)) =>
45 :     if (length(eargs)>piece) then List.nth(eargs, piece)
46 :     else raise Fail "Holder error"
47 :     | IR.VB_RHS(IR.OP(_, _)) => t
48 :     | vb
49 :     => raise Fail(String.concat["\ngetHolder found ",Var.name(t),"=", IR.vbToString vb, " at ", Int.toString(id)])
50 :     (* end case *))
51 :     end
52 : jhr 3727
53 : cchiw 3741 (* Product of Image and Kernel *)
54 :     fun prodImgKrn (avail, imgArg, krnArg, range0) = let
55 :     val range1 = range0+1
56 :     fun ConsInt args = let
57 :     val ty = Ty.TensorTy [range1]
58 :     val rhs = IR.CONS (args, ty)
59 :     in
60 :     AvailRHS.addAssign (avail,"cons"^"_", ty, rhs)
61 :     end
62 :    
63 :     fun mkDotVec (a,b) = Mk.vecDot(avail, range1, a, b)
64 :    
65 :     fun mul2d ([], rest, hy) = ConsInt (List.rev rest)
66 :     | mul2d (e::es, rest, hy) = let
67 :     val vA = mkDotVec (e, hy)
68 :     in
69 :     mul2d (es, vA::rest, hy)
70 :     end
71 :     fun mul3d ([], _ , _, rest, hz) = rest
72 :     | mul3d (e1::es, rest, 0, consrest, hz) = let
73 :     val vA = mkDotVec (hz, e1)
74 :     val vD = ConsInt (rest@[vA])
75 :     in
76 :     mul3d (es, [], range0, consrest@[vD], hz)
77 :     end
78 :     | mul3d (e1::es, rest, n, consrest, hz) = let
79 :     val vA = mkDotVec (hz, e1)
80 :     in
81 :     mul3d (es, rest@[vA], n-1, consrest, hz)
82 :     end
83 :     (*Create Product by doing case analysis of the dimension*)
84 :     in (case (krnArg, imgArg)
85 :     of ([h0], [i]) => mkDotVec (i, h0) (*1-D case*)
86 :     | ([h0, h1], _) => let
87 :     val vA = mul2d (imgArg, [], h0)
88 :     in
89 :     mkDotVec (vA, h1)
90 :     end
91 :     | ([h0, h1, h2], _) => let
92 :     val restZ = mul3d (imgArg, [], range0, [], h0)
93 :     val restY = mul2d (restZ, [], h1)
94 :     in
95 :     mkDotVec (h2, restY)
96 :     end
97 :     | _ => raise Fail "Kernel dimensions not between 1-3"
98 :     (*end case*))
99 :     end
100 :    
101 :    
102 : jhr 3728 (* expand a MidIR probe to LowIR code. *)
103 : cchiw 3741 fun expand {avail, mapp, sx, prod as E.Img imgexp::krnexps, lowArgs} = let
104 :    
105 :     val imgId = #1 imgexp
106 :     (* get the image argument *)
107 :     val (imgArg, imgInfo) = let
108 :     val imgArg = List.nth(lowArgs, imgId)
109 :     val imgInfo = (case IR.Var.getDef imgArg
110 :     of IR.OP(Op.LoadImage(Ty.ImageTy img, _), _) => img
111 :     | IR.GLOBAL gv => raise Fail "FIXME: input variable"
112 :     | _ => raise Fail "unable to get image argument"
113 :     (* end case *))
114 :     in
115 :     (imgArg, imgInfo)
116 :     end
117 :     (* get the outermost index; note that the (lb, ub) will be the same for all
118 :     * of the indices, since the same kernel (and support) is used for all axes.
119 :     *)
120 :     val (E.V sid, lb, ub) :: _ = sx
121 :     val range0 = (ub-lb)
122 :    
123 :     val imgArgs = EvalImg.mkImg (avail, mapp, lowArgs, sx, imgexp, imgInfo, imgArg, lb, range0)
124 :    
125 :     (* get piece for each kernel *)
126 :     fun getf(E.Krn(id, dels, _)) =
127 :     let
128 :     (* evaluate dels to integer *)
129 :     val delta = List.foldl(fn((i, j), y) => Mk.evalDelta(mapp, i, j) + y) 0 dels
130 :     in
131 :     getHolder(lowArgs, id, delta) (* selects variable in holder/cons list *)
132 :     end
133 :     val krnArgs = List.map getf krnexps (* doesn't create code *)
134 : jhr 3727 in
135 : cchiw 3741 prodImgKrn (avail, imgArgs, krnArgs, range0)
136 : jhr 3727 end
137 :    
138 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0