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 1316, Sat Jun 11 22:45:44 2011 UTC
# Line 232  Line 232 
232    
233        (* register the global initialization part of a program *)        (* register the global initialization part of a program *)
234          fun init (Prog{topDecls, ...}, init) = let          fun init (Prog{topDecls, ...}, init) = let
235                                      val globalsDecl = CL.mkAssign(CL.E_Var RN.globalsVarName,
236                        CL.mkApply("malloc", [CL.mkApply("sizeof",[CL.mkVar RN.globalsTy])]))
237    
238                  val initGlobalsCall = CL.mkCall(RN.initGlobalsHelper,[])
239    
240                val initFn = CL.D_Func(                val initFn = CL.D_Func(
241                      [], CL.voidTy, RN.initGlobals, [CL.PARAM([], globPtrTy, RN.globalsVarName)],                      [], CL.voidTy, RN.initGlobals, [],
242                        CL.mkBlock([globalsDecl,initGlobalsCall]))
243                  val initFn_helper = CL.D_Func(
244                        [], CL.voidTy, RN.initGlobalsHelper, [],
245                      init)                      init)
246                val shutdownFn = CL.D_Func(                val shutdownFn = CL.D_Func(
247                      [], CL.voidTy, RN.shutdown,                      [], CL.voidTy, RN.shutdown,
248                      [CL.PARAM([], CL.T_Ptr(CL.T_Named RN.worldTy), "wrld")],                      [CL.PARAM([], CL.T_Ptr(CL.T_Named RN.worldTy), "wrld")],
249                      CL.S_Block[])                      CL.S_Block[])
250                in                in
251                  topDecls := shutdownFn :: initFn :: !topDecls                  topDecls := shutdownFn :: initFn :: initFn_helper :: !topDecls
252                end                end
253           (* create and register the initially function for a program *)           (* create and register the initially function for a program *)
254          fun initially {          fun initially {
# Line 282  Line 290 
290                              CL.E_Var "size"                              CL.E_Var "size"
291                            ]))))                            ]))))
292                      ]                      ]
293              (* create the loop nest for the initially iterations *)              (* create the loop nest for the initially iterations
294                val indexVar = "ix"                val indexVar = "ix"
295                val strandTy = CL.T_Ptr(CL.T_Named(N.strandTy name))                val strandTy = CL.T_Ptr(CL.T_Named(N.strandTy name))
296                fun mkLoopNest [] = CL.mkBlock(createPrefix @ [                fun mkLoopNest [] = CL.mkBlock(createPrefix @ [
# Line 307  Line 315 
315                        CL.mkComment["initially"],                        CL.mkComment["initially"],
316                        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)))),
317                        mkLoopNest iters                        mkLoopNest iters
318                      ]                      ] *)
319                val body = CL.mkBlock(                val body = CL.mkBlock(
320                      iterPrefix @                      iterPrefix @
321                      allocCode @                      allocCode @
                     iterCode @  
322                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])                      [CL.mkReturn(SOME(CL.E_Var "wrld"))])
323                val initFn = CL.D_Func([], worldTy, N.initially, [CL.PARAM([], globPtrTy, RN.globalsVarName)], body)                val initFn = CL.D_Func([], worldTy, N.initially, [], body)
324                in                in
325                  initially := initFn                  initially := initFn
326                end                end
# Line 446  Line 453 
453                val errVar = "err"                val errVar = "err"
454                val imgDataSizeVar = "image_dataSize"                val imgDataSizeVar = "image_dataSize"
455                val params = [                val params = [
                       CL.PARAM([], globPtrTy, RN.globalsVarName),  
456                        CL.PARAM([],CL.T_Named("cl_context"), "context"),                        CL.PARAM([],CL.T_Named("cl_context"), "context"),
457                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),
458                        CL.PARAM([],CL.T_Named("int"), "argStart")                        CL.PARAM([],CL.T_Named("int"), "argStart")
# Line 457  Line 463 
463                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)))
464                      :: clGlobalBuffers @ clGlobalArguments                      :: clGlobalBuffers @ clGlobalArguments
465                in                in
 (* FIXME: we ought to check the error condition! *)  
466                  CL.D_Func([],CL.voidTy,RN.globalsSetupName,params,CL.mkBlock(body))                  CL.D_Func([],CL.voidTy,RN.globalsSetupName,params,CL.mkBlock(body))
467                end                end
468    
# Line 470  Line 475 
475            | genKeneralGlobalParams [] = []            | genKeneralGlobalParams [] = []
476    
477        (*generate code for intilizing kernel global data *)        (*generate code for intilizing kernel global data *)
         fun initKernelGlobals (globals, imgGlobals) = let  
478  (* 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 [] = []  
479                fun initGlobalImages ((name, tyname)::rest) =                fun initGlobalImages ((name, tyname)::rest) =
480                      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)) ::
481                      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)) ::
482                      initGlobalImages rest                      initGlobalImages rest
483                    | initGlobalImages [] = []                    | initGlobalImages [] = []
484                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))));
626  (* FIXME: I don't think that the following is necessary, since we have the global struct. [jhr]  
                 genGlobals (cppDecl, #hostTy, !globals);  
 *)  
627                  cppDecl (genGlobalStruct (#hostTy, !globals));                  cppDecl (genGlobalStruct (#hostTy, !globals));
628                    cppDecl (CL.D_Var(["static"], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName, NONE));
629                  cppDecl (genStrandTyDef (#hostTy, strand));                  cppDecl (genStrandTyDef (#hostTy, strand));
                 cppDecl  (!init_code);  
630                  cppDecl (genStrandPrint strand);                  cppDecl (genStrandPrint strand);
631                  List.app cppDecl (List.rev (!topDecls));                  List.app cppDecl (List.rev (!topDecls));
632                  cppDecl (genGlobalBuffersArgs imgGlobals);                  cppDecl (genGlobalBuffersArgs imgGlobals);
# Line 711  Line 709 
709                val fName = concat[name, "_", methName]                val fName = concat[name, "_", methName]
710                val params = [                val params = [
711                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
712                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut")                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
713                                                             CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.globalsTy)), RN.globalsVarName)
714                      ]                      ]
715                val methFn = CL.D_Func([], CL.int32, fName, params, body)                val methFn = CL.D_Func([], CL.int32, fName, params, body)
716                in                in

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

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