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 1321, Sun Jun 12 14:50:26 2011 UTC revision 1333, Mon Jun 13 01:33:25 2011 UTC
# Line 79  Line 79 
79          topDecls : CL.decl list ref,          topDecls : CL.decl list ref,
80          strands : strand AtomTable.hash_table,          strands : strand AtomTable.hash_table,
81          initially :  CL.decl ref,          initially :  CL.decl ref,
82          numDims: int ref,          numDims: int ref,               (* number of dimensions in initially iteration *)
83          imgGlobals: (string * int) list ref,          imgGlobals: (string * int) list ref,
84          prFn: CL.decl ref          prFn: CL.decl ref
85        }        }
# Line 135  Line 135 
135                  case scope                  case scope
136  (* NOTE: if we move strand initialization to the GPU, then we'll have to change the following code! *)  (* NOTE: if we move strand initialization to the GPU, then we'll have to change the following code! *)
137                   of StrandScope stateVars =>                   of StrandScope stateVars =>
138                        ToC.trBlock (vMap, saveState "StrandScope" stateVars ToC.trAssign, blk)                        ToCL.trBlock (vMap, saveState "StrandScope" stateVars ToC.trAssign, blk)
139                    | MethodScope stateVars =>                    | MethodScope stateVars =>
140                        ToCL.trBlock (vMap, saveState "MethodScope" stateVars ToCL.trAssign, blk)                        ToCL.trBlock (vMap, saveState "MethodScope" stateVars ToCL.trAssign, blk)
141                    | InitiallyScope => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)                    | InitiallyScope => ToCL.trBlock (vMap, fn (_, _, stm) => [stm], blk)
142                    | _ => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)                    | _ => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)
143                  (* end case *)                  (* end case *)
144                end                end
# Line 205  Line 205 
205                    topDecls = ref [],                    topDecls = ref [],
206                    strands = AtomTable.mkTable (16, Fail "strand table"),                    strands = AtomTable.mkTable (16, Fail "strand table"),
207                    initially = ref(CL.D_Comment["missing initially"]),                    initially = ref(CL.D_Comment["missing initially"]),
208                    numDims = ref(0),                    numDims = ref 0,
209                    imgGlobals = ref[],                    imgGlobals = ref[],
210                    prFn = ref(CL.D_Comment(["No Print Function"]))                    prFn = ref(CL.D_Comment(["No Print Function"]))
211                  })                  })
# Line 235  Line 235 
235          fun init (Prog{topDecls, ...}, init) = let          fun init (Prog{topDecls, ...}, init) = let
236                                    val globalsDecl = CL.mkAssign(CL.E_Var RN.globalsVarName,                                    val globalsDecl = CL.mkAssign(CL.E_Var RN.globalsVarName,
237                      CL.mkApply("malloc", [CL.mkApply("sizeof",[CL.mkVar RN.globalsTy])]))                      CL.mkApply("malloc", [CL.mkApply("sizeof",[CL.mkVar RN.globalsTy])]))
   
238                val initGlobalsCall = CL.mkCall(RN.initGlobalsHelper,[])                val initGlobalsCall = CL.mkCall(RN.initGlobalsHelper,[])
   
239                                          val initFn = CL.D_Func(                                          val initFn = CL.D_Func(
240                      [], CL.voidTy, RN.initGlobals, [],                      [], CL.voidTy, RN.initGlobals, [],
241                      CL.mkBlock([globalsDecl,initGlobalsCall]))                      CL.mkBlock([globalsDecl,initGlobalsCall]))
# Line 253  Line 251 
251                end                end
252           (* create and register the initially function for a program *)           (* create and register the initially function for a program *)
253          fun initially {          fun initially {
254                prog = Prog{name=progName, strands, initially, ...},                prog = Prog{name=progName, strands, initially, numDims, ...},
255                isArray : bool,                isArray : bool,
256                iterPrefix : stm list,                iterPrefix : stm list,
257                iters : (var * exp * exp) list,                iters : (var * exp * exp) list,
# Line 323  Line 321 
321                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])
322                val initFn = CL.D_Func([], worldTy, N.initially, [], body)                val initFn = CL.D_Func([], worldTy, N.initially, [], body)
323                in                in
324                    numDims := nDims;
325                  initially := initFn                  initially := initFn
326                end                end
327    
# Line 380  Line 379 
379                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),
380                      CL.mkApply("clCreateBuffer", [                      CL.mkApply("clCreateBuffer", [
381                          CL.mkVar contextVar,                          CL.mkVar contextVar,
382                          CL.mkVar "CL_MEM_COPY_HOST_PTR",                          CL.mkVar "CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR",
383                          CL.mkApply("sizeof",[CL.mkVar RN.globalsTy]),                          CL.mkApply("sizeof",[CL.mkVar RN.globalsTy]),
384                          CL.mkVar RN.globalsVarName,                          CL.mkVar RN.globalsVarName,
385                          CL.mkUnOp(CL.%&,CL.mkVar errVar)                          CL.mkUnOp(CL.%&,CL.mkVar errVar)
# Line 469  Line 468 
468    
469        (* generate the data and global parameters *)        (* generate the data and global parameters *)
470          fun genKeneralGlobalParams ((name,tyname)::rest) =          fun genKeneralGlobalParams ((name,tyname)::rest) =
               CL.PARAM([], CL.T_Ptr(CL.T_Named RN.globalsTy), concat[RN.globalsVarName]) ::  
471                CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.imageTy tyname)),RN.addBufferSuffix name) ::                CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.imageTy tyname)),RN.addBufferSuffix name) ::
472                CL.PARAM([], CL.T_Ptr(CL.voidTy),RN.addBufferSuffixData name) ::                CL.PARAM([], CL.T_Ptr(CL.voidTy),RN.addBufferSuffixData name) ::
473                genKeneralGlobalParams rest                genKeneralGlobalParams rest
# Line 492  Line 490 
490                val params = [                val params = [
491                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
492                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
493                        CL.PARAM(["__global"], CL.intTy, "width")                        CL.PARAM(["__global"], CL.intTy, "width"),
494                          CL.PARAM([], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName)
495                      ] @ genKeneralGlobalParams(!imgGlobals)                      ] @ genKeneralGlobalParams(!imgGlobals)
496                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
497                      then [                      then [
498                          CL.mkDecl(CL.intTy, "x", SOME(CL.I_Exp(CL.mkInt 0))),                            CL.mkDecl(CL.intTy, "x",
499                          CL.mkAssign(CL.mkVar "x",CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))
500                        ]                        ]
501                      else [                      else if nDims = 2
502                          CL.mkDecl(CL.intTy, "x", SOME(CL.I_Exp(CL.mkInt 0))),                        then [
503                          CL.mkDecl(CL.intTy, "y", SOME(CL.I_Exp(CL.mkInt 0))),                            CL.mkDecl(CL.intTy, "x",
504                          CL.mkAssign(CL.mkVar "x",  CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
505                          CL.mkAssign(CL.mkVar "y",CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1]))                            CL.mkDecl(CL.intTy, "y",
506                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1]))))
507                        ]                        ]
508                        else raise Fail "nDims > 2"
509                val strandDecl = [                val strandDecl = [
510                      CL.mkDecl(CL.T_Named tyName, inState, NONE),                      CL.mkDecl(CL.T_Named tyName, inState, NONE),
511                      CL.mkDecl(CL.T_Named tyName, outState,NONE)]                        CL.mkDecl(CL.T_Named tyName, outState, NONE)
512                        ]
513                val strandObjects = if nDims = 1                val strandObjects = if nDims = 1
514                      then [                      then [
515                          CL.mkAssign( CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn", CL.mkStr "x")),                          CL.mkAssign( CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn", CL.mkStr "x")),
516                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut", CL.mkStr "x"))                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut", CL.mkStr "x"))
517                        ]                        ]
518                      else let                      else let
519                        val index = CL.mkBinOp(CL.mkBinOp(CL.mkVar "x",CL.#*,CL.mkVar "width"),CL.#+,CL.mkVar "y")                        val index = CL.mkBinOp(
520                                CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")
521                        in [                        in [
522                          CL.mkAssign(CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn",index)),                          CL.mkAssign(CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn",index)),
523                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut",index))                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut",index))
524                        ] end                        ] end
525                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkInt 0)))                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkInt 0)))
526                val strand_Init_Stm = CL.mkCall(RN.strandInit name, [CL.E_Var RN.globalsVarName,CL.mkUnOp(CL.%&,CL.E_Var inState), CL.E_Var "x", CL.E_Var "y"])                val strandInitStm = CL.mkCall(RN.strandInit name, [
527                val local_vars = thread_ids @ initGlobalImages(!imgGlobals)  @ strandDecl @ strandObjects @ [strand_Init_Stm,status]                        CL.E_Var RN.globalsVarName,
528                          CL.mkUnOp(CL.%&, CL.E_Var inState),
529                          CL.E_Var "x",
530    (* FIXME: if nDims = 1, then "y" is not defined! the arguments to this call should really come from
531     * the initially code!
532     *)
533                          CL.E_Var "y"])
534                  val local_vars = thread_ids
535                        @ initGlobalImages(!imgGlobals)
536                        @ strandDecl
537                        @ strandObjects
538                        @ [strandInitStm,status]
539                                    val while_exp = CL.mkBinOp(                                    val while_exp = CL.mkBinOp(
540                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),
541                      CL.#||,                      CL.#||,
542                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))
543                val whileBody = CL.mkBlock [                val whileBody = CL.mkBlock [
544    (* FIXME: need a barrier synchronization at beginning of loop *)
545                        CL.mkAssign(CL.mkVar "status",                        CL.mkAssign(CL.mkVar "status",
546                          CL.mkApply(RN.strandUpdate name,                          CL.mkApply(RN.strandUpdate name,
547                            [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])),                            [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])),
548    (* FIXME: why is there a call to stabilize here? *)
549                        CL.mkCall(RN.strandStabilize name,                        CL.mkCall(RN.strandStabilize name,
550                          [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])                          [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])
551                      ]                      ]

Legend:
Removed from v.1321  
changed lines
  Added in v.1333

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