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

SCM Repository

[diderot] Diff of /branches/charisee_dev/src/compiler/high-to-mid/split.sml
ViewVC logotype

Diff of /branches/charisee_dev/src/compiler/high-to-mid/split.sml

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

branches/charisee/src/compiler/high-to-mid/split.sml revision 3229, Thu Jul 30 16:10:54 2015 UTC branches/charisee_dev/src/compiler/high-to-mid/split.sml revision 3378, Fri Nov 6 15:39:55 2015 UTC
# Line 1  Line 1 
1  (* Currently under construction  (* Currently under construction
2   *   *
3   * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)   * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4     *
5     * COPYRIGHT (c) 2015 The University of Chicago
6   * All rights reserved.   * All rights reserved.
7   *)   *)
8    
# Line 34  Line 36 
36    
37      val numFlag=1   (*remove common subexpression*)      val numFlag=1   (*remove common subexpression*)
38      val testing=0      val testing=0
39      fun setEin(params,index,body)=Ein.EIN{params=params, index=index, body=body}      val splitlimit=500
40      fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))      fun mkEin e = E.mkEin e
41      val einappzero=DstIL.EINAPP(setEin([],[],E.Const 0),[])      val einappzero= DstIL.EINAPP(mkEin([],[],E.Const 0),[])
42      fun setEinZero y=  (y,einappzero)      fun setEinZero y=  (y,einappzero)
43      fun cleanParams e =cleanP.cleanParams e      fun cleanParams e =cleanP.cleanParams e
44      fun cleanIndex e =cleanI.cleanIndex e      fun cleanIndex e =cleanI.cleanIndex e
45      fun printEINAPP e=MidToString.printEINAPP e      fun toStringBind e= MidToString.toStringBind e
46      fun itos i =Int.toString i      fun itos i =Int.toString i
     fun filterSca e=Filter.filterSca e  
47      fun err str=raise Fail str      fun err str=raise Fail str
48      val cnt = ref 0      val cnt = ref 0
49      fun incUse (DstIL.V{useCnt, ...}) = (useCnt := !useCnt + 1)      fun incUse (DstIL.V{useCnt, ...}) = (useCnt := !useCnt + 1)
# Line 113  Line 114 
114          | E.Krn _     => err("Krn used before expand")          | E.Krn _     => err("Krn used before expand")
115          | E.Value _   => err("Value used before expand")          | E.Value _   => err("Value used before expand")
116          | E.Img _     => err("Probe used before expand")          | E.Img _     => err("Probe used before expand")
117    |  Ein.PowEmb(e1,sx1,n1) =>1
118          | _           => 2          | _           => 2
119      (*end case*))      (*end case*))
120    
   
   
121      fun rewriteOp3(name,sx,e1,x)=let      fun rewriteOp3(name,sx,e1,x)=let
122          val ((y, DstIL.EINAPP(ein,args)),fieldset,flag)=x          val ((y, DstIL.EINAPP(ein,args)),fieldset,flag)=x
123          val params=Ein.params ein          val params=Ein.params ein
# Line 138  Line 138 
138          | 2     => (e1,params,args,[],fieldset)             (*not lifted*)          | 2     => (e1,params,args,[],fieldset)             (*not lifted*)
139          (*end*))          (*end*))
140    
   
   
   
141      fun rewriteOps(name,list1,params,index,sx,args,fieldset0,flag)=let      fun rewriteOps(name,list1,params,index,sx,args,fieldset0,flag)=let
142          fun m([],rest,params,args,code,fieldset)=(rest,params,args,code,fieldset)          fun m([],rest,params,args,code,fieldset)=(rest,params,args,code,fieldset)
143          | m(e1::es,rest,params,args,code,fieldset)=let          | m(e1::es,rest,params,args,code,fieldset)=let
# Line 305  Line 302 
302              (einapp,code,fieldset)              (einapp,code,fieldset)
303          end          end
304    
305    fun handlePowEmb(y,e1,sx1,n1,params,index,args,fieldset,flag)=let
306    val (e1',params',args',code,fieldset)=  rewriteOp("mag",e1,params,index,sx1,args,fieldset,flag)
307    val body= E.Sum(sx1,E.Prod[e1',e1'])
308    val einapp= rewriteOrig(y,body,params',index,sx1,args')
309    val _=print(String.concat["\nhandlePowEmb:",P.printbody(E.PowEmb(e1,sx1,n1)),"\n=>",
310    P.printbody(body)])
311    in
312    (einapp,code,fieldset)
313    end
314    
315    
316      (* split:var*ein_app-> (var*einap)*code      (* split:var*ein_app-> (var*einap)*code
317      * split ein expression into smaller pieces      * split ein expression into smaller pieces
318        note we leave summation around probe exp        note we leave summation around probe exp
# Line 350  Line 358 
358              | E.Sum(sx,E.Tensor _)    => default              | E.Sum(sx,E.Tensor _)    => default
359              | E.Sum(sx,_)             => err(" summation not distributed:"^str)              | E.Sum(sx,_)             => err(" summation not distributed:"^str)
360              | E.Add e1                => handleAdd(y,e1,params,index,args,fieldset,flag)              | E.Add e1                => handleAdd(y,e1,params,index,args,fieldset,flag)
361                | E.Prod[E.Tensor(id0,[]),E.Tensor(id1,[i]),E.Tensor(id2,[])]=>
362                        rewrite (E.Prod[E.Prod[E.Tensor(id0,[]),E.Tensor(id2,[])],E.Tensor(id1,[i])])
363              | E.Prod e1               => handleProd(y,e1,params,index,args,fieldset,flag)              | E.Prod e1               => handleProd(y,e1,params,index,args,fieldset,flag)
364              | E.Partial _             => err(" Partial used after normalize")              | E.Partial _             => err(" Partial used after normalize")
365              | E.Krn _                 => err("Krn used before expand")              | E.Krn _                 => err("Krn used before expand")
366              | E.Value _               => err("Value used before expand")              | E.Value _               => err("Value used before expand")
367              | E.Img _                 => err("Probe used before expand")              | E.Img _                 => err("Probe used before expand")
368    | Ein.PowEmb(e1,sx1,n1) =>handlePowEmb(y,e1,sx1,n1,params,index,args,fieldset,flag)
369    
370              (*end case *))              (*end case *))
371          val (einapp2,newbies,fieldset) =rewrite body          val (einapp2,newbies,fieldset) =rewrite body
372          in          in
# Line 363  Line 375 
375          |split((y,app),fieldset,_) =(((y,app),[]),fieldset)          |split((y,app),fieldset,_) =(((y,app),[]),fieldset)
376    
377    
378      fun iterMultiple(einapp2,newbies2,fieldset)=let  (*
379          fun itercode([],rest,code,_)=(rest,code)  B
380    NoISSUE (1,3,4)
381    Fail(2,5,6)
382    
383    *)
384    
385        fun iterAll2(einapp2,fields2)=let
386            val fieldset= einSet.EinSet.empty
387            val _ =print ("\nSPLit with limit"^(Int.toString(splitlimit)))
388            fun itercode([],rest,code,cnt)=(("\n Empty-SplitCount: "^Int.toString(cnt));(rest,code))
389            | itercode(e1::newbies,rest,code,cnt)=let            | itercode(e1::newbies,rest,code,cnt)=let
390                  val ((einapp3,code3),_) = split(e1,fieldset,numFlag)                  val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
391                      val (rest4,code4)=itercode(code3,[],[],cnt+1)                      val (rest4,code4)=itercode(code3,[],[],cnt+1)
392                val _ =testp [toStringBind(e1),"\n\t===>\n",toStringBind(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map toStringBind (code4@rest4)))]
393          in          in
394              itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)                  if (length(rest@newbies@code) > splitlimit) then let
395                            val _ =("\n SplitCount: "^Int.toString(cnt))
396                            val code5=code4@rest4@code
397                            val rest5=rest@[einapp3]
398                            in
399    (*
400                                (newbies,code5@rest5)(*tab1*)
401                                (newbies,rest5@code5)(*tab2*)
402                                (rest5,newbies@code5)(*tab3*)
403    *)
404                                (rest5,code5@newbies)(*tab4*)
405    (*
406                                (code5,rest5@newbies)(*tab5*)
407                                (code5,newbies@rest5)(*tab6*)
408    *)
409                            end
410                    else  itercode(newbies,rest@[einapp3],code4@rest4@code,cnt+2)
411          end          end
412              val(rest,code)= itercode(newbies2,[],[],1)          val(rest,code)= itercode([einapp2],[],[],0)
413          in          in
414              ((code)@rest@[einapp2])              (*fields2@rest@code (*A*)*)
415                  fields2@code@rest (*B*)
416          end          end
417    
418    
419    
420    
421      fun iterAll(einapp2,fieldset)=let      fun iterAll(einapp2,fieldset)=let
422            val _=print"\nSplit All"
423          fun itercode([],rest,code,_)=(rest,code)          fun itercode([],rest,code,_)=(rest,code)
424          | itercode(e1::newbies,rest,code,cnt)=let          | itercode(e1::newbies,rest,code,cnt)=let
425              val ((einapp3,code3),_) = split(e1,fieldset,numFlag)              val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
426              val (rest4,code4)=itercode(code3,[],[],cnt+1)              val (rest4,code4)=itercode(code3,[],[],cnt+1)
427                  val _ =testp [printEINAPP(e1),"\n\t===>\n",printEINAPP(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP (code4@rest4)))]                  val _ =testp [toStringBind(e1),"\n\t===>\n",toStringBind(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map toStringBind (code4@rest4)))]
428              in              in
429                  itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)                  itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)
430              end              end
# Line 391  Line 433 
433              (code@rest)              (code@rest)
434          end          end
435    
     fun splitEinApp einapp3= let  
         val fieldset= einSet.EinSet.empty  
   
         (* **** split in parts **** *)  
         (*  
         val ((einapp4,newbies4),fieldset)=split(einapp3,fieldset,0)  
         val _ =testp["\n\t===>\n",printEINAPP(einapp4),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP newbies4))]  
         val (newbies5)= iterMultiple(einapp4,newbies4,fieldset)  
         *)  
436    
         (* **** split all at once **** *)  
         val (newbies5)= iterAll([einapp3],fieldset)  
437    
438        fun splitEinApp (einapp3,splitflag)= let
439            val fieldset= einSet.EinSet.empty
440            val (newbies5)=(case splitflag
441                of 1 =>let
442                    (* **** split single **** *)
443                    val ((einapp4,newbies4),fieldset)=split(einapp3,fieldset,0)
444                    in newbies4@[einapp4] end
445                | _=>   (* **** split all at once **** *)
446                    iterAll([einapp3],fieldset)
447            (* end case *))
448          in          in
449              newbies5              newbies5
450          end          end

Legend:
Removed from v.3229  
changed lines
  Added in v.3378

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