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 1443, Mon Jul 11 10:36:10 2011 UTC revision 1457, Fri Aug 5 07:23:07 2011 UTC
# Line 503  Line 503 
503                val inState = "strand_in"                val inState = "strand_in"
504                val outState = "strand_out"                val outState = "strand_out"
505                val tempVar = "tmp"                val tempVar = "tmp"
506                  val localPoolNextStrand = "localPoolNextStrand"
507                  val localPoolStrandCount = "localPoolStrandCount"
508                val sizeParams = if nDims = 1 then                val sizeParams = if nDims = 1 then
509                          []                          []
510                      else if nDims = 2 then                      else if nDims = 2 then
# Line 510  Line 512 
512                      else                      else
513                          [CL.PARAM([], CL.intTy, "width"),CL.PARAM([], CL.intTy, "height")]                          [CL.PARAM([], CL.intTy, "width"),CL.PARAM([], CL.intTy, "height")]
514                val params = [                val params = [
515                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "strands"),
516                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus"),
517                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus")] @                        globalParam(CL.T_Ptr(CL.intTy),RN.globalPoolName),
518                          clParam("",CL.intTy,"numStrands"),
519                          localParam(CL.T_Ptr(CL.T_Named RN.workerTy), "workers")] @
520                        sizeParams @                        sizeParams @
521                        [globalParam(globPtrTy, RN.globalsVarName)] @                        [globalParam(globPtrTy, RN.globalsVarName)] @
522                        genKeneralGlobalParams(!imgGlobals)                        genKeneralGlobalParams(!imgGlobals)
523    
524    
525                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
526                        then [                        then [
527                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "globalId_x",
528                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
529                              CL.mkDecl(CL.intTy, "localId_x",
530                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0])))),
531                              CL.mkDecl(CL.intTy, "local_size",
532                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalSize,[CL.mkInt 0])))),
533                              CL.mkDecl(CL.intTy, "index",
534                                SOME(CL.I_Exp(CL.mkVar "localId_x"))),
535                              CL.mkDecl(CL.intTy, "globalIndex",
536                                SOME(CL.I_Exp(CL.mkVar "globalId_x")))
537                          ]                          ]
538                      else if nDims = 2                      else if nDims = 2
539                        then [                        then [
540                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "globalId_x",
541                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
542                              CL.mkDecl(CL.intTy, "localId_x",
543                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0])))),
544                              CL.mkDecl(CL.intTy, "globalId_y",
545                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
546                            CL.mkDecl(CL.intTy, "y",                            CL.mkDecl(CL.intTy, "localId_y",
547                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1])))),
548                              CL.mkDecl(CL.intTy, "local_size",
549                                SOME(CL.I_Exp(CL.mkBinOp(CL.mkApply(RN.getLocalSize,[CL.mkInt 0]),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1]))))),
550                              CL.mkDecl(CL.intTy, "index",
551                                SOME(CL.I_Exp(CL.mkBinOp(CL.mkBinOp(CL.mkVar "localId_y",CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1])),CL.#+,CL.mkVar "localId_x")))),
552                              CL.mkDecl(CL.intTy, "globalIndex",
553                                SOME(CL.I_Exp(CL.mkBinOp(CL.mkBinOp(CL.mkVar "globalId_y",CL.#*, CL.mkVar "width"),CL.#+,CL.mkVar "globalId_x"))))
554                          ]                          ]
555                        else [                        else [
556                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "globalId_x",
                             SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),  
                           CL.mkDecl(CL.intTy, "y",  
557                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
558                            CL.mkDecl(CL.intTy, "z",                            CL.mkDecl(CL.intTy, "globalId_y",
559                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
560                              CL.mkDecl(CL.intTy, "globalId_z",
561                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2])))),
562                              CL.mkDecl(CL.intTy, "localId_x",
563                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0])))),
564                              CL.mkDecl(CL.intTy, "localId_y",
565                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1])))),
566                              CL.mkDecl(CL.intTy, "localId_z",
567                                SOME(CL.I_Exp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 2]))))
568                          ]                          ]
569    
570                val strandDecl = [                val strandDecl = [
571                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),                        CL.mkDecl(CL.T_Named tyName, "in", NONE),
572                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), outState, NONE),                        CL.mkDecl(CL.T_Named tyName, "out", NONE),
573                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), tempVar, NONE)                        CL.mkDecl(CL.T_Ptr(CL.T_Named tyName), inState, SOME(CL.I_Exp(CL.mkUnOp(CL.%&,CL.mkVar "in")))),
574                          CL.mkDecl(CL.T_Ptr(CL.T_Named tyName), outState, SOME(CL.I_Exp(CL.mkUnOp(CL.%&,CL.mkVar "out")))),
575                          CL.mkDecl(CL.T_Ptr(CL.T_Named tyName), tempVar, NONE)
576                      ]                      ]
577                val imageDataDecl = CL.mkDecl(CL.T_Named(RN.imageDataType),RN.globalImageDataName,NONE)                val imageDataDecl = CL.mkDecl(CL.T_Named(RN.imageDataType),RN.globalImageDataName,NONE)
578                val imageDataStms = List.map (fn (x,_) =>                val imageDataStms = List.map (fn (x,_) =>
579                    CL.mkAssign(CL.mkSelect(CL.mkVar(RN.globalImageDataName),RN.imageDataName x),                    CL.mkAssign(CL.mkSelect(CL.mkVar(RN.globalImageDataName),RN.imageDataName x),
580                                CL.mkVar(RN.addBufferSuffixData x))) (!imgGlobals)                                CL.mkVar(RN.addBufferSuffixData x))) (!imgGlobals)
581                val barrierCode = CL.mkIfThen(CL.mkBinOp(CL.E_Var "status",CL.#==,CL.E_Var "DIDEROT_ACTIVE"),  
582                                   CL.mkBlock ([CL.mkAssign(CL.E_Var tempVar, CL.E_Var inState),              val args = (case nDims
583                                   CL.mkAssign(CL.E_Var inState, CL.E_Var outState),                       of 1 => [CL.mkVar "globalId_x"]
584                                   CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))                        | 2 => [CL.mkVar "globalId_x", CL.mkVar "globalId_y"]
585                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])                        | 3 => [CL.mkVar "globalId_x", CL.mkVar "globalId_y", CL.mkVar "globalId_z"]
586                        (* end case *))
587    
588                val barrierCode = CL.mkIfThen(CL.mkBinOp(CL.mkVar "globalIndex" ,CL.#<=,CL.mkVar "numStrands"),
589                                     CL.mkBlock ([CL.mkCall (RN.strandInit name,
590                                                             CL.mkVar RN.globalsVarName :: CL.mkBinOp(CL.mkVar "strands", CL.#+, CL.mkVar "globalIndex") :: args)]))
591    
592               fun workerField (index,field) = CL.mkSelect(CL.mkSubscript(CL.mkVar "workers", CL.mkVar index),field)
593               fun barrierStm flags = CL.mkCall(RN.barrier,flags)
594    
595                  val barrierLocalStm = CL.mkCall(RN.barrier,[CL.E_Var "CLK_LOCAL_MEM_FENCE"])
596                  val barrierGlobalStm = CL.mkCall(RN.barrier,[CL.E_Var "CLK_GLOBAL_MEM_FENCE"])
597    
598                val index = if nDims = 1 then                val index = if nDims = 1 then
599                          CL.mkVar "x"                          CL.mkVar "x"
600                      else if nDims = 2 then                      else if nDims = 2 then
# Line 560  Line 605 
605                              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.#+,
606                              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")
607    
608                val args = (case nDims                val initCode = [
609                       of 1 => [CL.mkVar "x"]                        CL.mkAttrDecl(["__local", "volatile"], CL.intTy, "localPoolNextStrand", NONE),
610                        | 2 => [CL.mkVar "x", CL.mkVar "y"]                        CL.mkAttrDecl(["__local", "volatile"], CL.intTy, "localPoolStrandCount", NONE),
611                        | 3 => [CL.mkVar "x", CL.mkVar "y", CL.mkVar "z"]                        CL.mkAttrDecl(["__local", "volatile"], CL.intTy, "idle_workers", NONE),
612                      (* end case *))                        CL.mkAssign(workerField("index","status"),CL.mkVar "WORKER_IDLE"),
613                val strandObjects = [                        CL.mkAssign(CL.mkVar localPoolNextStrand , CL.mkInt 0),
614                        CL.mkAssign(CL.mkVar inState,  CL.mkBinOp(CL.mkVar "selfIn",CL.#+,index)),                        CL.mkAssign(CL.mkVar localPoolStrandCount , CL.mkInt 0),
615                        CL.mkAssign(CL.mkVar outState, CL.mkBinOp(CL.mkVar "selfOut",CL.#+,index))                        barrierStm([CL.mkVar "CLK_LOCAL_MEM_FENCE"])
616                      ]                      ]
617                val stabalizeStm = CL.mkAssign(  
618                      CL.mkSubscript(CL.mkVar "strandStatus",index),                val status = [CL.mkDecl(CL.intTy, "status", NONE), CL.mkDecl(CL.intTy, "numAvail", NONE)]
619                      CL.E_Var "status")  
620                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkSubscript(CL.mkVar "strandStatus",index))))  
621                val strandInitStm = CL.mkCall(RN.strandInit name,                (* NOTE ADD THIS LINE : localPoolStrandCount = (numAvail >= 0) ? B : abs(numAvail); *)
622                        CL.mkVar RN.globalsVarName :: CL.mkVar inState :: args)                val avaliableIf = CL.mkIfThenElse(CL.mkBinOp(CL.mkVar localPoolNextStrand, CL.#>, CL.mkVar "numStrands"),
623                                                    CL.mkBlock([CL.mkAssign(CL.mkVar localPoolStrandCount, CL.mkInt 0)]),
624                                                    CL.mkBlock([CL.mkAssign(CL.mkVar "numAvail", CL.mkBinOp(CL.mkVar "numStrands", CL.#-, CL.mkBinOp(CL.mkVar localPoolNextStrand, CL.#+, CL.mkVar "B")))]))
625    
626                  val poolCountIf = CL.mkIfThen(CL.mkBinOp(CL.mkBinOp(CL.mkVar localPoolStrandCount, CL.#==, CL.mkInt 0), CL.#&&,CL.mkBinOp(CL.mkVar localPoolNextStrand, CL.#<, CL.mkVar "numStrands")),
627                                        CL.mkBlock([CL.mkAssign(CL.mkVar localPoolNextStrand, CL.mkApply(RN.cl_atom_add,[CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "globalPoolNextStrand",CL.mkInt 0)),
628                                                                                                                         CL.mkVar "B"])), avaliableIf]))
629    
630    
631                 (* Refacotring from my previous work because what I originially had isn't correct. I tried it with my experiment test case with a bigger NDRange and it failed. Now I'm rethinking my
632                    approach
633    
634                  val forStablize = CL.mkFor([(CL.intTy,"idx",CL.mkInt 0)], CL.mkBinOp(CL.mkVar "idx", CL.#<, CL.mkVar "local_size"), [CL.mkPostOp(CL.mkVar "idx", CL.^++)],  *)
635    
636    
637                  val threadZeroBlock = CL.mkIfThen(CL.mkBinOp(CL.mkBinOp(CL.mkVar "localId_x", CL.#==, CL.mkInt 0), CL.#&&, CL.mkBinOp(CL.mkVar "localId_y", CL.#==, CL.mkInt 0)),
638                                        CL.mkBlock([poolCountIf]))
639    
640    
641    
642    
643    
644                val local_vars = thread_ids                val local_vars = thread_ids
645                      @ [imageDataDecl]                      @ [imageDataDecl]
646                      @ imageDataStms                      @ imageDataStms
647                      @ strandDecl                      @ strandDecl
648                      @ strandObjects                      @ status
649                      @ [strandInitStm,status]                val while_exp = CL.mkBinOp(CL.mkVar "idle_workers",CL.#!=, CL.mkVar "local_size")
               val while_exp = CL.mkBinOp(CL.mkVar "status",CL.#==, CL.mkVar RN.kActive)  
650                val whileBody = CL.mkBlock ([                val whileBody = CL.mkBlock ([
651                        CL.mkAssign(CL.mkVar "status",                        CL.mkAssign(CL.mkVar "status",
652                          CL.mkApply(RN.strandUpdate name,                          CL.mkApply(RN.strandUpdate name,
653                            [CL.mkVar inState,                            [CL.mkVar inState,
654                             CL.mkVar outState,                             CL.mkVar outState,
655                             CL.mkVar RN.globalsVarName,                             CL.mkVar RN.globalsVarName,
656                             CL.mkVar RN.globalImageDataName]))] @ [barrierCode,barrierStm] )                             CL.mkVar RN.globalImageDataName]))])
657                val whileBlock = [CL.mkWhile(while_exp, whileBody)]                val whileBlock = [CL.mkWhile(while_exp, whileBody)]
658                val body = CL.mkBlock(local_vars @ whileBlock @ [stabalizeStm])                val body = CL.mkBlock(local_vars @ whileBlock)
659                in                in
660                  CL.D_Func(["__kernel"], CL.voidTy, fName, params, body)                  CL.D_Func(["__kernel"], CL.voidTy, fName, params, body)
661                end                end

Legend:
Removed from v.1443  
changed lines
  Added in v.1457

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