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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3728, Wed Apr 6 20:05:42 2016 UTC revision 3741, Sun Apr 10 23:33:56 2016 UTC
# Line 17  Line 17 
17     *    mapp    -- mapping from iteration indices to deBruijn indices     *    mapp    -- mapping from iteration indices to deBruijn indices
18     *    sx      -- summation bounds     *    sx      -- summation bounds
19     *    prod    -- body of summation, which is a product of Ein expressions     *    prod    -- body of summation, which is a product of Ein expressions
    *    params  -- the formal parameters of the enclosing Ein expression  
    *    midArgs -- the MidIR actual arguments of the enclosing Ein expression  
20     *    lowArgs -- the actual arguments of the enclosing Ein expression     *    lowArgs -- the actual arguments of the enclosing Ein expression
21     *)     *)
22      val expand : {      val expand : {
# Line 26  Line 24 
24              mapp : int IntRedBlackMap.map,              mapp : int IntRedBlackMap.map,
25              sx : Ein.sumrange list,              sx : Ein.sumrange list,
26              prod : Ein.ein_exp list,              prod : Ein.ein_exp list,
 (* FIXME: do we need the params? *)  
             params : Ein.param_kind list,  
             midArgs : MidIR.var list,  
27              lowArgs : LowIR.var list              lowArgs : LowIR.var list
28            }  -> LowIR.var            }  -> LowIR.var
29    
# Line 42  Line 37 
37      structure Mk = MkLowIR      structure Mk = MkLowIR
38      structure IMap = IntRedBlackMap      structure IMap = IntRedBlackMap
39    
40    (* partition expressions into image and kernel expressions *)      (*Index cons at piece*)
41      fun partition (E.Img img :: (kexps as k1::rest)) = let      fun getHolder(args, id, piece) = let
42            fun stripK (E.Krn k) = k          val t = List.nth(args, id)
43              | stripK _ = raise Fail "expected kernel"          in (case IR.Var.binding (t)
44            val k1 = stripK k1              of IR.VB_RHS(IR.CONS(eargs, _)) =>
45            val rest = List.map stripK rest                  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    
53        (* 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            in
60              (#1 img, #1 k1, k1::rest)                   AvailRHS.addAssign (avail,"cons"^"_", ty, rhs)
61            end            end
62        | partition _ = raise Fail "missing image/kernel"  
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    (* expand a MidIR probe to LowIR code. *)    (* expand a MidIR probe to LowIR code. *)
103      fun expand {avail, mapp, sx, prod, params, midArgs, lowArgs} = let      fun expand {avail, mapp, sx, prod as E.Img imgexp::krnexps, lowArgs} = let
104            val (imgId, kernId, kexps) = partition prod  
105            val imgId = #1 imgexp
106          (* get the image argument *)          (* get the image argument *)
107            val (imgArg, imgInfo) = let            val (imgArg, imgInfo) = let
108                  val imgArg = List.nth(lowArgs, imgId)                  val imgArg = List.nth(lowArgs, imgId)
# Line 67  Line 114 
114                  in                  in
115                    (imgArg, imgInfo)                    (imgArg, imgInfo)
116                  end                  end
         (* get the kernel argument.  We use the MidIR args, because there are no kernels  
          * in LowIR.  
          *)  
           val h = (case MidIR.Var.getDef (List.nth(midArgs, kernId))  
                  of MidIR.OP(MidOps.Kernel h, []) => h  
                   | _ => raise Fail "unable to get kernel argument"  
                 (* end case *))  
117          (* get the outermost index; note that the (lb, ub) will be the same for all          (* 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.           * of the indices, since the same kernel (and support) is used for all axes.
119           *)           *)
120            val (E.V sid, lb, ub) :: _ = sx            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            in            in
135  raise Fail "FIXME"           prodImgKrn (avail, imgArgs, krnArgs, range0)
136            end            end
137    
138    end    end

Legend:
Removed from v.3728  
changed lines
  Added in v.3741

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