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/ein-to-vector.sml
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3720 - (view) (download)

1 : jhr 3666 (* ein-to-vector.sml
2 : jhr 3648 *
3 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2016 The University of Chicago
6 :     * All rights reserved.
7 :     *)
8 : jhr 3646
9 : jhr 3648 structure EinToVector : sig
10 :    
11 : jhr 3666 (* an environment that maps De Bruijn indices to their iteration-index value *)
12 :     type index_env = int IntRedBlackMap.map
13 :    
14 :     datatype param_kind = Indx | Proj of Ein.index_id
15 :    
16 :     datatype param = Param of {
17 :     id : int, (* the parameter's DeBruijn index *)
18 :     arg : LowIR.var, (* the corresponding argument *)
19 : jhr 3670 ix : Ein.alpha, (* the multi-index used to subscript the argument *)
20 :     kind : param_kind (* are we extracting a scalar (Indx) or projecting out
21 :     * a vector from the last dimension (Proj)?
22 :     *)
23 : jhr 3666 }
24 :    
25 : jhr 3670 (* vector negation *)
26 :     val negV : AvailRHS.t * index_env * param -> LowIR.var
27 :    
28 : jhr 3685 (* vector sum of a sequence of vectors *)
29 : jhr 3710 val addV : AvailRHS.t * index_env * param list -> LowIR.var
30 : jhr 3685
31 : jhr 3704 (* vector dot product *)
32 :     val dotV : AvailRHS.t * index_env * param * param -> LowIR.var
33 :    
34 : jhr 3707 (* `sumDotV (avail, mapp, (ix, lb, ub, vecA, vecB))`
35 :     * generates code to compute the sum of the dot products between vecA and vecB, for
36 :     * lb <= ix <= ub.
37 :     *)
38 : jhr 3710 val sumDotV : AvailRHS.t * index_env * Ein.index_id * int * int * param * param -> LowIR.var
39 : jhr 3707
40 : jhr 3703 (* generic binary operations on vectors *)
41 : jhr 3710 val binopV : LowOps.rator * int -> AvailRHS.t * index_env * param * param -> LowIR.var
42 : jhr 3703
43 : jhr 3648 end = struct
44 :    
45 : jhr 3670 structure IR = LowIR
46 : jhr 3646 structure Ty = LowTypes
47 :     structure Op = LowOps
48 :     structure E = Ein
49 : jhr 3648 structure Mk = MkLowIR
50 : jhr 3646 structure IMap = IntRedBlackMap
51 :    
52 : jhr 3666 (* an environment that maps De Bruijn indices to their iteration-index value *)
53 :     type index_env = int IMap.map
54 : jhr 3646
55 : jhr 3666 datatype param_kind = Indx | Proj of Ein.index_id
56 : jhr 3646
57 : jhr 3666 datatype param = Param of {
58 :     id : int, (* the parameter's DeBruijn index *)
59 : jhr 3670 arg : IR.var, (* the corresponding argument *)
60 : jhr 3666 ix : E.alpha, (* ?? *)
61 :     kind : param_kind
62 :     }
63 : jhr 3646
64 : jhr 3670 fun alphaToIdxs (mapp, mus) = let
65 :     fun lookup (E.V id) = (case IMap.find (mapp, id)
66 :     of SOME n => n
67 :     | NONE => raise Fail(concat["alphaToIdxs(_, V ", Int.toString id, "): out of bounds"])
68 :     (* end case *))
69 :     | lookup (E.C i) = i
70 :     in
71 :     List.map lookup mus
72 :     end
73 :    
74 :     (* convert a parameter to its LowIL variable equivalent *)
75 : jhr 3671 fun paramToVar (_, _, Param{arg, ix = [], ...}) = arg
76 : jhr 3670 | paramToVar (avail, mapp, Param{id, arg, ix, kind}) = (
77 :     case (kind, LowIR.Var.ty arg)
78 : jhr 3671 of (Indx, ty) => AvailRHS.addAssign (
79 : jhr 3670 avail, "indx", Ty.realTy,
80 :     IR.OP(Op.TensorIndex(ty, alphaToIdxs (mapp, ix)), [arg]))
81 :     | (Proj dim, ty) => AvailRHS.addAssign (
82 :     avail, "proj", Ty.TensorTy[dim],
83 :     IR.OP(Op.ProjectLast(ty, alphaToIdxs (mapp, ix)), [arg]))
84 :     (* end case *))
85 :    
86 :     (* vector negation *)
87 :     fun negV (avail, mapp, vec) = let
88 :     val v = paramToVar (avail, mapp, vec)
89 :     val ty as Ty.TensorTy[dim] = IR.Var.ty v
90 :     in
91 : jhr 3703 AvailRHS.addAssign (avail, "negV", ty, IR.OP(Op.VNeg dim, [v]))
92 : jhr 3670 end
93 :    
94 : jhr 3720 (* vector addition for a sequence of vectors *)
95 : jhr 3710 fun addV (avail, mapp, vs) = let
96 :     val vs as (v :: _) = List.map (fn v => paramToVar (avail, mapp, v)) vs
97 :     val Ty.TensorTy[dim] = IR.Var.ty v
98 : jhr 3704 in
99 : jhr 3710 Mk.reduce (avail, fn (avail, u, v) => Mk.vecAdd(avail, dim, u, v), vs)
100 : jhr 3704 end
101 : jhr 3670
102 : jhr 3704 (* dot product of two vectors *)
103 :     fun dotV (avail, mapp, u, v) = let
104 :     val u = paramToVar (avail, mapp, u)
105 :     val v = paramToVar (avail, mapp, v)
106 :     val ty as Ty.TensorTy[dim] = IR.Var.ty u
107 :     val prod = AvailRHS.addAssign (avail, "mulV", ty, IR.OP(Op.VMul dim, [u, v]));
108 :     in
109 :     AvailRHS.addAssign (avail, "sumV", Ty.realTy, IR.OP(Op.VSum dim, [prod]))
110 :     end
111 :    
112 : jhr 3707 (* `sumDotV (avail, mapp, (ix, lb, ub, vecA, vecB))`
113 : jhr 3703 *)
114 : jhr 3710 fun sumDotV (avail, mapp, ix, lb, ub, vecA, vecB) = let
115 : jhr 3707 fun dotp i = dotV (avail, IMap.insert(mapp, ix, i), vecA, vecB)
116 :     (* compute the sum of dot products for lb <= i <= ub, where sum is initialized
117 :     * to the dot produce for lb.
118 :     *)
119 :     fun sum (i, acc) =
120 :     if (i <= ub)
121 :     then sum (i+1, Mk.realAdd (avail, acc, dotp i))
122 :     else acc
123 :     in
124 :     sum (lb+1, dotp lb)
125 :     end
126 : jhr 3703
127 :     (* generic binary operations on vectors *)
128 : jhr 3710 fun binopV (rator, dim) (avail, mapp, u, v) = let
129 : jhr 3703 val u = paramToVar (avail, mapp, u)
130 :     val v = paramToVar (avail, mapp, v)
131 :     in
132 :     AvailRHS.addAssign (avail, "binopV", Ty.TensorTy[dim], IR.OP(rator, [u, v]))
133 :     end
134 :    
135 : jhr 3670 end

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