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 1345, Tue Jun 14 16:19:21 2011 UTC revision 1346, Wed Jun 15 06:43:14 2011 UTC
# Line 290  Line 290 
290                          SOME(CL.I_Exp(CL.E_Apply(RN.allocInitially, [                          SOME(CL.I_Exp(CL.E_Apply(RN.allocInitially, [
291                              CL.mkVar "ProgramName",                              CL.mkVar "ProgramName",
292                              CL.mkUnOp(CL.%&, CL.E_Var(N.strandDesc name)),                              CL.mkUnOp(CL.%&, CL.E_Var(N.strandDesc name)),
                             CL.mkApply("sizeof",[CL.E_Var (N.strandTy name)]),  
293                              CL.E_Bool isArray,                              CL.E_Bool isArray,
294                              CL.E_Int(IntInf.fromInt nDims, CL.int32),                              CL.E_Int(IntInf.fromInt nDims, CL.int32),
295                              CL.E_Var "base",                              CL.E_Var "base",
# Line 340  Line 339 
339                val prFn = let                val prFn = let
340                      val params = [                      val params = [
341                              CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),                              CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),
342                                CL.PARAM([], CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)),"status"),
343                                CL.PARAM([], CL.intTy,"numStrands"),
344                              CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "self")                              CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "self")
345                            ]                            ]
346                      val SOME(ty, x) = !output                      val SOME(ty, x) = !output
347                      val outState = CL.mkIndirect(CL.mkVar "self", x)                      val outState = CL.mkSelect(CL.mkSubscript(CL.mkVar "self",CL.E_Var "i"), x)
348                      val prArgs = (case ty                      val prArgs = (case ty
349                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]
350                              | Ty.IVecTy d => let                              | Ty.IVecTy d => let
# Line 365  Line 366 
366                                  end                                  end
367                              | _ => raise Fail("genStrand: unsupported output type " ^ Ty.toString ty)                              | _ => raise Fail("genStrand: unsupported output type " ^ Ty.toString ty)
368                            (* end case *))                            (* end case *))
369                        val forBody = CL.mkIfThen(CL.mkBinOp(CL.mkSubscript(CL.E_Var "status",CL.E_Var "i"), CL.#==, CL.E_Var "DIDEROT_STABILIZE"),
370                                                  CL.mkBlock([CL.mkCall("fprintf", CL.mkVar "outS" :: prArgs)]))
371                        val body =  CL.mkFor(
372                            [(CL.intTy, "i", CL.mkInt 0)],
373                            CL.mkBinOp(CL.E_Var "i", CL.#<=, CL.E_Var "numStrands"),
374                            [CL.mkPostOp(CL.E_Var "i", CL.^++)],
375                            forBody)
376                      in                      in
377                        CL.D_Func(["static"], CL.voidTy, prFnName, params,                        CL.D_Func(["static"], CL.voidTy, prFnName, params,
378                          CL.mkCall("fprintf", CL.mkVar "outS" :: prArgs))                          body)
379                      end                      end
380                in                in
381                  prFn                  prFn
# Line 514  Line 522 
522                val outState = "strand_out"                val outState = "strand_out"
523                val tempVar = "tmp"                val tempVar = "tmp"
524                val params = [                val params = [
525                        globalParam (CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
526                        globalParam (CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
527                        globalParam (CL.intTy, "width"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus"),
528                        globalParam (CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName)                        CL.PARAM(["__global"], CL.intTy, "width"),
529                          CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName)
530                      ] @ genKeneralGlobalParams(!imgGlobals)                      ] @ genKeneralGlobalParams(!imgGlobals)
531                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
532                        then [                        then [
# Line 537  Line 546 
546                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), outState, NONE),                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), outState, NONE),
547                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), tempVar, NONE)                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), tempVar, NONE)
548                      ]                      ]
549                val swapStms = [                val barrierCode = CL.mkIfThen(CL.mkBinOp(CL.E_Var "status",CL.#==,CL.E_Var "DIDEROT_ACTIVE"),
550                        CL.mkAssign(CL.E_Var tempVar, CL.E_Var inState),                                                  CL.mkBlock ([CL.mkAssign(CL.E_Var tempVar, CL.E_Var inState),
551                        CL.mkAssign(CL.E_Var inState, CL.E_Var outState),                        CL.mkAssign(CL.E_Var inState, CL.E_Var outState),
552                        CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)                                                               CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))
553                      ]                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])
554                val strandObjects = if nDims = 1                val index = if nDims = 1 then
555                      then [                          CL.mkStr "x"
556                          CL.mkAssign( CL.mkVar inState,  CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfIn", CL.mkStr "x"))),                      else
557                          CL.mkAssign(CL.mkVar outState, CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfOut", CL.mkStr "x")))                          CL.mkBinOp(
                       ]  
                     else let  
                       val index = CL.mkBinOp(  
558                              CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")                              CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")
559                        in [  
560                          CL.mkAssign(CL.mkVar inState,  CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfIn",index))),                val strandObjects =
561                          CL.mkAssign(CL.mkVar outState, CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfOut",index)))                       [ CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),
562                        ] end                         CL.mkAssign(CL.mkVar outState, CL.mkBinOp(CL.mkVar "selfOut",CL.#+,index))
563                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkInt 0)))                       ]
564    
565                    val stabalizeStm = CL.mkAssign(CL.mkSubscript(CL.mkVar "strandStatus",index),
566                                                                            CL.E_Var "status")
567                  val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkSubscript(CL.mkVar "strandStatus",index))))
568                val strandInitStm = CL.mkCall(RN.strandInit name, [                val strandInitStm = CL.mkCall(RN.strandInit name, [
569                        CL.E_Var RN.globalsVarName,                        CL.E_Var RN.globalsVarName,
570                        CL.E_Var inState,                        CL.E_Var inState,
# Line 572  Line 582 
582                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),
583                      CL.#&&,                      CL.#&&,
584                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))
585                val whileBody = CL.mkBlock (swapStms @ [                val whileBody = CL.mkBlock ([barrierCode,barrierStm] @ [
 (* FIXME: need a barrier synchronization at beginning of loop *)  
586                        CL.mkAssign(CL.mkVar "status",                        CL.mkAssign(CL.mkVar "status",
587                          CL.mkApply(RN.strandUpdate name,                          CL.mkApply(RN.strandUpdate name,
588                            [CL.mkVar inState, CL.mkVar outState,CL.E_Var RN.globalsVarName]))] )                            [CL.mkVar inState, CL.mkVar outState,CL.E_Var RN.globalsVarName]))] )
589                val whileBlock = [CL.mkWhile(while_exp, whileBody)]                val whileBlock = [CL.mkWhile(while_exp, whileBody)]
590                val body = CL.mkBlock(local_vars @ whileBlock)                val body = CL.mkBlock(local_vars @ whileBlock @ [stabalizeStm])
591                in                in
592                  CL.D_Func(["__kernel"], CL.voidTy, fName, params, body)                  CL.D_Func(["__kernel"], CL.voidTy, fName, params, body)
593                end                end
# Line 608  Line 617 
617                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),
618  *)  *)
619                            ("update", fnPtr("update_method_t", "0")),                            ("update", fnPtr("update_method_t", "0")),
620                            ("print", fnPtr("print_method_t", name ^ "_print"))                            ("print", fnPtr("print_method_cl_t", name ^ "_print"))
621                          ]                          ]
622                      end                      end
623                val desc = CL.D_Var([], CL.T_Named N.strandDescTy, N.strandDesc name, SOME descI)                val desc = CL.D_Var([], CL.T_Named N.strandDescTy, N.strandDesc name, SOME descI)

Legend:
Removed from v.1345  
changed lines
  Added in v.1346

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