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 2715, Mon Sep 22 13:37:35 2014 UTC revision 2716, Mon Sep 22 15:58:45 2014 UTC
# Line 475  Line 475 
475                  selfTyDef :: List.rev (desc :: !code)                  selfTyDef :: List.rev (desc :: !code)
476                end                end
477    
478          fun genGlobalStruct (projTy : global_var -> CL.ty) (props : props, globals) =          local
479              fun genField (projTy : global_var -> CL.ty) gv = (projTy gv, #name gv)
480            in
481          (* generate a C struct definition that describes the GPU representation of the globals *)
482            fun genGlobalShadowStruct [] = []
483              | genGlobalShadowStruct globals = [
484                    CL.D_StructDef(
485                      NONE,
486                      List.map (genField #cTy) globals,
487                      SOME(CLN.shadowGlobalsTy))
488                  ]
489          (* generate an OpenCL struct definition for the globals *)
490            fun genGlobalStruct [] = []
491              | genGlobalStruct globals = [
492                CL.D_StructDef(                CL.D_StructDef(
493                  NONE,                  NONE,
494                  List.map (fn gv => (projTy gv, #name gv)) globals,                    List.map (genField #oclTy) globals,
495                  SOME(#namespace props ^ "Globals_t"))                    SOME(CLN.globalsTy))
496                  ]
497            end (* local *)
498    
499    (* FIXME: this function needs to be split into two: one for C and one for OpenCL *)
500        (* generate the struct declaration for the world representation *)        (* generate the struct declaration for the world representation *)
501          fun genWorldStruct (props, Strand{tyName, ...}) = let          fun genWorldStruct (Prog{props, globals, ...}, Strand{tyName, ...}) = let
502                val extras = [                val extras = if Properties.dualState props
503                      (* target-specific world components *)                      then [
                       (CL.T_Ptr(CL.T_Named(N.globalsTy props)), "globals"),  
                       (CL.T_Ptr CL.uint8,                       "status"),  
504                        (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),   "inState"),                        (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),   "inState"),
505                        (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),   "outState")                        (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),   "outState")
506                      ]                      ]
507                        else [
508                            (CL.T_Ptr(CL.T_Named tyName),           "state")
509                          ]
510                  val extras = if null(!globals)
511                        then extras
512                        else (CL.T_Ptr(CL.T_Named(CLN.globalsTy)), "globals") :: extras
513                  val extras = (CL.T_Ptr CL.uint8, "status") :: extras
514                val extras = if #exec props                val extras = if #exec props
515                      then extras                      then extras
516                      else (CL.T_Named(N.definedInpTy props), "definedInp") :: extras                      else (CL.T_Named(N.definedInpTy props), "definedInp") :: extras
# Line 553  Line 574 
574                  if Properties.dualState props                  if Properties.dualState props
575                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])
576                    else ();                    else ();
577                (* if there are no globals, then define a dummy type *)                (* type definitions *)
578                  if List.null(!globals)                  List.app ppDecl (genGlobalStruct (!globals));
579                    then ppDecl (CL.D_Verbatim["typedef void ", CLN.globalsTy, ";\n"])                  ppDecl (genWorldStruct(prog, strand));
                   else ();  
580                (* Specialize the scheduler kernels and functions *)                (* Specialize the scheduler kernels and functions *)
581                  ppDecl (CL.D_Verbatim[CLSchedFrag.text]);                  ppDecl (CL.D_Verbatim[CLSchedFrag.text]);
582  (* FIXME: should only include eigen code fragments if they are being used! *)  (* FIXME: should only include eigen code fragments if they are being used! *)
583                  ppDecl (CL.D_Verbatim[CLEigen2x2Frag.text]);                  ppDecl (CL.D_Verbatim[CLEigen2x2Frag.text]);
584  (* FIXME: should only include eigen code fragments if they are being used! *)  (* FIXME: should only include eigen code fragments if they are being used! *)
585                  ppDecl (CL.D_Verbatim[CLEigen3x3Frag.text]);                  ppDecl (CL.D_Verbatim[CLEigen3x3Frag.text]);
586  (* generate the OpenCL global definition, plus the functions to initialize the globals *)  (* FIXME: generate the functions to initialize the globals *)
                 ppDecl (genGlobalStruct #oclTy (props, !globals));  
                 ppDecl (genWorldStruct(props, strand));  
587                  List.app ppDecl (genStrand strand);                  List.app ppDecl (genStrand strand);
588                  List.app ppDecl outputs                  List.app ppDecl outputs
589                end                end
590    
591          fun outputLibSrc (out : output, Prog{          fun outputLibSrc (out : output, prog as Prog{
592                  props, inputs, globals, topCDecls, strands, nAxes, initially, ...                  props, inputs, globals, topCDecls, strands, nAxes, initially, ...
593                }) = let                }) = let
594                val [strand as Strand{name, tyName, state, output, ...}] = AtomTable.listItems strands                val [strand as Strand{name, tyName, state, output, ...}] = AtomTable.listItems strands
# Line 583  Line 601 
601                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])
602                    else ();                    else ();
603                (* generate the type definitions *)                (* generate the type definitions *)
604                  ppDecl (genGlobalStruct #cTy (props, List.rev(!globals)));                  ppDecl (CL.verbatimDcl [CShadowTypesFrag.text] substitutions);
605                  ppDecl (genWorldStruct(props, strand));                  List.app ppDecl (genGlobalShadowStruct (!globals));
606                    ppDecl (genWorldStruct(prog, strand));
607                  ppDecl (GenInputs.genInputsStruct (props, !inputs));                  ppDecl (GenInputs.genInputsStruct (props, !inputs));
608                (* support code for OpenCL *)                (* support code for OpenCL *)
609                  ppDecl (CL.verbatimDcl [                  ppDecl (CL.verbatimDcl [
# Line 592  Line 611 
611                      CCheckCLStatusFrag.text                      CCheckCLStatusFrag.text
612                    ] substitutions);                    ] substitutions);
613                  List.app ppDecl (GenInputs.genInputFuns(props, !inputs));                  List.app ppDecl (GenInputs.genInputFuns(props, !inputs));
614                  List.app ppDecl (List.rev (!topCDecls));                  List.app ppDecl (!topCDecls);
615                  List.app ppDecl (genStrand strand);                  List.app ppDecl (genStrand strand);
616                  List.app ppDecl outputs;                  List.app ppDecl outputs;
617                  ppStrandTable (#ppStrm out, [strand]);                  ppStrandTable (#ppStrm out, [strand]);
# Line 644  Line 663 
663                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])                    then ppDecl (CL.D_Verbatim ["#define DIDEROT_DUAL_STATE\n"])
664                    else ();                    else ();
665                (* generate the type definitions *)                (* generate the type definitions *)
666                  ppDecl (genGlobalStruct #cTy (props, List.rev(!globals)));                  ppDecl (CL.verbatimDcl [CShadowTypesFrag.text] substitutions);
667                  ppDecl (genWorldStruct(props, strand));                  List.app ppDecl (genGlobalShadowStruct (!globals));
668                    ppDecl (genWorldStruct(prog, strand));
669                  ppDecl (GenInputs.genInputsStruct (props, !inputs));                  ppDecl (GenInputs.genInputsStruct (props, !inputs));
670                (* support code for OpenCL *)                (* support code for OpenCL *)
671                  ppDecl (CL.verbatimDcl [                  ppDecl (CL.verbatimDcl [
# Line 653  Line 673 
673                      CCheckCLStatusFrag.text                      CCheckCLStatusFrag.text
674                    ] substitutions);                    ] substitutions);
675                  List.app ppDecl (GenInputs.genExecInputFuns (props, !inputs));                  List.app ppDecl (GenInputs.genExecInputFuns (props, !inputs));
676                  List.app ppDecl (List.rev (!topCDecls));                  List.app ppDecl (!topCDecls);
677                  List.app ppDecl (genStrand strand);                  List.app ppDecl (genStrand strand);
678                  List.app ppDecl outputs;                  List.app ppDecl outputs;
679                  ppStrandTable (#ppStrm out, [strand]);                  ppStrandTable (#ppStrm out, [strand]);
# Line 683  Line 703 
703                  RunCC.linkExec (basename, ldFlags props)                  RunCC.linkExec (basename, ldFlags props)
704                end                end
705    
706          fun generate (prog as Prog{props, ...}) = if #exec props          fun generate (prog as Prog{props, globals, topCDecls, ...}) = (
707                  globals := List.rev (!globals);
708                  topCDecls := List.rev (!topCDecls);
709                  if #exec props
710                then generateExec prog                then generateExec prog
711                else generateLib prog                  else generateLib prog)
712    
713        end        end
714    

Legend:
Removed from v.2715  
changed lines
  Added in v.2716

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