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 1477, Wed Aug 31 19:01:58 2011 UTC revision 1478, Thu Sep 1 13:09:11 2011 UTC
# Line 42  Line 42 
42              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])
43            (* end case *))            (* end case *))
44    
45    (* FIXME: add comments that more clearly explain the difference between convertToShadow and
46     * convertStrandToShadow
47     *)
48     (* translate TreeIL types to shadow types *)     (* translate TreeIL types to shadow types *)
49      fun convertToShadow (ty, name) = (case ty      fun convertToShadow (ty, name) = (case ty
50             of Ty.IVecTy 1 => CL.mkAssign(             of Ty.IVecTy 1 => CL.mkAssign(
51                  CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                  CL.mkSelect(CL.mkVar RN.shadowGlaobalsName, name),
52                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                  CL.mkIndirect(CL.mkVar RN.globalsVarName, name))
53              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n, [              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n, [
54                    CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),                    CL.mkUnOp(CL.%&, CL.mkSelect(CL.mkVar RN.shadowGlaobalsName, name)),
55                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)                    CL.mkIndirect(CL.mkVar RN.globalsVarName, name)
56                  ])                  ])
57              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.mkCall(RN.shadowImageFunc dim, [              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.mkCall(RN.shadowImageFunc dim, [
58                    CL.mkVar "context",                    CL.mkVar "context",
59                    CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),                    CL.mkUnOp(CL.%&, CL.mkSelect(CL.mkVar RN.shadowGlaobalsName, name)),
60                    CL.mkIndirect(CL.mkVar(RN.globalsVarName),name)                    CL.mkIndirect(CL.mkVar RN.globalsVarName, name)
61                  ])                  ])
62              | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n), [              | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n), [
63                    CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                    CL.mkSelect(CL.mkVar RN.shadowGlaobalsName, name),
64                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)                    CL.mkIndirect(CL.mkVar RN.globalsVarName, name)
65                  ])                  ])
66              | _ => CL.mkAssign(              | _ => CL.mkAssign(
67                  CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                  CL.mkSelect(CL.mkVar RN.shadowGlaobalsName,name),
68                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                  CL.mkIndirect(CL.mkVar RN.globalsVarName, name))
69            (* end case *))            (* end case *))
70    
71     (* translate strand TreeIL types to shadow types *)     (* generate code to convert strand TreeIL types to shadow types *)
72      fun convertStrandToShadow (ty, name, selfIn, selfOut) = (case ty      fun convertStrandToShadow (ty, name, selfIn, selfOut) = (case ty
73             of Ty.IVecTy 1 => CL.mkAssign(             of Ty.IVecTy 1 => CL.mkAssign(
74                  CL.mkIndirect(CL.mkVar selfIn,name),                  CL.mkIndirect(CL.mkVar selfIn,name),
# Line 83  Line 86 
86                  CL.mkIndirect(CL.mkVar selfOut, name))                  CL.mkIndirect(CL.mkVar selfOut, name))
87            (* end case *))            (* end case *))
88    
   
89    (* helper functions for specifying parameters in various address spaces *)    (* helper functions for specifying parameters in various address spaces *)
90      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)
91      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)
# Line 385  Line 387 
387                            CL.mkCast(strandTy,                            CL.mkCast(strandTy,
388                            CL.mkApply(N.inState, [                            CL.mkApply(N.inState, [
389                                CL.mkVar "wrld",                                CL.mkVar "wrld",
390                                CL.mkBinOp(CL.mkVar indexVar, CL.#*, CL.mkSizeof(CL.T_Named (N.strandTy name)))                                CL.mkVar indexVar #*# CL.mkSizeof(CL.T_Named (N.strandTy name))
391                              ]))))),                              ]))))),
392                        CL.mkCall(N.strandInit name, CL.mkVar "sp" :: args),                        CL.mkCall(N.strandInit name, CL.mkVar "sp" :: args),
393                        CL.mkAssign(CL.mkVar indexVar, CL.mkBinOp(CL.mkVar indexVar, CL.#+, CL.mkIntTy(1, CL.uint32)))                        CL.mkAssign(CL.mkVar indexVar, CL.mkVar indexVar #+# CL.mkIntTy(1, CL.uint32))
394                      ])                      ])
395                  | mkLoopNest ((CL.V(ty, param), lo, hi)::iters) = let                  | mkLoopNest ((CL.V(ty, param), lo, hi)::iters) = let
396                      val body = mkLoopNest iters                      val body = mkLoopNest iters
# Line 590  Line 592 
592          workgroup's index within the WorkQueue data structure. By using          workgroup's index within the WorkQueue data structure. By using
593          the work-item's local id, it first determines its workgroup's starting          the work-item's local id, it first determines its workgroup's starting
594          strand (within the WorkQueue data structure) and then uses its          strand (within the WorkQueue data structure) and then uses its
595          local-id index to determine which strand it should work on for its group.*)           local-id index to determine which strand it should work on for its group.
596               *)
597                val (workerOffset, localOffset) = (CL.mkApply(RN.getGroupId, [CL.mkInt 0]), CL.mkApply(RN.getLocalThreadId, [CL.mkInt 0]))                val workerOffset = CL.mkApply(RN.getGroupId, [CL.mkInt 0])
598                  val localOffset = CL.mkApply(RN.getLocalThreadId, [CL.mkInt 0])
599                val params = [                val params = [
600                        globalParam(CL.T_Ptr(CL.T_Named tyName), "strands"),                        globalParam(CL.T_Ptr(CL.T_Named tyName), "strands"),
601                        globalParam(CL.T_Ptr(CL.intTy), "strandStatus"),                        globalParam(CL.T_Ptr(CL.intTy), "strandStatus"),
# Line 613  Line 616 
616                            localOffset #*# CL.mkVar "limit")))                            localOffset #*# CL.mkVar "limit")))
617                      ]                      ]
618                val strandInit = [                val strandInit = [
619                                            CL.mkAssign(CL.mkVar "selfIn",                                            CL.mkAssign(CL.mkVar "selfIn", CL.mkVar "strands" #+# CL.mkVar "strandIndex"),
                                             CL.mkBinOp(CL.mkVar "strands",CL.#+,CL.mkVar "strandIndex")),  
620                                            CL.mkAssign(CL.mkVar "selfOut",CL.mkVar "selfIn")                                            CL.mkAssign(CL.mkVar "selfOut",CL.mkVar "selfIn")
621                                          ]                                          ]
622                val strandDecl = [                val strandDecl = [
# Line 702  Line 704 
704                            ("name", CL.I_Exp(CL.mkStr name)),                            ("name", CL.I_Exp(CL.mkStr name)),
705                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),
706                            ("shadowStrandSzb",CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandShadowTy (RN.strandTy name))))),                            ("shadowStrandSzb",CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandShadowTy (RN.strandTy name))))),
707  (*  (* FIXME: we may need to add a shadowOutputSzb field too for OpenCL *)
708                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),                            ("outputSzb", CL.I_Exp(CL.mkSizeof(shadowTy outTy))),
 *)  
709                            ("update", fnPtr("update_method_t", "0")),                            ("update", fnPtr("update_method_t", "0")),
710                            ("strandCopy",  fnPtr("convert_method_t", RN.strandConvertName name)),                            ("strandCopy",  fnPtr("convert_method_t", RN.strandConvertName name)),
711                            ("print", fnPtr("print_method_t", RN.strandPrintName name))                            ("print", fnPtr("print_method_t", RN.strandPrintName name)),
712                              ("output", fnPtr("output_method_t", "0")) (* FIXME *)
713                          ]                          ]
714                      end                      end
715                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)
# Line 746  Line 748 
748                in                in
749                (* Generate the OpenCl file *)                (* Generate the OpenCl file *)
750                  clppDecl (CL.D_Verbatim([                  clppDecl (CL.D_Verbatim([
751                                      (* if the target supports OpenCL 1.1, then 32-bit atomics are part of the core. *)
752                                            "#if (DIDEROT_CL_VERSION == 100)",
753                        "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics: enable",
754                                            "#endif",
755                      if double                      if double
756                        then "#define DIDEROT_DOUBLE_PRECISION"                        then "#define DIDEROT_DOUBLE_PRECISION"
757                        else "#define DIDEROT_SINGLE_PRECISION",                        else "#define DIDEROT_SINGLE_PRECISION",
                     "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics: enable",  
758                      "#define DIDEROT_TARGET_CL",                      "#define DIDEROT_TARGET_CL",
759                      "#include \"Diderot/cl-diderot.h\""                      "#include \"Diderot/cl-diderot.h\""
760                    ]));                    ]));

Legend:
Removed from v.1477  
changed lines
  Added in v.1478

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