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 1461, Mon Aug 8 04:50:12 2011 UTC revision 1462, Tue Aug 9 07:22:45 2011 UTC
# Line 34  Line 34 
34                  CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                  CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),
35                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
36              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n, [              | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n, [
37                    CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name),                    CL.mkUnOp(CL.%&,CL.mkSelect(CL.mkVar(RN.shadowGlaobalsName),name)),
38                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)                    CL.mkIndirect(CL.mkVar(RN.globalsVarName), name)
39                  ])                  ])
40              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.mkCall(RN.shadowImageFunc dim, [              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.mkCall(RN.shadowImageFunc dim, [
# Line 51  Line 51 
51                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))                  CL.mkIndirect(CL.mkVar(RN.globalsVarName), name))
52            (* end case *))            (* end case *))
53    
54       (* translate strand TreeIL types to shadow types *)
55        fun convertStrandToShadow (ty, name, selfIn, selfOut) = (case ty
56               of Ty.IVecTy 1 => CL.mkAssign(
57                    CL.mkIndirect(CL.mkVar selfIn,name),
58                    CL.mkIndirect(CL.mkVar selfOut, name))
59                | Ty.TensorTy[n]=> CL.mkCall(RN.convertToShadowVec n, [
60                      CL.mkUnOp(CL.%&,CL.mkIndirect(CL.mkVar selfOut,name)),
61                      CL.mkIndirect(CL.mkVar selfIn, name)
62                    ])
63                | Ty.TensorTy[n, m] => CL.mkCall(RN.convertToShadowMat(m,n), [
64                      CL.mkUnOp(CL.%&,CL.mkIndirect(CL.mkVar selfOut,name)),
65                      CL.mkIndirect(CL.mkVar selfIn, name)
66                    ])
67                | _ => CL.mkAssign(
68                    CL.mkIndirect(CL.mkVar selfIn,name),
69                    CL.mkIndirect(CL.mkVar selfOut, name))
70              (* end case *))
71    
72    
73    (* helper functions for specifying parameters in various address spaces *)    (* helper functions for specifying parameters in various address spaces *)
74      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)      fun clParam (spc, ty, x) = CL.PARAM([spc], ty, x)
75      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)      fun globalParam (ty, x) = CL.PARAM(["__global"], ty, x)
# Line 99  Line 118 
118      val clPlatformIdTy = CL.T_Named "cl_platform_id"      val clPlatformIdTy = CL.T_Named "cl_platform_id"
119      val clMemoryTy = CL.T_Named "cl_mem"      val clMemoryTy = CL.T_Named "cl_mem"
120      val globPtrTy = CL.T_Ptr(CL.T_Named RN.globalsTy)      val globPtrTy = CL.T_Ptr(CL.T_Named RN.globalsTy)
121        val strandShadowEnv = 1
122        val globalShadowEnv = 2
123    
124    (* variable or field that is mirrored between host and GPU *)    (* variable or field that is mirrored between host and GPU *)
125      type mirror_var = {      type mirror_var = {
# Line 198  Line 219 
219    (* variables *)    (* variables *)
220      structure Var =      structure Var =
221        struct        struct
222          fun mirror (ty, name) = {          fun mirror (ty, name, shadowEnv ) = {
223                  hostTy = ToC.trType ty,                  hostTy = ToC.trType ty,
224                  shadowTy = shadowTy ty,                  shadowTy = shadowTy ty,
225                  gpuTy = ToCL.trType ty,                  gpuTy = ToCL.trType ty,
226                  hToS = convertToShadow(ty,name),                  hToS = if globalShadowEnv = shadowEnv then
227                              convertToShadow(ty,name)
228                           else
229                              convertStrandToShadow(ty,name,"selfIn", "selfOut"),
230    
231                  var = name                  var = name
232                }                }
233          fun name (ToCL.V(_, name)) = name          fun name (ToCL.V(_, name)) = name
234          fun global (Prog{globals, imgGlobals, ...}, name, ty) = let          fun global (Prog{globals, imgGlobals, ...}, name, ty) = let
235                val x = mirror (ty, name)                val x = mirror (ty, name, globalShadowEnv)
236                fun isImgGlobal (Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}), name) =                fun isImgGlobal (Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}), name) =
237                      imgGlobals  := (name,dim) :: !imgGlobals                      imgGlobals  := (name,dim) :: !imgGlobals
238                  | isImgGlobal _ =  ()                  | isImgGlobal _ =  ()
# Line 219  Line 244 
244          fun param x = ToCL.V(ToCL.trType(V.ty x), V.name x)          fun param x = ToCL.V(ToCL.trType(V.ty x), V.name x)
245          fun state (Strand{state, ...}, x) = let          fun state (Strand{state, ...}, x) = let
246                val ty = V.ty x                val ty = V.ty x
247                val x' = mirror (ty, V.name x)                val x' = mirror (ty, V.name x, strandShadowEnv)
248                in                in
249                  state := x' :: !state;                  state := x' :: !state;
250                  ToCL.V(#gpuTy x', #var x')                  ToCL.V(#gpuTy x', #var x')
# Line 386  Line 411 
411                val prFn = let                val prFn = let
412                      val params = [                      val params = [
413                            CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),                            CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),
414                            CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "self")                            CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.strandShadowTy tyName)), "self")
415                          ]                          ]
416                      val SOME(ty, x) = !output                      val SOME(ty, x) = !output
417                      val outState = CL.mkIndirect(CL.mkVar "self", x)                      val outState = CL.mkIndirect(CL.mkVar "self", x)
# Line 396  Line 421 
421                                  val fmt = CL.E_Str(                                  val fmt = CL.E_Str(
422                                        String.concatWith " " (List.tabulate(d, fn _ => !N.gIntFormat))                                        String.concatWith " " (List.tabulate(d, fn _ => !N.gIntFormat))
423                                        ^ "\n")                                        ^ "\n")
424                                  val args = List.tabulate (d, fn i => ToC.ivecIndex(outState, d, i))                                  val args = List.tabulate (d, fn i => CL.mkApply("VSUBP",[outState, CL.mkInt (IntInf.fromInt i)] ))
425                                  in                                  in
426                                    fmt :: args                                    fmt :: args
427                                  end                                  end
# Line 405  Line 430 
430                                  val fmt = CL.E_Str(                                  val fmt = CL.E_Str(
431                                        String.concatWith " " (List.tabulate(d, fn _ => "%f"))                                        String.concatWith " " (List.tabulate(d, fn _ => "%f"))
432                                        ^ "\n")                                        ^ "\n")
433                                  val args = List.tabulate (d, fn i => ToC.vecIndex(outState, d, i))                                  val args = List.tabulate (d, fn i => CL.mkApply("VSUBP",[outState, CL.mkInt (IntInf.fromInt i)]))
434                                  in                                  in
435                                    fmt :: args                                    fmt :: args
436                                  end                                  end
# Line 425  Line 450 
450                  List.rev (List.map (fn x => (targetTy x, #var x)) (!state)),                  List.rev (List.map (fn x => (targetTy x, #var x)) (!state)),
451                  tyName)                  tyName)
452    
453         (* generates the globals buffers and arguments function *)
454            fun genConvertShadowTypes (Strand{tyName, state,...}) = let
455                (* Delcare opencl setup objects *)
456                  val errVar = "err"
457                  val imgDataSizeVar = "image_dataSize"
458                  val params = [
459                          CL.PARAM([],CL.T_Ptr(CL.T_Named(tyName)), "selfIn"),
460                          CL.PARAM([],CL.T_Ptr(CL.T_Named(RN.strandShadowTy tyName)), "selfOut")
461                        ]
462                  val body = List.map (fn (x:mirror_var) => #hToS x ) (!state)
463                  in
464                    CL.D_Func([],CL.voidTy,RN.strandConvertName,params,CL.mkBlock(body))
465                  end
466        (* generates the opencl buffers for the image data *)        (* generates the opencl buffers for the image data *)
467          fun getGlobalDataBuffers (globals, imgGlobals, contextVar, errVar) = let          fun getGlobalDataBuffers (globals, imgGlobals, contextVar, errVar) = let
468                val globalBuffErr = "error creating OpenCL global buffer\n"                val globalBuffErr = "error creating OpenCL global buffer\n"
# Line 535  Line 572 
572                              CL.mkBinOp(CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0]),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1])),CL.#+,CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1])))                              CL.mkBinOp(CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0]),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1])),CL.#+,CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1])))
573                  else                  else
574                            ( CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(                            ( CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(
575                              CL.mkBinOp(CL.mkApply(RN.getGroupId,[CL.mkInt 0]), CL.#*, CL.mkApply(RN.getNumGroups,[CL.mkInt 1])),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 2])), CL.#+,                              CL.mkBinOp(CL.mkApply(RN.getGroupId,[CL.mkInt 0]), CL.#*, CL.mkApply(RN.getNumGroups,[CL.mkInt 1])),CL.#*, CL.mkApply(RN.getNumGroups,[CL.mkInt 2])), CL.#+,
576                              CL.mkBinOp(CL.mkApply(RN.getGroupId,[CL.mkInt 1]),CL.#*,CL.mkApply(RN.getLocalSize,[CL.mkInt 1]))),CL.#+,CL.mkApply(RN.getGroupId,[CL.mkInt 2])),                              CL.mkBinOp(CL.mkApply(RN.getGroupId,[CL.mkInt 1]),CL.#*,CL.mkApply(RN.getNumGroups,[CL.mkInt 1]))),CL.#+,CL.mkApply(RN.getGroupId,[CL.mkInt 2])),
577                             CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(                             CL.mkBinOp(CL.mkBinOp(CL.mkBinOp(
578                              CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0]), CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1])),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 2])), CL.#+,                              CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 0]), CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 1])),CL.#*, CL.mkApply(RN.getLocalSize,[CL.mkInt 2])), CL.#+,
579                              CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1]),CL.#*,CL.mkApply(RN.getLocalSize,[CL.mkInt 1]))),CL.#+,CL.mkApply(RN.getLocalThreadId,[CL.mkInt 2])) )                              CL.mkBinOp(CL.mkApply(RN.getLocalThreadId,[CL.mkInt 1]),CL.#*,CL.mkApply(RN.getLocalSize,[CL.mkInt 1]))),CL.#+,CL.mkApply(RN.getLocalThreadId,[CL.mkInt 2])) )
# Line 646  Line 683 
683                        CL.I_Struct[                        CL.I_Struct[
684                            ("name", CL.I_Exp(CL.mkStr name)),                            ("name", CL.I_Exp(CL.mkStr name)),
685                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),                            ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),
686                              ("shadowStrandSzb",CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandShadowTy (RN.strandTy name))))),
687  (*  (*
688                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),                            ("outputSzb", CL.I_Exp(CL.mkSizeof(ToC.trTy outTy))),
689  *)  *)
690                            ("update", fnPtr("update_method_t", "0")),                            ("update", fnPtr("update_method_t", "0")),
691                              ("strandCopy",  fnPtr("convert_method_t", "Diderot_Strand_Covert_To_Shadow")),
692                            ("print", fnPtr("print_method_t", name ^ "_print"))                            ("print", fnPtr("print_method_t", name ^ "_print"))
693                          ]                          ]
694                      end                      end
# Line 716  Line 755 
755  (* FIXME: does this really need to be a global? *)  (* FIXME: does this really need to be a global? *)
756                  cppDecl (CL.D_Var(["static"], globPtrTy, RN.globalsVarName, NONE));                  cppDecl (CL.D_Var(["static"], globPtrTy, RN.globalsVarName, NONE));
757                  cppDecl (genStrandTyDef (#hostTy, strand, tyName));                  cppDecl (genStrandTyDef (#hostTy, strand, tyName));
758                    cppDecl (genStrandTyDef (#shadowTy, strand, RN.strandShadowTy tyName));
759                    cppDecl (genConvertShadowTypes strand);
760                  cppDecl  (!init_code);                  cppDecl  (!init_code);
761                  cppDecl (genStrandPrint strand);                  cppDecl (genStrandPrint strand);
762                  List.app cppDecl (List.rev (!topDecls));                  List.app cppDecl (List.rev (!topDecls));

Legend:
Removed from v.1461  
changed lines
  Added in v.1462

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