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 1340, Mon Jun 13 19:57:19 2011 UTC revision 1341, Tue Jun 14 07:05:07 2011 UTC
# Line 280  Line 280 
280                        CL.mkDecl(CL.T_Array(CL.int32, SOME nDims), "base", SOME(CL.I_Array baseInit)),                        CL.mkDecl(CL.T_Array(CL.int32, SOME nDims), "base", SOME(CL.I_Array baseInit)),
281                        CL.mkDecl(CL.T_Array(CL.uint32, SOME nDims), "size", SOME(CL.I_Array sizeInit)),                        CL.mkDecl(CL.T_Array(CL.uint32, SOME nDims), "size", SOME(CL.I_Array sizeInit)),
282                        CL.mkDecl(worldTy, wrld,                        CL.mkDecl(worldTy, wrld,
283                          SOME(CL.I_Exp(CL.E_Apply(N.allocInitially, [                          SOME(CL.I_Exp(CL.E_Apply(RN.allocInitially, [
284                              CL.mkVar "ProgramName",                              CL.mkVar "ProgramName",
285                              CL.mkUnOp(CL.%&, CL.E_Var(N.strandDesc name)),                              CL.mkUnOp(CL.%&, CL.E_Var(N.strandDesc name)),
286                                                                             CL.mkApply("sizeof",[CL.E_Var (N.strandTy name)]),
287                              CL.E_Bool isArray,                              CL.E_Bool isArray,
288                              CL.E_Int(IntInf.fromInt nDims, CL.int32),                              CL.E_Int(IntInf.fromInt nDims, CL.int32),
289                              CL.E_Var "base",                              CL.E_Var "base",
# Line 375  Line 376 
376    
377        (* generates the opencl buffers for the image data *)        (* generates the opencl buffers for the image data *)
378          fun getGlobalDataBuffers (globals,contextVar,errVar) = let          fun getGlobalDataBuffers (globals,contextVar,errVar) = let
379                                      val globalBuffErr = "error creating OpenCL global buffer"
380                                     fun errorFn msg = CL.mkIfThen(CL.mkBinOp(CL.E_Var errVar, CL.#!=, CL.E_Var "CL_SUCCESS"),
381                                                                                                     CL.mkBlock([CL.mkCall("fprintf",[CL.E_Var "stderr", CL.E_Str msg]),
382                                                                                                                                     CL.mkCall("exit",[CL.mkInt 1])]))
383                val globalBufferDecl =  CL.mkDecl(clMemoryTy,concat[RN.globalsVarName,"_cl"],NONE)                val globalBufferDecl =  CL.mkDecl(clMemoryTy,concat[RN.globalsVarName,"_cl"],NONE)
384                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),                val globalBuffer = CL.mkAssign(CL.mkVar(concat[RN.globalsVarName,"_cl"]),
385                      CL.mkApply("clCreateBuffer", [                      CL.mkApply("clCreateBuffer", [
# Line 384  Line 389 
389                          CL.mkVar RN.globalsVarName,                          CL.mkVar RN.globalsVarName,
390                          CL.mkUnOp(CL.%&,CL.mkVar errVar)                          CL.mkUnOp(CL.%&,CL.mkVar errVar)
391                        ]))                        ]))
392                fun genDataBuffers ([],_,_) = []                fun genDataBuffers ([],_,_,_) = []
393                  | genDataBuffers ((var,nDims)::globals, contextVar, errVar) = let                  | genDataBuffers ((var,nDims)::globals, contextVar, errVar,errFn) = let
394                      val hostVar = CL.mkIndirect(CL.mkVar RN.globalsVarName, var)                      val hostVar = CL.mkIndirect(CL.mkVar RN.globalsVarName, var)
395  (* FIXME: use CL constructors to build expressions (not strings) *)  (* FIXME: use CL constructors to build expressions (not strings) *)
396                      fun sizeExp i = CL.mkSubscript(CL.mkIndirect(hostVar, "size"), CL.mkInt i)                      fun sizeExp i = CL.mkSubscript(CL.mkIndirect(hostVar, "size"), CL.mkInt i)
# Line 406  Line 411 
411                              CL.mkApply("sizeof",[CL.mkVar (RN.imageTy nDims)]),                              CL.mkApply("sizeof",[CL.mkVar (RN.imageTy nDims)]),
412                              hostVar,                              hostVar,
413                              CL.mkUnOp(CL.%&,CL.mkVar errVar)                              CL.mkUnOp(CL.%&,CL.mkVar errVar)
414                            ])) ::                            ])) :: errFn(concat["error in creating ",RN.addBufferSuffix var, " global buffer"]) ::
415                        CL.mkAssign(CL.mkVar(RN.addBufferSuffixData var),                        CL.mkAssign(CL.mkVar(RN.addBufferSuffixData var),
416                          CL.mkApply("clCreateBuffer", [                          CL.mkApply("clCreateBuffer", [
417                              CL.mkVar contextVar,                              CL.mkVar contextVar,
# Line 414  Line 419 
419                              size,                              size,
420                              CL.mkIndirect(hostVar, "data"),                              CL.mkIndirect(hostVar, "data"),
421                              CL.mkUnOp(CL.%&,CL.mkVar errVar)                              CL.mkUnOp(CL.%&,CL.mkVar errVar)
422                            ])) :: genDataBuffers(globals,contextVar,errVar)                            ])) :: errFn(concat["error in creating ",RN.addBufferSuffixData var, " global buffer"]) :: genDataBuffers(globals,contextVar,errVar,errFn)
423                      end                      end
424                in                in
425                  globalBufferDecl :: globalBuffer :: genDataBuffers(globals,contextVar,errVar)                  [globalBufferDecl] @ [globalBuffer,errorFn(globalBuffErr)] @ genDataBuffers(globals,contextVar,errVar,errorFn)
426                end                end
427    
428        (* generates the kernel arguments for the image data *)        (* generates the kernel arguments for the image data *)
429          fun genGlobalArguments (globals, count, kernelVar, errVar) = let          fun genGlobalArguments (globals, count, kernelVar, errVar) = let
430                                     val globalArgErr = "error creating OpenCL global argument"
431                                     fun errorFn msg = CL.mkIfThen(CL.mkBinOp(CL.E_Var errVar, CL.#!=, CL.E_Var "CL_SUCCESS"),
432                                                                                                     CL.mkBlock([CL.mkCall("fprintf",[CL.E_Var "stderr", CL.E_Str msg]),
433                                                                                                                                     CL.mkCall("exit",[CL.mkInt 1])]))
434                val globalArgument = CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.|=,                val globalArgument = CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.|=,
435                      CL.mkApply("clSetKernelArg",                      CL.mkApply("clSetKernelArg",
436                        [CL.mkVar kernelVar,                        [CL.mkVar kernelVar,
437                         CL.mkPostOp(CL.E_Var count, CL.^++),                         CL.mkPostOp(CL.E_Var count, CL.^++),
438                         CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),                         CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),
439                         CL.mkUnOp(CL.%&,CL.mkVar(concat[RN.globalsVarName,"_cl"]))])))                         CL.mkUnOp(CL.%&,CL.mkVar(concat[RN.globalsVarName,"_cl"]))])))
440                fun genDataArguments ([],_,_,_) = []                fun genDataArguments ([],_,_,_,_) = []
441                  | genDataArguments ((var,nDims)::globals,count,kernelVar,errVar) =                  | genDataArguments ((var,nDims)::globals,count,kernelVar,errVar,errFn) =
442                      CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.|=,                      CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.$=,
443                        CL.mkApply("clSetKernelArg",                        CL.mkApply("clSetKernelArg",
444                          [CL.mkVar kernelVar,                          [CL.mkVar kernelVar,
445                           CL.mkPostOp(CL.E_Var count, CL.^++),                           CL.mkPostOp(CL.E_Var count, CL.^++),
446                           CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),                           CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),
447                           CL.mkUnOp(CL.%&,CL.mkVar(RN.addBufferSuffix var))]))) ::                           CL.mkUnOp(CL.%&,CL.mkVar(RN.addBufferSuffix var))]))) ::
448                      CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.|=,                                                    errFn(concat["error in creating ",RN.addBufferSuffix var, " argument"]) ::
449                        CL.mkExpStm(CL.mkAssignOp(CL.mkVar errVar,CL.$=,
450                        CL.mkApply("clSetKernelArg",                        CL.mkApply("clSetKernelArg",
451                          [CL.mkVar kernelVar,                          [CL.mkVar kernelVar,
452                           CL.mkPostOp(CL.E_Var count, CL.^++),                           CL.mkPostOp(CL.E_Var count, CL.^++),
453                           CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),                           CL.mkApply("sizeof",[CL.mkVar "cl_mem"]),
454                           CL.mkUnOp(CL.%&,CL.mkVar(RN.addBufferSuffixData var))]))) ::                           CL.mkUnOp(CL.%&,CL.mkVar(RN.addBufferSuffixData var))]))) ::
455                      genDataArguments (globals,count,kernelVar,errVar)                                                          errFn(concat["error in creating ",RN.addBufferSuffixData var, " argument"]) ::
456                        genDataArguments (globals,count,kernelVar,errVar,errFn)
457                in                in
458                  globalArgument :: genDataArguments(globals, count, kernelVar, errVar)                 [globalArgument,errorFn(globalArgErr)] @ genDataArguments(globals, count, kernelVar, errVar,errorFn)
459                end                end
460    
461        (* generates the globals buffers and arguments function *)        (* generates the globals buffers and arguments function *)
# Line 455  Line 466 
466                val params = [                val params = [
467                        CL.PARAM([],CL.T_Named("cl_context"), "context"),                        CL.PARAM([],CL.T_Named("cl_context"), "context"),
468                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),                        CL.PARAM([],CL.T_Named("cl_kernel"), "kernel"),
469                                                             CL.PARAM([],CL.T_Named("cl_command_queue"), "cmdQ"),
470                        CL.PARAM([],CL.T_Named("int"), "argStart")                        CL.PARAM([],CL.T_Named("int"), "argStart")
471                      ]                      ]
472                val clGlobalBuffers = getGlobalDataBuffers(!imgGlobals, "context", errVar)                val clGlobalBuffers = getGlobalDataBuffers(!imgGlobals, "context", errVar)
# Line 468  Line 480 
480    
481        (* generate the data and global parameters *)        (* generate the data and global parameters *)
482          fun genKeneralGlobalParams ((name,tyname)::rest) =          fun genKeneralGlobalParams ((name,tyname)::rest) =
483                CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.imageTy tyname)), RN.addBufferSuffix name) ::                CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named (RN.imageTy tyname)), RN.addBufferSuffix name) ::
484                CL.PARAM([], CL.T_Ptr(CL.voidTy), RN.addBufferSuffixData name) ::                CL.PARAM(["__global"], CL.T_Ptr(CL.voidTy), RN.addBufferSuffixData name) ::
485                genKeneralGlobalParams rest                genKeneralGlobalParams rest
486            | genKeneralGlobalParams [] = []            | genKeneralGlobalParams [] = []
487    
# Line 487  Line 499 
499                val fName = RN.kernelFuncName;                val fName = RN.kernelFuncName;
500                val inState = "strand_in"                val inState = "strand_in"
501                val outState = "strand_out"                val outState = "strand_out"
502                                      val tempVar = "tmp"
503                val params = [                val params = [
504                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
505                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
506                        CL.PARAM(["__global"], CL.intTy, "width"),                        CL.PARAM(["__global"], CL.intTy, "width"),
507                        CL.PARAM([], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName)                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named RN.globalsTy), RN.globalsVarName)
508                      ] @ genKeneralGlobalParams(!imgGlobals)                      ] @ genKeneralGlobalParams(!imgGlobals)
509                val thread_ids = if nDims = 1                val thread_ids = if nDims = 1
510                        then [                        then [
# Line 507  Line 520 
520                          ]                          ]
521                      else raise Fail "nDims > 2"                      else raise Fail "nDims > 2"
522                val strandDecl = [                val strandDecl = [
523                        CL.mkDecl(CL.T_Named tyName, inState, NONE),                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), inState, NONE),
524                        CL.mkDecl(CL.T_Named tyName, outState, NONE)                        CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), outState, NONE),
525                                                             CL.mkDecl(CL.T_Ptr(CL.T_Named (concat["__global ",tyName])), tempVar, NONE)
526                      ]                      ]
527                                      val swapStms = [CL.mkAssign(CL.E_Var tempVar, CL.E_Var inState),
528                                                                              CL.mkAssign(CL.E_Var inState, CL.E_Var outState),
529                                                                              CL.mkAssign(CL.E_Var outState, CL.E_Var tempVar)]
530                val strandObjects = if nDims = 1                val strandObjects = if nDims = 1
531                      then [                      then [
532                          CL.mkAssign( CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn", CL.mkStr "x")),                          CL.mkAssign( CL.mkVar inState,  CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfIn", CL.mkStr "x"))),
533                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut", CL.mkStr "x"))                          CL.mkAssign(CL.mkVar outState, CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfOut", CL.mkStr "x")))
534                        ]                        ]
535                      else let                      else let
536                        val index = CL.mkBinOp(                        val index = CL.mkBinOp(
537                              CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")                              CL.mkBinOp(CL.mkVar "x", CL.#*, CL.mkVar "width"), CL.#+, CL.mkVar "y")
538                        in [                        in [
539                          CL.mkAssign(CL.mkVar inState, CL.mkSubscript(CL.mkVar "selfIn",index)),                          CL.mkAssign(CL.mkVar inState,  CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfIn",index))),
540                          CL.mkAssign(CL.mkVar outState,CL.mkSubscript(CL.mkVar "selfOut",index))                          CL.mkAssign(CL.mkVar outState, CL.mkUnOp(CL.%&,CL.mkSubscript(CL.mkVar "selfOut",index)))
541                        ] end                        ] end
542                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)))
543                val strandInitStm = CL.mkCall(RN.strandInit name, [                val strandInitStm = CL.mkCall(RN.strandInit name, [
544                        CL.E_Var RN.globalsVarName,                        CL.E_Var RN.globalsVarName,
545                        CL.mkUnOp(CL.%&, CL.E_Var inState),                        CL.E_Var inState,
546                        CL.E_Var "x",                        CL.E_Var "x",
547  (* FIXME: if nDims = 1, then "y" is not defined! the arguments to this call should really come from  (* FIXME: if nDims = 1, then "y" is not defined! the arguments to this call should really come from
548   * the initially code!   * the initially code!
# Line 538  Line 555 
555                      @ [strandInitStm,status]                      @ [strandInitStm,status]
556                val while_exp = CL.mkBinOp(                val while_exp = CL.mkBinOp(
557                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),                      CL.mkBinOp(CL.mkVar "status",CL.#!=, CL.mkVar RN.kStabilize),
558                      CL.#||,                      CL.#&&,
559                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))                      CL.mkBinOp(CL.mkVar "status", CL.#!=, CL.mkVar RN.kDie))
560                val whileBody = CL.mkBlock [                val whileBody = CL.mkBlock (swapStms @ [
561  (* FIXME: need a barrier synchronization at beginning of loop *)  (* FIXME: need a barrier synchronization at beginning of loop *)
562                        CL.mkAssign(CL.mkVar "status",                        CL.mkAssign(CL.mkVar "status",
563                          CL.mkApply(RN.strandUpdate name,                          CL.mkApply(RN.strandUpdate name,
564                            [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])),                            [CL.mkVar inState, CL.mkVar outState,CL.E_Var RN.globalsVarName]))] )
 (* FIXME: why is there a call to stabilize here? *)  
                       CL.mkCall(RN.strandStabilize name,  
                         [CL.mkUnOp(CL.%&,CL.mkVar inState), CL.mkUnOp(CL.%&,CL.mkVar outState),CL.E_Var RN.globalsVarName])  
                     ]  
565                val whileBlock = [CL.mkWhile(while_exp, whileBody)]                val whileBlock = [CL.mkWhile(while_exp, whileBody)]
566                val body = CL.mkBlock(local_vars @ whileBlock)                val body = CL.mkBlock(local_vars @ whileBlock)
567                in                in
# Line 560  Line 573 
573                in                in
574                  CL.D_StructDef(globs, RN.globalsTy)                  CL.D_StructDef(globs, RN.globalsTy)
575                end                end
576    
577          fun genGlobals (declFn, targetTy, globals) = let          fun genGlobals (declFn, targetTy, globals) = let
578                fun doVar (x : mirror_var) = declFn (CL.D_Var([], targetTy x, #var x, NONE))                fun doVar (x : mirror_var) = declFn (CL.D_Var([], targetTy x, #var x, NONE))
579                in                in
# Line 711  Line 725 
725          fun init (Strand{name, tyName, code, init_code, ...}, params, init) = let          fun init (Strand{name, tyName, code, init_code, ...}, params, init) = let
726                val fName = RN.strandInit name                val fName = RN.strandInit name
727                val params =                val params =
728                      CL.PARAM([], globPtrTy, RN.globalsVarName) ::                      CL.PARAM(["__global"], globPtrTy, RN.globalsVarName) ::
729                      CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut") ::                      CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut") ::
730                        List.map (fn (ToCL.V(ty, x)) => CL.PARAM([], ty, x)) params                        List.map (fn (ToCL.V(ty, x)) => CL.PARAM([], ty, x)) params
731                val initFn = CL.D_Func([], CL.voidTy, fName, params, init)                val initFn = CL.D_Func([], CL.voidTy, fName, params, init)
732                in                in
# Line 723  Line 737 
737          fun method (Strand{name, tyName, code,...}, methName, body) = let          fun method (Strand{name, tyName, code,...}, methName, body) = let
738                val fName = concat[name, "_", methName]                val fName = concat[name, "_", methName]
739                val params = [                val params = [
740                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
741                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut"),                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named tyName), "selfOut"),
742                        CL.PARAM([], CL.T_Ptr(CL.T_Named (RN.globalsTy)), RN.globalsVarName)                        CL.PARAM(["__global"], CL.T_Ptr(CL.T_Named (RN.globalsTy)), RN.globalsVarName)
743                      ]                      ]
744                val methFn = CL.D_Func([], CL.int32, fName, params, body)                val methFn = CL.D_Func([], CL.int32, fName, params, body)
745                in                in

Legend:
Removed from v.1340  
changed lines
  Added in v.1341

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