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 { |
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 @ [ |
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 |
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") |
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 |
|
|
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 |
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.#||, |
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) |
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 |
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 *) |
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); |
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 |