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 1407, Wed Jun 29 19:01:11 2011 UTC revision 1425, Fri Jul 1 18:05:07 2011 UTC
# Line 28  Line 28 
28              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])
29            (* end case *))            (* end case *))
30    
31       (* translate TreeIL types to shadow types *)
32        fun convertToShadow (ty,name) = (case ty
33               of Ty.IVecTy 1 => CL.mkAssign(CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
34                                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
35                | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n,[
36                             CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
37                              CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)])
38                | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) =>  CL.mkCall(RN.shadowImageFunc dim, [
39                             CL.mkVar "context",
40                             CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),
41                             CL.mkIndirect(CL.mkVar(RN.globalsVarName),name)
42                             ])
43                | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n),[
44                             CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
45                              CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)])
46                | _ => CL.mkAssign(CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
47                                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
48               (*end case *))
49    
50    (* helper functions for specifying parameters in various address spaces *)    (* helper functions for specifying parameters in various address spaces *)
51      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)
52      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)
# Line 35  Line 54 
54      fun localParam (ty, x) = CL.PARAM(["__local"], ty, x)      fun localParam (ty, x) = CL.PARAM(["__local"], ty, x)
55      fun privateParam (ty, x) = CL.PARAM(["__private"], ty, x)      fun privateParam (ty, x) = CL.PARAM(["__private"], ty, x)
56    
57      (* OpenCL global pointer type *)
58        fun globalPtr ty = CL.T_Qual("__global", CL.T_Ptr ty)
59    
60    (* C variable translation *)    (* C variable translation *)
61      structure TrCVar =      structure TrCVar =
62        struct        struct
# Line 79  Line 101 
101              hostTy : CL.ty,             (* variable type on Host (i.e., C type) *)              hostTy : CL.ty,             (* variable type on Host (i.e., C type) *)
102              shadowTy : CL.ty,           (* host-side shadow type of GPU type *)              shadowTy : CL.ty,           (* host-side shadow type of GPU type *)
103              gpuTy : CL.ty,              (* variable's type on GPU (i.e., OpenCL type) *)              gpuTy : CL.ty,              (* variable's type on GPU (i.e., OpenCL type) *)
104                hToS: stm,                                  (*the statement that converts the variable to its shadow representation *)
105              var : CL.var                (* variable name *)              var : CL.var                (* variable name *)
106            }            }
107    
# Line 173  Line 196 
196                  hostTy = ToC.trType ty,                  hostTy = ToC.trType ty,
197                  shadowTy = shadowTy ty,                  shadowTy = shadowTy ty,
198                  gpuTy = ToCL.trType ty,                  gpuTy = ToCL.trType ty,
199                    hToS = convertToShadow(ty,name),
200                  var = name                  var = name
201                }                }
202          fun name (ToCL.V(_, name)) = name          fun name (ToCL.V(_, name)) = name
# Line 408  Line 432 
432                      CL.mkCall("exit",[CL.mkInt 1])]))                      CL.mkCall("exit",[CL.mkInt 1])]))
433                val shadowTypeDecl =                val shadowTypeDecl =
434                      CL.mkDecl(CL.T_Named(RN.shadowGlobalsTy), RN.shadowGlaobalsName, NONE)                      CL.mkDecl(CL.T_Named(RN.shadowGlobalsTy), RN.shadowGlaobalsName, NONE)
435                val globalImagesToShadowStms = List.map (fn (var,nDims) =>                val globalToShadowStms = List.map (fn (x:mirror_var) => #hToS x ) globals
                     CL.mkCall((RN.shadowImageFunc nDims), [  
                          CL.mkVar contextVar,  
                          CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),var)),  
 (* FIXME: for vectors and matrices, we need to invoke the appropriate shadow function from shadow-types.h *)  
                          CL.mkIndirect(CL.mkVar(RN.globalsVarName),var)  
                          ])) imgGlobals  
             (* Converts only the non-image-field types into their corresponding global shadow types *)  
               fun convertToShadow ((global:mirror_var)::rest,(imgGlobal,nDim)::restImages) =  
 (* FIXME: for vectors and matrices, we need to invoke the appropriate shadow function from shadow-types.h.  
  * also, we should be able to combine this case and the following one to reduce redundancy.  
  *)  
                     if (#var global) = imgGlobal  
                       then convertToShadow(rest,restImages)  
                       else CL.mkAssign(CL.mkSelect(CL.mkVar RN.shadowGlaobalsName, #var global),  
                           CL.mkIndirect(CL.mkVar(RN.globalsVarName), #var global)) ::  
                         convertToShadow(rest,(imgGlobal,nDim)::restImages)  
                 | convertToShadow ((global:mirror_var)::rest, []) =  
                     CL.mkAssign(CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),#var global),  
                         CL.mkIndirect(CL.mkVar(RN.globalsVarName), #var global)) ::  
                     convertToShadow(rest,[])  
 (* FIXME: what if the second argument is non-nil? *)  
                 | convertToShadow ([], _) = []  
               val globalToShadowStms = convertToShadow(globals,imgGlobals)  
436                val globalBufferDecl = CL.mkDecl(clMemoryTy,concat[RN.globalsVarName,"_cl"],NONE)                val globalBufferDecl = CL.mkDecl(clMemoryTy,concat[RN.globalsVarName,"_cl"],NONE)
437                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),
438                      CL.mkApply("clCreateBuffer", [                      CL.mkApply("clCreateBuffer", [
# Line 459  Line 460 
460                          genDataBuffers(globals,contextVar,errVar,errFn)                          genDataBuffers(globals,contextVar,errVar,errFn)
461                      end                      end
462                in                in
463                  [shadowTypeDecl] @ globalImagesToShadowStms @ globalToShadowStms                  [shadowTypeDecl] @ globalToShadowStms
464                  @ [globalBufferDecl, globalBuffer,errorFn(globalBuffErr)]                  @ [globalBufferDecl, globalBuffer,errorFn(globalBuffErr)]
465                  @ genDataBuffers(imgGlobals,contextVar,errVar,errorFn)                  @ genDataBuffers(imgGlobals,contextVar,errVar,errorFn)
466                end                end
# Line 523  Line 524 
524                val inState = "strand_in"                val inState = "strand_in"
525                val outState = "strand_out"                val outState = "strand_out"
526                val tempVar = "tmp"                val tempVar = "tmp"
527                  val sizeParams = if nDims = 1 then
528                            []
529                        else if nDims = 2 then
530                            [CL.PARAM([], CL.intTy, "width")]
531                        else
532                            [CL.PARAM([], CL.intTy, "width"),CL.PARAM([], CL.intTy, "height")]
533                val params = [                val params = [
534                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfIn"),
535                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),
536                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus"),                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus")] @
537                        CL.PARAM(["__global"], CL.intTy, "width"),                        sizeParams @
538                        CL.PARAM(["__global"], globPtrTy, RN.globalsVarName)                       [ globalParam(globPtrTy, RN.globalsVarName)
539                      ] @ genKeneralGlobalParams(!imgGlobals)                      ] @ genKeneralGlobalParams(!imgGlobals)
540                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
541                        then [                        then [
# Line 538  Line 545 
545                      else if nDims = 2                      else if nDims = 2
546                        then [                        then [
547                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "x",
548                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
549                            CL.mkDecl(CL.intTy, "y",                            CL.mkDecl(CL.intTy, "y",
550                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))
551                          ]                          ]
552                      else raise Fail "nDims > 2"                      else
553                           [
554                              CL.mkDecl(CL.intTy, "x",
555                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
556                              CL.mkDecl(CL.intTy, "y",
557                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
558                              CL.mkDecl(CL.intTy, "z",
559                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2]))))
560                           ]
561    
562    
563                val strandDecl = [                val strandDecl = [
564                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), inState, NONE),                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),
565                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), outState, NONE),                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), outState, NONE),
566                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), tempVar, NONE)                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), tempVar, NONE)
567                      ]                      ]
568                val imageDataDecl = CL.mkDecl(CL.T_Named(RN.imageDataType),RN.globalImageDataName,NONE)                val imageDataDecl = CL.mkDecl(CL.T_Named(RN.imageDataType),RN.globalImageDataName,NONE)
569                val imageDataStms = List.map (fn (x,_) =>                val imageDataStms = List.map (fn (x,_) =>
# Line 558  Line 575 
575                                   CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))                                   CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))
576                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])
577                val index = if nDims = 1 then                val index = if nDims = 1 then
578                          CL.mkStr "x"                          CL.mkVar "x"
579                      else                      else if nDims = 2 then
580                          CL.mkBinOp(                          CL.mkBinOp(
581                              CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")                              CL.mkBinOp(CL.mkVar "y", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "x")
582                        else
583                           CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(
584                                CL.mkBinOp(CL.mkVar "z", CL.#*, CL.mkVar "width"),CL.#*, CL.mkVar "height"), CL.#+,
585                                CL.mkBinOp(CL.mkVar "y",CL.#*,CL.mkVar "height")),CL.#+,CL.mkVar "x")
586    
587                  val args = if nDims = 1 then
588                            [CL.mkVar "x"]
589                        else if nDims = 2 then
590                            [CL.mkVar "x", CL.mkVar "y"]
591                        else
592                            [CL.mkVar "x", CL.mkVar "y", CL.mkVar "z"]
593    
594    
595                val strandObjects =                val strandObjects =
596                       [ CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),                       [ CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),
# Line 573  Line 602 
602                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))))
603                val strandInitStm = CL.mkCall(RN.strandInit name, [                val strandInitStm = CL.mkCall(RN.strandInit name, [
604                        CL.mkVar RN.globalsVarName,                        CL.mkVar RN.globalsVarName,
605                        CL.mkVar inState,                        CL.mkVar inState] @ args)
                       CL.mkVar "x",  
 (* FIXME: if nDims = 1, then "y" is not defined! the arguments to this call should really come from  
  * the initially code!  
  *)  
                       CL.mkVar "y"])  
606                val local_vars = thread_ids                val local_vars = thread_ids
607                      @ [imageDataDecl]                      @ [imageDataDecl]
608                      @ imageDataStms                      @ imageDataStms
# Line 608  Line 632 
632    
633        (* generate a global structure type definition from the image data of the image globals *)        (* generate a global structure type definition from the image data of the image globals *)
634          fun genImageDataStruct (imgGlobals, tyName) = let          fun genImageDataStruct (imgGlobals, tyName) = let
635                val globs = List.map (fn (x,_) => (CL.T_Ptr(CL.imageDataTy "__global"),(RN.imageDataName x))) imgGlobals                val globs = List.map
636                        (fn (x, _) => (globalPtr CL.voidTy, RN.imageDataName x))
637                          imgGlobals
638                in                in
639                  CL.D_StructDef(globs, tyName)                  CL.D_StructDef(globs, tyName)
640                end                end

Legend:
Removed from v.1407  
changed lines
  Added in v.1425

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