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 1315, Sat Jun 11 21:10:15 2011 UTC revision 1322, Sun Jun 12 17:13:33 2011 UTC
# Line 115  Line 115 
115          fun fragment (ENV{info, vMap, scope}, blk) = let          fun fragment (ENV{info, vMap, scope}, blk) = let
116                val (vMap, stms) = (case scope                val (vMap, stms) = (case scope
117                       of GlobalScope => ToC.trFragment (vMap, blk)                       of GlobalScope => ToC.trFragment (vMap, blk)
118    (* NOTE: if we move strand initialization to the GPU, then we'll have to change the following code! *)
119                        | InitiallyScope => ToC.trFragment (vMap, blk)                        | InitiallyScope => ToC.trFragment (vMap, blk)
120                        | _ => ToCL.trFragment (vMap, blk)                        | _ => ToCL.trFragment (vMap, blk)
121                      (* end case *))                      (* end case *))
# Line 134  Line 135 
135                  case scope                  case scope
136  (* NOTE: if we move strand initialization to the GPU, then we'll have to change the following code! *)  (* NOTE: if we move strand initialization to the GPU, then we'll have to change the following code! *)
137                   of StrandScope stateVars =>                   of StrandScope stateVars =>
138                        ToC.trBlock (vMap, saveState "StrandScope" stateVars ToC.trAssign, blk)                        ToCL.trBlock (vMap, saveState "StrandScope" stateVars ToC.trAssign, blk)
139                    | MethodScope stateVars =>                    | MethodScope stateVars =>
140                        ToCL.trBlock (vMap, saveState "MethodScope" stateVars ToCL.trAssign, blk)                        ToCL.trBlock (vMap, saveState "MethodScope" stateVars ToCL.trAssign, blk)
141                    | InitiallyScope => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)                    | InitiallyScope => ToCL.trBlock (vMap, fn (_, _, stm) => [stm], blk)
142                    | _ => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)                    | _ => ToC.trBlock (vMap, fn (_, _, stm) => [stm], blk)
143                  (* end case *)                  (* end case *)
144                end                end
# Line 232  Line 233 
233    
234        (* register the global initialization part of a program *)        (* register the global initialization part of a program *)
235          fun init (Prog{topDecls, ...}, init) = let          fun init (Prog{topDecls, ...}, init) = let
236                                      val globalsDecl = CL.mkAssign(CL.E_Var RN.globalsVarName,
237                        CL.mkApply("malloc", [CL.mkApply("sizeof",[CL.mkVar RN.globalsTy])]))
238    
239                  val initGlobalsCall = CL.mkCall(RN.initGlobalsHelper,[])
240    
241                val initFn = CL.D_Func(                val initFn = CL.D_Func(
242                      [], CL.voidTy, RN.initGlobals, [CL.PARAM([], globPtrTy, RN.globalsVarName)],                      [], CL.voidTy, RN.initGlobals, [],
243                        CL.mkBlock([globalsDecl,initGlobalsCall]))
244                  val initFn_helper = CL.D_Func(
245                        [], CL.voidTy, RN.initGlobalsHelper, [],
246                      init)                      init)
247                val shutdownFn = CL.D_Func(                val shutdownFn = CL.D_Func(
248                      [], CL.voidTy, RN.shutdown,                      [], CL.voidTy, RN.shutdown,
249                      [CL.PARAM([], CL.T_Ptr(CL.T_Named RN.worldTy), "wrld")],                      [CL.PARAM([], CL.T_Ptr(CL.T_Named RN.worldTy), "wrld")],
250                      CL.S_Block[])                      CL.S_Block[])
251                in                in
252                  topDecls := shutdownFn :: initFn :: !topDecls                  topDecls := shutdownFn :: initFn :: initFn_helper :: !topDecls
253                end                end
254           (* create and register the initially function for a program *)           (* create and register the initially function for a program *)
255          fun initially {          fun initially {
# Line 282  Line 291 
291                              CL.E_Var "size"                              CL.E_Var "size"
292                            ]))))                            ]))))
293                      ]                      ]
294              (* create the loop nest for the initially iterations *)              (* create the loop nest for the initially iterations
295                val indexVar = "ix"                val indexVar = "ix"
296                val strandTy = CL.T_Ptr(CL.T_Named(N.strandTy name))                val strandTy = CL.T_Ptr(CL.T_Named(N.strandTy name))
297                fun mkLoopNest [] = CL.mkBlock(createPrefix @ [                fun mkLoopNest [] = CL.mkBlock(createPrefix @ [
# Line 307  Line 316 
316                        CL.mkComment["initially"],                        CL.mkComment["initially"],
317                        CL.mkDecl(CL.uint32, indexVar, SOME(CL.I_Exp(CL.E_Int(0, CL.uint32)))),                        CL.mkDecl(CL.uint32, indexVar, SOME(CL.I_Exp(CL.E_Int(0, CL.uint32)))),
318                        mkLoopNest iters                        mkLoopNest iters
319                      ]                      ] *)
320                val body = CL.mkBlock(                val body = CL.mkBlock(
321                      iterPrefix @                      iterPrefix @
322                      allocCode @                      allocCode @
                     iterCode @  
323                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])
324                val initFn = CL.D_Func([], worldTy, N.initially, [CL.PARAM([], globPtrTy, RN.globalsVarName)], body)                val initFn = CL.D_Func([], worldTy, N.initially, [], body)
325                in                in
326                  initially := initFn                  initially := initFn
327                end                end
# Line 446  Line 454 
454                val errVar = "err"                val errVar = "err"
455                val imgDataSizeVar = "image_dataSize"                val imgDataSizeVar = "image_dataSize"
456                val params = [                val params = [
                       CL.PARAM([], globPtrTy, RN.globalsVarName),  
457                        CL.PARAM([],CL.T_Named("cl_context"), "context"),                        CL.PARAM([],CL.T_Named("cl_context"), "context"),
458                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),
459                        CL.PARAM([],CL.T_Named("int"), "argStart")                        CL.PARAM([],CL.T_Named("int"), "argStart")
# Line 457  Line 464 
464                val body = CL.mkDecl(clIntTy, errVar, SOME(CL.I_Exp(CL.mkInt 0)))                val body = CL.mkDecl(clIntTy, errVar, SOME(CL.I_Exp(CL.mkInt 0)))
465                      :: clGlobalBuffers @ clGlobalArguments                      :: clGlobalBuffers @ clGlobalArguments
466                in                in
 (* FIXME: we ought to check the error condition! *)  
467                  CL.D_Func([],CL.voidTy,RN.globalsSetupName,params,CL.mkBlock(body))                  CL.D_Func([],CL.voidTy,RN.globalsSetupName,params,CL.mkBlock(body))
468                end                end
469    
# Line 470  Line 476 
476            | genKeneralGlobalParams [] = []            | genKeneralGlobalParams [] = []
477    
478        (*generate code for intilizing kernel global data *)        (*generate code for intilizing kernel global data *)
         fun initKernelGlobals (globals, imgGlobals) = let  
479  (* FIXME: should use List.map here *)  (* FIXME: should use List.map here *)
               fun initGlobalStruct ({hostTy, gpuTy, var}::rest) =  
                     CL.mkAssign(CL.mkVar var, CL.mkIndirect(CL.mkVar RN.globalsVarName, var)) ::  
                     initGlobalStruct rest  
                 | initGlobalStruct [] = []  
480                fun initGlobalImages ((name, tyname)::rest) =                fun initGlobalImages ((name, tyname)::rest) =
481                      CL.mkAssign(CL.mkVar name, CL.mkVar (RN.addBufferSuffix name)) ::               CL.mkAssign(CL.mkIndirect(CL.E_Var RN.globalsVarName, name), CL.mkVar (RN.addBufferSuffix name)) ::
482                      CL.mkAssign(CL.mkIndirect(CL.mkVar name,"data"),CL.mkVar (RN.addBufferSuffixData name)) ::               CL.mkAssign(CL.mkIndirect(CL.E_Var RN.globalsVarName,concat[name,"->","data"]),CL.mkVar (RN.addBufferSuffixData name)) ::
483                      initGlobalImages rest                      initGlobalImages rest
484                    | initGlobalImages [] = []                    | initGlobalImages [] = []
               in  
                 initGlobalStruct globals @ initGlobalImages(imgGlobals)  
               end  
485    
486          (* generate the main kernel function for the .cl file *)          (* generate the main kernel function for the .cl file *)
487          fun genKernelFun (strand, nDims, globals, imgGlobals) = let          fun genKernelFun (strand, nDims, globals, imgGlobals) = let
# Line 522  Line 520 
520                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut",index))                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut",index))
521                        ] end                        ] end
522                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkInt 0)))                val status = CL.mkDecl(CL.intTy, "status", SOME(CL.I_Exp(CL.mkInt 0)))
523                val local_vars = thread_ids @ initKernelGlobals(!globals,!imgGlobals)  @ strandDecl @ strandObjects @ [status]                val strand_Init_Stm = CL.mkCall(RN.strandInit name, [CL.E_Var RN.globalsVarName,CL.mkUnOp(CL.%&,CL.E_Var inState), CL.E_Var "x", CL.E_Var "y"])
524                  val local_vars = thread_ids @ initGlobalImages(!imgGlobals)  @ strandDecl @ strandObjects @ [strand_Init_Stm,status]
525                val while_exp = CL.mkBinOp(                val while_exp = CL.mkBinOp(
526                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),
527                      CL.#||,                      CL.#||,
# Line 530  Line 529 
529                val whileBody = CL.mkBlock [                val whileBody = CL.mkBlock [
530                        CL.mkAssign(CL.mkVar "status",                        CL.mkAssign(CL.mkVar "status",
531                          CL.mkApply(RN.strandUpdate name,                          CL.mkApply(RN.strandUpdate name,
532                            [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState)])),                            [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])),
533                        CL.mkCall(RN.strandStabilize name,                        CL.mkCall(RN.strandStabilize name,
534                          [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState)])                          [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])
535                      ]                      ]
536                val whileBlock = [CL.mkWhile(while_exp, whileBody)]                val whileBlock = [CL.mkWhile(while_exp, whileBody)]
537                val body = CL.mkBlock(local_vars  @ whileBlock)                val body = CL.mkBlock(local_vars  @ whileBlock)
# Line 588  Line 587 
587                end                end
588    
589          fun genSrc (baseName, prog) = let          fun genSrc (baseName, prog) = let
590                val Prog{double, globals, topDecls, strands, initially, imgGlobals, numDims, ...} = prog                val Prog{name,double, globals, topDecls, strands, initially, imgGlobals, numDims, ...} = prog
591                val clFileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "cl"}                val clFileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "cl"}
592                val cFileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "c"}                val cFileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "c"}
593                val clOutS = TextIO.openOut clFileName                val clOutS = TextIO.openOut clFileName
594                val cOutS = TextIO.openOut cFileName                val cOutS = TextIO.openOut cFileName
595                val clppStrm = PrintAsCL.new clOutS                val clppStrm = PrintAsCL.new clOutS
596                val cppStrm = PrintAsC.new cOutS                val cppStrm = PrintAsC.new cOutS
597                  val progName = name
598                fun cppDecl dcl = PrintAsC.output(cppStrm, dcl)                fun cppDecl dcl = PrintAsC.output(cppStrm, dcl)
599                fun clppDecl dcl = PrintAsCL.output(clppStrm, dcl)                fun clppDecl dcl = PrintAsCL.output(clppStrm, dcl)
600                val strands = AtomTable.listItems strands                val strands = AtomTable.listItems strands
# Line 608  Line 608 
608                      "#define DIDEROT_TARGET_CL",                      "#define DIDEROT_TARGET_CL",
609                      "#include \"Diderot/cl-diderot.h\""                      "#include \"Diderot/cl-diderot.h\""
610                    ]));                    ]));
                 genGlobals (clppDecl, #gpuTy, !globals);  
611                  clppDecl (genGlobalStruct (#gpuTy, !globals));                  clppDecl (genGlobalStruct (#gpuTy, !globals));
612                  clppDecl (genStrandTyDef(#gpuTy, strand));                  clppDecl (genStrandTyDef(#gpuTy, strand));
613                    clppDecl  (!init_code);
614                  List.app clppDecl (!code);                  List.app clppDecl (!code);
615                  clppDecl (genKernelFun (strand, !numDims, globals, imgGlobals));                  clppDecl (genKernelFun (strand, !numDims, globals, imgGlobals));
616                (* Generate the Host C file *)                (* Generate the Host C file *)
# Line 622  Line 622 
622                      "#include \"Diderot/diderot.h\""                      "#include \"Diderot/diderot.h\""
623                    ]));                    ]));
624                  cppDecl (CL.D_Var(["static"], CL.charPtr, "ProgramName",                  cppDecl (CL.D_Var(["static"], CL.charPtr, "ProgramName",
625                    SOME(CL.I_Exp(CL.mkStr name))));                    SOME(CL.I_Exp(CL.mkStr progName))));
 (* FIXME: I don't think that the following is necessary, since we have the global struct. [jhr]  
                 genGlobals (cppDecl, #hostTy, !globals);  
 *)  
626                  cppDecl (genGlobalStruct (#hostTy, !globals));                  cppDecl (genGlobalStruct (#hostTy, !globals));
627                    cppDecl (CL.D_Var(["static"], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName, NONE));
628                  cppDecl (genStrandTyDef (#hostTy, strand));                  cppDecl (genStrandTyDef (#hostTy, strand));
                 cppDecl  (!init_code);  
629                  cppDecl (genStrandPrint strand);                  cppDecl (genStrandPrint strand);
630                  List.app cppDecl (List.rev (!topDecls));                  List.app cppDecl (List.rev (!topDecls));
631                  cppDecl (genGlobalBuffersArgs imgGlobals);                  cppDecl (genGlobalBuffersArgs imgGlobals);
# Line 711  Line 708 
708                val fName = concat[name, "_", methName]                val fName = concat[name, "_", methName]
709                val params = [                val params = [
710                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
711                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut")                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
712                                                             CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.globalsTy)), RN.globalsVarName)
713                      ]                      ]
714                val methFn = CL.D_Func([], CL.int32, fName, params, body)                val methFn = CL.D_Func([], CL.int32, fName, params, body)
715                in                in

Legend:
Removed from v.1315  
changed lines
  Added in v.1322

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