Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis12-cl/src/compiler/cl-target/cl-target.sml
ViewVC logotype

Diff of /branches/vis12-cl/src/compiler/cl-target/cl-target.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2755, Thu Oct 9 17:44:33 2014 UTC revision 2756, Thu Oct 9 22:01:53 2014 UTC
# Line 43  Line 43 
43          props : props,                  (* info about target *)          props : props,                  (* info about target *)
44          inputs : GenInputs.input_desc list ref,          inputs : GenInputs.input_desc list ref,
45          globals : global_var list ref,          globals : global_var list ref,
46            globInit : CL.stm list ref,     (* global initialization code; this gets combined with *)
47                                            (* the setInitDim code. *)
48          kernels : string list ref,      (* a list of the OpenCL kernels used by this program *)          kernels : string list ref,      (* a list of the OpenCL kernels used by this program *)
49          topCDecls : CL.decl list ref,   (* top-level decls for the C file *)          topCDecls : CL.decl list ref,   (* top-level decls for the C file *)
50          topOCLDecls : CL.decl list ref, (* top-level decls for the OpenCL file *)          topOCLDecls : CL.decl list ref, (* top-level decls for the OpenCL file *)
# Line 278  Line 280 
280                      props = props,                      props = props,
281                      inputs = ref [],                      inputs = ref [],
282                      globals = ref [],                      globals = ref [],
283                        globInit = ref [],
284                      kernels = ref kernels,                      kernels = ref kernels,
285                      topCDecls = ref [],                      topCDecls = ref [],
286                      topOCLDecls = ref [],                      topOCLDecls = ref [],
# Line 290  Line 293 
293        (* gather the inputs *)        (* gather the inputs *)
294          fun inputs (Prog{inputs, ...}, env, blk) = inputs := GenInputs.gatherInputs blk          fun inputs (Prog{inputs, ...}, env, blk) = inputs := GenInputs.gatherInputs blk
295        (* register the global initialization part of a program *)        (* register the global initialization part of a program *)
296          fun init (Prog{props, globals, topOCLDecls, ...}, init) = let          fun init (Prog{globInit, ...}, init) = globInit := CL.unBlock init
               val globTy = globalPtrTy props  
               val initKern = CLU.mkTaskKernel (CLN.initGlobalsKern,  
                     [CLU.globalParam(globTy, "glob")],  
                     init)  
               in  
                 topOCLDecls := initKern :: !topOCLDecls  
               end  
297        (* register the global destruction part of a program *)        (* register the global destruction part of a program *)
298          fun free (Prog{props, topCDecls, ...}, env, globals) = let          fun free (Prog{props, topCDecls, ...}, env, globals) = let
299                val worldTy = worldPtrTy props                val worldTy = worldPtrTy props
# Line 336  Line 332 
332                        setInitDim := gen (iters, 0)                        setInitDim := gen (iters, 0)
333                      end                      end
334              (* create the loop nest for the initially iterations *)              (* create the loop nest for the initially iterations *)
335                  fun loopBnd hiOrLo i =
336                        CL.mkSubscript(CL.mkIndirect(CL.mkVar "glob", hiOrLo), CL.mkInt i)
337                val indexVar = "ix"                val indexVar = "ix"
338                val strandTy = CL.T_Ptr(CL.T_Named(CLN.strandTy name))                val strandTy = CL.T_Ptr(CL.T_Named(CLN.strandTy name))
339                fun statePtr inout = CL.mkAddrOf(CL.mkSubscript(CL.mkVar inout, CL.mkVar indexVar))                fun statePtr inout = CL.mkAddrOf(CL.mkSubscript(CL.mkVar inout, CL.mkVar indexVar))
340                fun mkLoopNest [] = if Properties.dualState props                fun mkLoopNest (_, []) = if Properties.dualState props
341                      then CL.mkBlock(createPrefix @ [                      then CL.mkBlock(createPrefix @ [
342                          CL.mkCall(CLN.strandInit name, CL.mkVar "glob" :: statePtr "inState" :: args),                          CL.mkCall(CLN.strandInit name, CL.mkVar "glob" :: statePtr "inState" :: args),
343                          CL.mkCall("memcpy", [                          CL.mkCall("memcpy", [
# Line 352  Line 350 
350                          CL.mkCall(CLN.strandInit name, CL.mkVar "glob" :: statePtr "state" :: args),                          CL.mkCall(CLN.strandInit name, CL.mkVar "glob" :: statePtr "state" :: args),
351                          CL.S_Exp(CL.mkPostOp(CL.mkVar indexVar, CL.^++))                          CL.S_Exp(CL.mkPostOp(CL.mkVar indexVar, CL.^++))
352                        ])                        ])
353                  | mkLoopNest ((CL.V(ty, param), lo, hi)::iters) = let                  | mkLoopNest (i, (CL.V(ty, param), _, _)::iters) = let
354                      val body = mkLoopNest iters                      val body = mkLoopNest(i+1, iters)
355                      in                      in
356                        CL.mkFor(                        CL.mkFor(
357                          [(ty, param, lo)],                          [(ty, param, loopBnd "initiallyLo" i)],
358                          CL.mkBinOp(CL.mkVar param, CL.#<=, hi),                          CL.mkBinOp(CL.mkVar param, CL.#<=, loopBnd "initiallyHi" i),
359                          [CL.mkPostOp(CL.mkVar param, CL.^++)],                          [CL.mkPostOp(CL.mkVar param, CL.^++)],
360                          body)                          body)
361                      end                      end
362                val iterCode = [                val iterCode = [
363                        CL.mkComment["initially"],                        CL.mkComment["initially"],
364                        CL.mkDecl(CL.uint32, indexVar, SOME(CL.I_Exp(CL.mkInt 0))),                        CL.mkDecl(CL.uint32, indexVar, SOME(CL.I_Exp(CL.mkInt 0))),
365                        mkLoopNest iters                        mkLoopNest (0, iters)
366                      ]                      ]
367                val body = CL.mkBlock(iterPrefix @ iterCode)                val body = CL.mkBlock(iterPrefix @ iterCode)
368                val initKern = CLUtil.mkTaskKernel(                val initKern = CLUtil.mkTaskKernel(
# Line 448  Line 446 
446                  CL.D_StructDef(NONE, fields, SOME(CLN.globalsTy props))                  CL.D_StructDef(NONE, fields, SOME(CLN.globalsTy props))
447                end                end
448    
449          (* generate the global initialization kernel *)
450            fun genGlobInitKern (Prog{props, globInit, setInitDim, ...}) = let
451                  val globTy = globalPtrTy props
452                  in
453                    CLU.mkTaskKernel (CLN.initGlobalsKern,
454                      [CLU.globalParam(globTy, "glob")],
455                      CL.mkBlock(
456                        !globInit @
457                        CL.S_Comment["compute size of initial strand grid"] ::
458                        !setInitDim))
459                  end
460    
461          (* generate the C function for binding the kernels used by the program *)
462          fun genBindKernels (props, kernels) = let          fun genBindKernels (props, kernels) = let
463                val worldTy = worldPtrTy props                val worldTy = worldPtrTy props
464                fun bindKern (k, stms) =                fun bindKern (k, stms) =
# Line 567  Line 578 
578  (* comment out for debugging  (* comment out for debugging
579                  ppDecl (CL.D_Verbatim[CLEigen3x3Frag.text]);                  ppDecl (CL.D_Verbatim[CLEigen3x3Frag.text]);
580  *)  *)
581  (* FIXME: generate the functions to initialize the globals *)                  ppDecl (genGlobInitKern prog);
582                  List.app ppDecl outputs;                  List.app ppDecl outputs;
583                  List.app ppDecl (!strandCode);                  List.app ppDecl (!strandCode);
584                  List.app ppDecl (!topOCLDecls);                  List.app ppDecl (!topOCLDecls);

Legend:
Removed from v.2755  
changed lines
  Added in v.2756

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