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 1421, Thu Jun 30 21:22:28 2011 UTC revision 1429, Tue Jul 5 15:32:20 2011 UTC
# Line 47  Line 47 
47                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
48             (*end case *))             (*end case *))
49    
50    
51    
52    (* helper functions for specifying parameters in various address spaces *)    (* helper functions for specifying parameters in various address spaces *)
53      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)
54      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)
# Line 378  Line 380 
380                              CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),                              CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),
381                              CL.PARAM([], CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)),"status"),                              CL.PARAM([], CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)),"status"),
382                              CL.PARAM([], CL.intTy,"numStrands"),                              CL.PARAM([], CL.intTy,"numStrands"),
383                              CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "self")                              CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.strandShadowTy name)), "self")
384                            ]                            ]
385                      val SOME(ty, x) = !output                      val SOME(ty, x) = !output
386                      val outState = CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)                      val unshadowFields = (case ty
387                               of  Ty.IVecTy d =>  [CL.mkDecl(ToC.trType ty,x,NONE),
388                                                                    CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),
389                                                                    CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])]
390                                | Ty.TensorTy[d] => [CL.mkDecl(ToC.trType ty,x,NONE),
391                                                                    CL.mkCall(RN.unshadowVec d,[CL.mkVar(x),
392                                                                    CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)])]
393                                | _ => []
394                              (* end case *))
395    
396                        val outState =  (case ty
397                               of Ty.IVecTy 1 =>CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)
398                                | Ty.TensorTy[] => CL.mkSelect(CL.mkSubscript(CL.mkVar "self", CL.E_Var "i"), x)
399                                | Ty.IVecTy d =>CL.mkVar(x)
400                                | Ty.TensorTy[d] =>CL.mkVar(x)
401                                | _ => raise Fail("genStrand: unsupported output type " ^ Ty.toString ty)
402                              (* end case *))
403    
404                      val prArgs = (case ty                      val prArgs = (case ty
405                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]                             of Ty.IVecTy 1 => [CL.E_Str(!N.gIntFormat ^ "\n"), outState]
406                              | Ty.IVecTy d => let                              | Ty.IVecTy d => let
# Line 405  Line 424 
424                            (* end case *))                            (* end case *))
425                      val forBody = CL.mkIfThen(                      val forBody = CL.mkIfThen(
426                            CL.mkBinOp(CL.mkSubscript(CL.E_Var "status",CL.E_Var "i"), CL.#==, CL.E_Var "DIDEROT_STABILIZE"),                            CL.mkBinOp(CL.mkSubscript(CL.E_Var "status",CL.E_Var "i"), CL.#==, CL.E_Var "DIDEROT_STABILIZE"),
427                            CL.mkBlock([CL.mkCall("fprintf", CL.mkVar "outS" :: prArgs)]))                            CL.mkBlock(unshadowFields@[CL.mkCall("fprintf", CL.mkVar "outS" :: prArgs)]))
428                      val body =  CL.mkFor(                      val body =  CL.mkFor(
429                          [(CL.intTy, "i", CL.mkInt 0)],                          [(CL.intTy, "i", CL.mkInt 0)],
430                          CL.mkBinOp(CL.E_Var "i", CL.#<, CL.E_Var "numStrands"),                          CL.mkBinOp(CL.E_Var "i", CL.#<, CL.E_Var "numStrands"),
# Line 418  Line 437 
437                  prFn                  prFn
438                end                end
439    
440          fun genStrandTyDef (targetTy, Strand{tyName, state,...}) =          fun genStrandTyDef (targetTy, Strand{state,...},tyName) =
441              (* the type declaration for the strand's state struct *)              (* the type declaration for the strand's state struct *)
442                CL.D_StructDef(                CL.D_StructDef(
443                  List.rev (List.map (fn x => (targetTy x, #var x)) (!state)),                  List.rev (List.map (fn x => (targetTy x, #var x)) (!state)),
# Line 524  Line 543 
543                val inState = "strand_in"                val inState = "strand_in"
544                val outState = "strand_out"                val outState = "strand_out"
545                val tempVar = "tmp"                val tempVar = "tmp"
546                  val sizeParams = if nDims = 1 then
547                            []
548                        else if nDims = 2 then
549                            [CL.PARAM([], CL.intTy, "width")]
550                        else
551                            [CL.PARAM([], CL.intTy, "width"),CL.PARAM([], CL.intTy, "height")]
552                val params = [                val params = [
553                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfIn"),
554                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "selfOut"),
555                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus"),                        globalParam(CL.T_Ptr(CL.T_Num(RawTypes.RT_UInt8)), "strandStatus")] @
556                        CL.PARAM([], CL.intTy, "width"),                        sizeParams @
557                        globalParam(globPtrTy, RN.globalsVarName)                       [ globalParam(globPtrTy, RN.globalsVarName)
558                      ] @ genKeneralGlobalParams(!imgGlobals)                      ] @ genKeneralGlobalParams(!imgGlobals)
559                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
560                        then [                        then [
# Line 539  Line 564 
564                      else if nDims = 2                      else if nDims = 2
565                        then [                        then [
566                            CL.mkDecl(CL.intTy, "x",                            CL.mkDecl(CL.intTy, "x",
567                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
568                              CL.mkDecl(CL.intTy, "y",
569                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0]))))
570                            ]
571                        else
572                           [
573                              CL.mkDecl(CL.intTy, "x",
574                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1])))),
575                            CL.mkDecl(CL.intTy, "y",                            CL.mkDecl(CL.intTy, "y",
576                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 1]))))                              SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 0])))),
577                              CL.mkDecl(CL.intTy, "z",
578                                SOME(CL.I_Exp(CL.mkApply(RN.getGlobalThreadId,[CL.mkInt 2]))))
579                          ]                          ]
580                      else raise Fail "nDims > 2"  
581    
582                val strandDecl = [                val strandDecl = [
583                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),                        CL.mkAttrDecl(["__global"], CL.T_Ptr(CL.T_Named tyName), inState, NONE),
584                        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 559  Line 594 
594                                   CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))                                   CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]))
595                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])                val barrierStm = CL.mkCall("barrier",[CL.E_Var "CLK_LOCAL_MEM_FENCE"])
596                val index = if nDims = 1 then                val index = if nDims = 1 then
597                          CL.mkStr "x"                          CL.mkVar "x"
598                      else                      else if nDims = 2 then
599                          CL.mkBinOp(                          CL.mkBinOp(
600                              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")
601                        else
602                           CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(
603                                CL.mkBinOp(CL.mkVar "z", CL.#*, CL.mkVar "width"),CL.#*, CL.mkVar "height"), CL.#+,
604                                CL.mkBinOp(CL.mkVar "y",CL.#*,CL.mkVar "height")),CL.#+,CL.mkVar "x")
605    
606                  val args = if nDims = 1 then
607                            [CL.mkVar "x"]
608                        else if nDims = 2 then
609                            [CL.mkVar "x", CL.mkVar "y"]
610                        else
611                            [CL.mkVar "x", CL.mkVar "y", CL.mkVar "z"]
612    
613    
614                val strandObjects =                val strandObjects =
615                       [ 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 574  Line 621 
621                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))))
622                val strandInitStm = CL.mkCall(RN.strandInit name, [                val strandInitStm = CL.mkCall(RN.strandInit name, [
623                        CL.mkVar RN.globalsVarName,                        CL.mkVar RN.globalsVarName,
624                        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"])  
625                val local_vars = thread_ids                val local_vars = thread_ids
626                      @ [imageDataDecl]                      @ [imageDataDecl]
627                      @ imageDataStms                      @ imageDataStms
# Line 630  Line 672 
672                      in                      in
673                        CL.I_Struct[                        CL.I_Struct[
674                            ("name", CL.I_Exp(CL.mkStr name)),                            ("name", CL.I_Exp(CL.mkStr name)),
675                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(N.strandTy name)))),                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandShadowTy name)))),
676  (*  (*
677                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),
678  *)  *)
# Line 682  Line 724 
724                    ]));                    ]));
725                  clppDecl (genGlobalStruct (#gpuTy, !globals, RN.globalsTy));                  clppDecl (genGlobalStruct (#gpuTy, !globals, RN.globalsTy));
726                  clppDecl (genImageDataStruct(!imgGlobals,RN.imageDataType));                  clppDecl (genImageDataStruct(!imgGlobals,RN.imageDataType));
727                  clppDecl (genStrandTyDef(#gpuTy, strand));                  clppDecl (genStrandTyDef(#gpuTy, strand,tyName));
728                  clppDecl  (!init_code);                  clppDecl  (!init_code);
729                  List.app clppDecl (!code);                  List.app clppDecl (!code);
730                  clppDecl (genKernelFun (strand, !numDims, globals, imgGlobals));                  clppDecl (genKernelFun (strand, !numDims, globals, imgGlobals));
# Line 700  Line 742 
742                  cppDecl (genGlobalStruct (#shadowTy, !globals, RN.shadowGlobalsTy));                  cppDecl (genGlobalStruct (#shadowTy, !globals, RN.shadowGlobalsTy));
743  (* FIXME: does this really need to be a global? *)  (* FIXME: does this really need to be a global? *)
744                  cppDecl (CL.D_Var(["static"], globPtrTy, RN.globalsVarName, NONE));                  cppDecl (CL.D_Var(["static"], globPtrTy, RN.globalsVarName, NONE));
745                  cppDecl (genStrandTyDef (#hostTy, strand));                  cppDecl (genStrandTyDef (#shadowTy, strand,RN.strandShadowTy name));
746                  cppDecl (genStrandPrint strand);                  cppDecl (genStrandPrint strand);
747                  List.app cppDecl (List.rev (!topDecls));                  List.app cppDecl (List.rev (!topDecls));
748                  cppDecl (genGlobalBuffersArgs (!globals,imgGlobals));                  cppDecl (genGlobalBuffersArgs (!globals,imgGlobals));

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

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