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

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/mid-to-low/gen-kernel.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/mid-to-low/gen-kernel.sml

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

revision 2552, Fri Feb 28 19:03:27 2014 UTC revision 2553, Sun Mar 2 19:53:33 2014 UTC
# Line 3  Line 3 
3      local      local
4      structure E = Ein      structure E = Ein
5     structure DstOp = LowOps     structure DstOp = LowOps
6      structure genHelper=genHelper  
7      structure evalKrn =evalKrn      structure evalKrn =evalKrn
8  structure SrcIL = MidIL  structure SrcIL = MidIL
9  structure SrcOp = MidOps  structure SrcOp = MidOps
# Line 16  Line 16 
16      in      in
17    
18    
19    fun insert (key, value) d =fn s =>
20    if s = key then SOME value
21    else d s
22    
23    fun lookup k d = d k
24    
25    fun find(v, mapp)=let
26    val a=lookup v mapp
27    in (case a of NONE=> raise Fail "Outside Bound"
28    |SOME s => s)
29    end
30    
31    val empty =fn key =>NONE
32    
33  (*Add,Subtract Scalars*)  (*Add,Subtract Scalars*)
34  fun mkSimpleOp(mapp,e,args)=let  fun mkSimpleOp(mapp,e,args)=let
35    
36      fun subP e=(case e      fun subP e=(case e
37          of E.Tensor(t1,ix1)=>genHelper.mkSca(mapp,(t1,ix1,args))          of E.Tensor(t1,ix1)=>gHelper.mkSca(mapp,(t1,ix1,args))
38          | E.Value v1=> genHelper.aaV(DstOp.C (List.nth(mapp,v1)),[],"Const",DstTy.TensorTy([]))          (*| E.Value v1=> gHelper.aaV(DstOp.C (List.nth(mapp,v1)),[],"Const",DstTy.TensorTy([]))*)
39          | E.Const c=> genHelper.aaV(DstOp.C 9,[],"Const",DstTy.TensorTy([]))          | E.Value v1=> gHelper.aaV(DstOp.C (find(v1,mapp)),[],"Const",DstTy.TensorTy([]))
40            | E.Const c=> gHelper.aaV(DstOp.C 9,[],"Const",DstTy.TensorTy([]))
41      (*end case*))      (*end case*))
42    
43      in (case e      in (case e
44          of E.Sub(e1,e2)=> let          of E.Sub(e1,e2)=> let
45              val (vA,A)=subP e1              val (vA,A)=subP e1
46              val (vB,B)=subP e2              val (vB,B)=subP e2
47              val (vD,D)=genHelper.aaV(DstOp.subSca,[vA,vB],"Subsca",DstTy.TensorTy([]))              val (vD,D)=gHelper.aaV(DstOp.subSca,[vA,vB],"Subsca",DstTy.TensorTy([]))
48              in (vD,A@B@D) end              in (vD,A@B@D) end
49          | E.Add[e1,e2]=> let          | E.Add[e1,e2]=> let
50              val (vA,A)=subP e1              val (vA,A)=subP e1
51              val (vB,B)=subP e2              val (vB,B)=subP e2
52              val (vD,D)=genHelper.aaV(DstOp.addSca, [vA,vB],"addsca",DstTy.TensorTy([]))              val (vD,D)=gHelper.aaV(DstOp.addSca, [vA,vB],"addsca",DstTy.TensorTy([]))
53              in (vD,A@B@D) end              in (vD,A@B@D) end
54          (* ebd case*))          (* ebd case*))
55      end      end
# Line 46  Line 60 
60  fun consfn([],rest, code,dim,n)=(rest,code)  fun consfn([],rest, code,dim,n)=(rest,code)
61      | consfn(e::es,rest,code,dim,n)=let      | consfn(e::es,rest,code,dim,n)=let
62          val gg=length(e)          val gg=length(e)
63          val (vA,A)=genHelper.aaV(DstOp.cons(DstTy.TensorTy [gg],0),List.rev e,"Cons "^Int.toString(n)^":--",DstTy.TensorTy([gg]))          val (vA,A)=gHelper.aaV(DstOp.cons(DstTy.TensorTy [gg],0),List.rev e,"Cons "^Int.toString(n)^":--",DstTy.TensorTy([gg]))
64          in consfn(es, [vA]@rest, A@code,dim,n+1)          in consfn(es, [vA]@rest, A@code,dim,n+1)
65          end          end
66    
# Line 72  Line 86 
86    
87    
88  fun sumP(a,b,last)=let  fun sumP(a,b,last)=let
89      val (vD, D)=genHelper.aaV(DstOp.prodVec(last),[a, b],"prodV",DstTy.TensorTy([last]))      val (vD, D)=gHelper.aaV(DstOp.prodVec(last),[a, b],"prodV",DstTy.TensorTy([last]))
90      val (vE, E)=genHelper.aaV(DstOp.sumVec(last),[vD],"sumVec",DstTy.intTy)      val (vE, E)=gHelper.aaV(DstOp.sumVec(last),[vD],"sumVec",DstTy.intTy)
91      in (vE,D@E) end      in (vE,D@E) end
92    
93  fun ccons(rest,shape)= let  fun ccons(rest,shape)= let
94      val(vE,E)=genHelper.aaV(DstOp.cons(DstTy.TensorTy shape,0),rest,"Cons",DstTy.TensorTy(shape))      val(vE,E)=gHelper.aaV(DstOp.cons(DstTy.TensorTy shape,0),rest,"Cons",DstTy.TensorTy(shape))
95      in (vE,E) end      in (vE,E) end
96  fun printMap ix=String.concat(List.map (fn e1=>Int.toString(e1)) ix)  
97    
98    
99  (*Images*)  (*Images*)
100  fun mkImg(mappOrig,sx,[(fid,ix,px)],v,args)=let  fun mkImg(mappOrig,sx,[(fid,ix,px)],v,args)=let
101    
102      val ll=print("\n\n\n image \n\n")      val ll=print("\n\n\n image \n\n")
103      val (_,lb,ub)=hd(sx)      val (E.V vid,lb,ub)=hd(sx)
104      val top=ub-lb      val top=ub-lb
105      val R=top+1      val R=top+1
106      val dim=length(px)      val dim=length(px)
# Line 97  Line 111 
111    
112      fun  createImgVar mapp=let      fun  createImgVar mapp=let
113          fun mkpos([E.Add[E.Tensor(t1,ix1),_]],rest,code)= let          fun mkpos([E.Add[E.Tensor(t1,ix1),_]],rest,code)= let
114              val (vA,A)=genHelper.mkSca(mapp,(t1,ix1,args))              val (vA,A)=gHelper.mkSca(mapp,(t1,ix1,args))
115    
116              in              in
117                  (rest@[vA],code@A)                  (rest@[vA],code@A)
# Line 107  Line 121 
121              val (vF,code1)=mkSimpleOp(mapp,pos1,args)              val (vF,code1)=mkSimpleOp(mapp,pos1,args)
122              in mkpos(es,rest@[vF],code@code1)              in mkpos(es,rest@[vF],code@code1)
123              end              end
124          val ix1=List.map (fn (e1)=> genHelper.mapIndex(e1,mapp)) ix          val ix1=List.map (fn (e1)=> gHelper.mapIndex(e1,mapp)) ix
125          val (vF,F)= mkpos(px,[],[])          val (vF,F)= mkpos(px,[],[])
126          val imgType=DstTy.imgIndex ix1          val imgType=DstTy.imgIndex ix1
127          val (vA,A)=genHelper.aaV(DstOp.imgAddr(v,imgType,dim),vF,"Imageaddress",DstTy.intTy)          val (vA,A)=gHelper.aaV(DstOp.imgAddr(v,imgType,dim),vF,"Imageaddress",DstTy.intTy)
128          val (vB,B)=genHelper.aaV(DstOp.imgLoad(v,dim,R),[vA],"imgLoad"^(printMap mapp)^"---",DstTy.tensorTy([R]))          val (vB,B)=gHelper.aaV(DstOp.imgLoad(v,dim,R),[vA],"imgLoad---",DstTy.tensorTy([R]))
129          in          in
130              (vB,F@A@B)              (vB,F@A@B)
131          end          end
132    
133    
134      fun sumI1(lft,ix,0,0,code)=let      fun sumI1(lft,ix,0,0,code,n')=let
135              val mapp=mappOrig@ix@[lb]              val mapp=insert (n', lb) ix
136              val (lft', code')= createImgVar mapp              val (lft', code')= createImgVar mapp
137              in ([lft']@lft,code'@code)              in ([lft']@lft,code'@code)
138              end              end
139      |  sumI1(lft,ix,i,0,code)=let      |  sumI1(lft,ix,i,0,code,n')=let
140          val mapp=mappOrig@ix@[i]          val mapp=insert (n', i-1) ix
141          val (lft', code')=createImgVar mapp          val (lft', code')=createImgVar mapp
142          in sumI1([lft']@lft,ix,i-1,0,code'@code)          in sumI1([lft']@lft,ix,i-1,0,code'@code,n')
143          end          end
144      | sumI1(lft,ix,0,n,code)=      | sumI1(lft,ix,0,n,code,n')=let
145          sumI1(lft,ix@[lb],top,n-1,code)          val mapp=insert (n', lb) ix
146      | sumI1(lft,ix,i,n, code)=let          in
147          val (lft',code')=sumI1(lft,ix@[i+lb],top,n-1,code)              sumI1(lft,mapp,top,n-1,code,n'+1)
148          in sumI1(lft',ix,i-1,n,code') end           end
149        | sumI1(lft,ix,i,n, code,n')=let
150             val mapp=insert (n', i+lb) ix
151            val (lft',code')=sumI1(lft,mapp,top,n-1,code,n'+1)
152            in sumI1(lft',ix,i-1,n,code',n') end
153    
154    
155      val(lft,code)=sumI1([],[],top,dim-2,[])      val(lft,code)=sumI1([],mappOrig,top,dim-2,[],vid)
156      val g=print ("Number of Assignments returned"^Int.toString(length(lft)))      val g=print ("Number of Assignments returned"^Int.toString(length(lft)))
157      in      in
158          (lft,code)          (lft,code)
# Line 142  Line 161 
161    
162    
163  (* kernels*)  (* kernels*)
 fun  mkkrns(a,sx,k1,h,args)=let  
     val ll=print("\n\n\n Kernel code \n ")  
164    
165      val k= List.map (fn (id,d1,pos)=>(id,genHelper.evalDelta(d1,a),pos)) k1  fun  mkkrns2(mappOrig,sx,k1,h,args)=let
166      val tester=print "Differentiaiton value of kernels:"      val r= print("\n\n\n Kernel code \n  outer Index")
167       val mm= gHelper.printIndexXX(0,mappOrig)
168    
169        val k= List.map (fn (id,d1,pos)=>(id,gHelper.evalDelta(d1,mappOrig),pos)) k1
170        val tester=print "Differentiation value of kernels:"
171      val uu=List.map (fn(id,v, pos)=> print(Int.toString(v)))  k      val uu=List.map (fn(id,v, pos)=> print(Int.toString(v)))  k
172    
173      val (_,lb,ub)=hd(sx)      val (E.V sid,lb,ub)=hd(sx)
174      val R=(ub-lb)      val R=(ub-lb)
175      val R'=R+1      val R'=R+1
176    
177      fun mm(e)=Int.toString e      fun mm(e)=Int.toString e
178      val qq=print(String.concat["\n ub:", mm ub, "lb:", mm lb, "Range", mm R ])      val qq=print(String.concat["\n ub:", mm ub, "lb:", mm lb, "Range", mm R ])
179    
180      fun q([],fin,l,ix, i,code)=(fin,code)      fun q([],fin,l,ix, i,code,n')=(fin,code)
181          | q((id1,d,pos1)::ks,fin,l,ix,0,code)=let          | q((id1,d,pos1)::ks,fin,l,ix,0,code,n')=let
182              val mapp=a@ix@[lb]              val mapp=insert (n', lb) ix
183              val (l', code')=mkSimpleOp(mapp,pos1,args)              val (l', code')=mkSimpleOp(mapp,pos1,args)
184              val e=l@[l']              val e=l@[l']
185              in  q(ks,fin@[e],[],ix@[0],R,code@code')              val mapp'=insert (n', 0) ix
186                in  q(ks,fin@[e],[],mapp',R,code@code',n'+1)
187              end              end
188          | q(k::ks,fin,l,ix, i,code)=let          | q(k::ks,fin,l,ix, i,code,n')=let
189              val (id1,d,pos1)=k              val (id1,d,pos1)=k
190              val mapp=a@ix@[lb+i]              val mapp= insert (n', lb+i) ix
191              val (l', code')=mkSimpleOp(mapp,pos1,args)              val (l', code')=mkSimpleOp(mapp,pos1,args)
192              in  q(k::ks,fin,l@[l'],ix,i-1,code@code')              in  q(k::ks,fin,l@[l'],ix,i-1,code@code',n')
193              end              end
194    
195    
196      val(lftkrn,code)=q(k,[],[],[],R,[])      val(lftkrn,code)=q(k,[],[],mappOrig,R,[],sid)
197      val (lft,code')=consfn((lftkrn),[],[],R,0)      val (lft,code')=consfn((lftkrn),[],[],R,0)
198    
199      (*evalKernel-comment this part out to simplify code generated*)      (*evalKernel-comment this part out to simplify code generated*)
# Line 202  Line 224 
224      fun dhz([],conslist,rest,code,_,_)=(conslist,code)      fun dhz([],conslist,rest,code,_,_)=(conslist,code)
225      | dhz(e::es,conslist,rest,code,hz,0)=let      | dhz(e::es,conslist,rest,code,hz,0)=let
226          val (vA,A)=sumP(e,hz,R)          val (vA,A)=sumP(e,hz,R)
227          val (vD,D)=genHelper.aaV(DstOp.cons(DstTy.intTy,R),rest@[vA],"Cons",tyV)          val (vD,D)=gHelper.aaV(DstOp.cons(DstTy.intTy,R),rest@[vA],"Cons",tyV)
228          in dhz(es,conslist@[vD],[],code@A@D,hz,R-1)          in dhz(es,conslist@[vD],[],code@A@D,hz,R-1)
229          end          end
230      | dhz(e::es,conslist,rest,code,hz,r)=let      | dhz(e::es,conslist,rest,code,hz,r)=let
# Line 213  Line 235 
235    
236      fun dhy([],rest,code,hy)=   let      fun dhy([],rest,code,hy)=   let
237               val n=length(rest)               val n=length(rest)
238              val (vD,D)=genHelper.aaV(DstOp.cons(DstTy.intTy,n),rest,"Cons",tyV)              val (vD,D)=gHelper.aaV(DstOp.cons(DstTy.intTy,n),rest,"Cons",tyV)
239              in              in
240              (vD,code@D) end              (vD,code@D) end
241          | dhy(e::es,rest,code,hy)=let          | dhy(e::es,rest,code,hy)=let
# Line 247  Line 269 
269      (*end case*))      (*end case*))
270      end      end
271    
272  fun  evalField(a,(E.Sum(sx,E.Prod e),v,h,args))=let  fun  evalField(mapp,(E.Sum(sx,E.Prod e),v,h,args))=let
273      val ar=print "\n\n ************** new direction **********\n\n Outer Bound:"      val ar=print "\n\n ************** new direction **********\n\n Outer Bound:"
274      val tester=print(printMap a)  
275    
276      val (img1,k1)=sortK([],[],e)      val (img1,k1)=sortK([],[],e)
277      val (_,lb,ub)=hd(sx)      val (_,lb,ub)=hd(sx)
278      val R=(ub-lb)+1      val R=(ub-lb)+1
279    
280      val (imgArg,imgCode)= mkImg(a,sx,img1,v,args)      val (imgArg,imgCode)= mkImg(mapp,sx,img1,v,args)
281      val (krnArg, krnCode)= mkkrns(a,sx,k1,h,args)      val (krnArg, krnCode)= mkkrns2(mapp,sx,k1,h,args)
282      val (vA,A)=prodImgKrn(imgArg,krnArg,R)      val (vA,A)=prodImgKrn(imgArg,krnArg,R)
283      in  (vA,imgCode@krnCode@A)      in  (vA,imgCode@krnCode@A)
284    

Legend:
Removed from v.2552  
changed lines
  Added in v.2553

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