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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/cl-target/cl-target.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/cl-target/cl-target.sml

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

revision 1429, Tue Jul 5 15:32:20 2011 UTC revision 1430, Tue Jul 5 16:02:02 2011 UTC
# Line 30  Line 30 
30    
31     (* translate TreeIL types to shadow types *)     (* translate TreeIL types to shadow types *)
32      fun convertToShadow (ty,name) = (case ty      fun convertToShadow (ty,name) = (case ty
33             of Ty.IVecTy 1 => CL.mkAssign(CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),             of Ty.IVecTy 1 => CL.mkAssign(
34                    CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
35                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
36              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n,[              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n,[
37                           CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                           CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
38                            CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)])                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)
39                    ])
40              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) =>  CL.mkCall(RN.shadowImageFunc dim, [              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) =>  CL.mkCall(RN.shadowImageFunc dim, [
41                           CL.mkVar "context",                           CL.mkVar "context",
42                           CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),                           CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),
# Line 42  Line 44 
44                           ])                           ])
45              | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n),[              | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n),[
46                           CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                           CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
47                            CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)])                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)
48              | _ => CL.mkAssign(CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                  ])
49                | _ => CL.mkAssign(
50                    CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
51                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
52             (*end case *))             (*end case *))
53    
   
   
54    (* helper functions for specifying parameters in various address spaces *)    (* helper functions for specifying parameters in various address spaces *)
55      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)
56      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)
# Line 100  Line 102 
102    
103    (* variable or field that is mirrored between host and GPU *)    (* variable or field that is mirrored between host and GPU *)
104      type mirror_var = {      type mirror_var = {
105    (* FIXME: perhaps it would be cleaner to just track the TreeIL type of the variable? *)
106              hostTy : CL.ty,             (* variable type on Host (i.e., C type) *)              hostTy : CL.ty,             (* variable type on Host (i.e., C type) *)
107              shadowTy : CL.ty,           (* host-side shadow type of GPU type *)              shadowTy : CL.ty,           (* host-side shadow type of GPU type *)
108              gpuTy : CL.ty,              (* variable's type on GPU (i.e., OpenCL type) *)              gpuTy : CL.ty,              (* variable's type on GPU (i.e., OpenCL type) *)
109              hToS: stm,                                  (*the statement that converts the variable to its shadow representation *)              hToS: stm,                  (* the statement that converts the variable to its *)
110                                            (* shadow representation *)
111              var : CL.var                (* variable name *)              var : CL.var                (* variable name *)
112            }            }
113    
# Line 335  Line 339 
339                              CL.E_Var "size"                              CL.E_Var "size"
340                            ]))))                            ]))))
341                      ]                      ]
             (* create the loop nest for the initially iterations  
               val indexVar = "ix"  
               val strandTy = CL.T_Ptr(CL.T_Named(N.strandTy name))  
               fun mkLoopNest [] = CL.mkBlock(createPrefix @ [  
                       CL.mkDecl(strandTy, "sp",  
                         SOME(CL.I_Exp(  
                           CL.E_Cast(strandTy,  
                           CL.E_Apply(N.inState, [CL.E_Var "wrld", CL.E_Var indexVar]))))),  
                       CL.mkCall(N.strandInit name,  
                         CL.E_Var RN.globalsVarName :: CL.E_Var "sp" :: args),  
                       CL.mkAssign(CL.E_Var indexVar, CL.mkBinOp(CL.E_Var indexVar, CL.#+, CL.E_Int(1, CL.uint32)))  
                     ])  
                 | mkLoopNest ((CL.V(ty, param), lo, hi)::iters) = let  
                     val body = mkLoopNest iters  
                     in  
                       CL.mkFor(  
                         [(ty, param, lo)],  
                         CL.mkBinOp(CL.E_Var param, CL.#<=, hi),  
                         [CL.mkPostOp(CL.E_Var param, CL.^++)],  
                         body)  
                     end  
               val iterCode = [  
                       CL.mkComment["initially"],  
                       CL.mkDecl(CL.uint32, indexVar, SOME(CL.I_Exp(CL.E_Int(0, CL.uint32)))),  
                       mkLoopNest iters  
                     ] *)  
342                val body = CL.mkBlock(                val body = CL.mkBlock(
343                      iterPrefix @                      iterPrefix @
344                      allocCode @                      allocCode @
# Line 372  Line 350 
350                end                end
351    
352        (***** OUTPUT *****)        (***** OUTPUT *****)
353    (* FIXME: I think that the iteration and test for stable strands can be moved into the runtime, which
354     * will make the print function compatible with the C target version.
355     *)
356          fun genStrandPrint (Strand{name, tyName, state, output, code,...}) = let          fun genStrandPrint (Strand{name, tyName, state, output, code,...}) = let
357              (* the print function *)              (* the print function *)
358                val prFnName = concat[name, "Print"]                val prFnName = concat[name, "Print"]
# Line 384  Line 365 
365                            ]                            ]
366                      val SOME(ty, x) = !output                      val SOME(ty, x) = !output
367                      val unshadowFields = (case ty                      val unshadowFields = (case ty
368                             of  Ty.IVecTy d =>  [CL.mkDecl(ToC.trType ty,x,NONE),                             of Ty.IVecTy d =>  [
369                                      CL.mkDecl(ToC.trType ty,x,NONE),
370                                                                  CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),                                                                  CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),
371                                                                  CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])]                                      CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])
372                              | Ty.TensorTy[d] => [CL.mkDecl(ToC.trType ty,x,NONE),                                  ]
373                                | Ty.TensorTy[d] => [
374                                      CL.mkDecl(ToC.trType ty,x,NONE),
375                                                                  CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),                                                                  CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),
376                                                                  CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])]                                      CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])
377                                    ]
378                              | _ => []                              | _ => []
379                            (* end case *))                            (* end case *))
   
380                      val outState =  (case ty                      val outState =  (case ty
381                             of Ty.IVecTy 1 =>CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)                             of Ty.IVecTy 1 =>CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)
382                              | Ty.TensorTy[] => CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)                              | Ty.TensorTy[] => CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)
# Line 400  Line 384 
384                              | Ty.TensorTy[d] =>CL.mkVar(x)                              | Ty.TensorTy[d] =>CL.mkVar(x)
385                              | _ => raise Fail("genStrand: unsupported output type " ^ Ty.toString ty)                              | _ => raise Fail("genStrand: unsupported output type " ^ Ty.toString ty)
386                            (* end case *))                            (* end case *))
   
387                      val prArgs = (case ty                      val prArgs = (case ty
388                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]
389                              | Ty.IVecTy d => let                              | Ty.IVecTy d => let
# Line 554  Line 537 
537                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),
538                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus")] @                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus")] @
539                        sizeParams @                        sizeParams @
540                       [ globalParam(globPtrTy, RN.globalsVarName)                        [globalParam(globPtrTy, RN.globalsVarName)] @
541                      ] @ genKeneralGlobalParams(!imgGlobals)                        genKeneralGlobalParams(!imgGlobals)
542                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
543                        then [                        then [
544                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "x",
# Line 568  Line 551 
551                            CL.mkDecl(CL.intTy, "y",                            CL.mkDecl(CL.intTy, "y",
552                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))
553                          ]                          ]
554                      else                        else [
                        [  
555                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "x",
556                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
557                            CL.mkDecl(CL.intTy, "y",                            CL.mkDecl(CL.intTy, "y",
# Line 577  Line 559 
559                            CL.mkDecl(CL.intTy, "z",                            CL.mkDecl(CL.intTy, "z",
560                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2]))))
561                         ]                         ]
   
   
562                val strandDecl = [                val strandDecl = [
563                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),
564                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), outState, NONE),                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), outState, NONE),
# Line 603  Line 583 
583                              CL.mkBinOp(CL.mkVar "z", CL.#*, CL.mkVar "width"),CL.#*, CL.mkVar "height"), CL.#+,                              CL.mkBinOp(CL.mkVar "z", CL.#*, CL.mkVar "width"),CL.#*, CL.mkVar "height"), CL.#+,
584                              CL.mkBinOp(CL.mkVar "y",CL.#*,CL.mkVar "height")),CL.#+,CL.mkVar "x")                              CL.mkBinOp(CL.mkVar "y",CL.#*,CL.mkVar "height")),CL.#+,CL.mkVar "x")
585    
586                val args = if nDims = 1 then                val args = (case nDims
587                          [CL.mkVar "x"]                       of 1 => [CL.mkVar "x"]
588                      else if nDims = 2 then                        | 2 => [CL.mkVar "x", CL.mkVar "y"]
589                          [CL.mkVar "x", CL.mkVar "y"]                        | 3 => [CL.mkVar "x", CL.mkVar "y", CL.mkVar "z"]
590                      else                      (* end case *))
591                          [CL.mkVar "x", CL.mkVar "y", CL.mkVar "z"]                val strandObjects = [
592                          CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),
   
               val strandObjects =  
                      [ CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),  
593                         CL.mkAssign(CL.mkVar outState, CL.mkBinOp(CL.mkVar "selfOut",CL.#+,index))                         CL.mkAssign(CL.mkVar outState, CL.mkBinOp(CL.mkVar "selfOut",CL.#+,index))
594                       ]                       ]
595                  val stabalizeStm = CL.mkAssign(
596                  val stabalizeStm = CL.mkAssign(CL.mkSubscript(CL.mkVar "strandStatus",index),                      CL.mkSubscript(CL.mkVar "strandStatus",index),
597                                                                          CL.E_Var "status")                                                                          CL.E_Var "status")
598                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkSubscript(CL.mkVar "strandStatus",index))))                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkSubscript(CL.mkVar "strandStatus",index))))
599                val strandInitStm = CL.mkCall(RN.strandInit name, [                val strandInitStm = CL.mkCall(RN.strandInit name,
600                        CL.mkVar RN.globalsVarName,                        CL.mkVar RN.globalsVarName :: CL.mkVar inState :: args)
                       CL.mkVar inState] @ args)  
601                val local_vars = thread_ids                val local_vars = thread_ids
602                      @ [imageDataDecl]                      @ [imageDataDecl]
603                      @ imageDataStms                      @ imageDataStms
# Line 781  Line 757 
757                  RunCC.link (basename, ldOpts)                  RunCC.link (basename, ldOpts)
758                end                end
759    
760        end        end (* Program *)
761    
762    (* strands *)    (* strands *)
763      structure Strand =      structure Strand =

Legend:
Removed from v.1429  
changed lines
  Added in v.1430

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