Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/target-cpu/gen-global-update.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/target-cpu/gen-global-update.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4518, Mon Sep 5 16:48:58 2016 UTC revision 4519, Mon Sep 5 17:30:22 2016 UTC
# Line 32  Line 32 
32    (* code generation for sequential map-reduce *)    (* code generation for sequential map-reduce *)
33  (*  (*
34      accum = /* reduction identity */;      accum = /* reduction identity */;
35      for (uint32_t id = 0;  id < this->_nstrands;  id++) {      for (auto ix = this->_strands.begin_XXX()
36          S_strand *s = this->_outStrand[id];          ix != this->_strands.end_XXX();
37          diderot::strand_status sts = this->_status[id];          ix = this->_strands.next_XXX(ix))
38        {
39            S_strand *s = this->_strands.strand(ix);
40            diderot::strand_status sts = this->_strands.status(ix);
41          if (/* s in strand set */) {          if (/* s in strand set */) {
42              value = /* map code */              value = /* map code */
43              accum = REDUCE(value, accm);              accum = REDUCE(value, accm);
# Line 68  Line 71 
71                  in                  in
72                    List.foldr mkAcc ([], []) mrs                    List.foldr mkAcc ([], []) mrs
73                  end                  end
74          (* strand ID *)          (* _strands array access *)
75            val id = CodeGenUtil.freshVar "id"            val strands = RN.strandArray env
76            (* strand index *)
77              val ix = CodeGenUtil.freshVar "ix"
78          (* pointer to strand state *)          (* pointer to strand state *)
79            val strand = CodeGenUtil.freshVar "strand"            val strand = CodeGenUtil.freshVar "strand"
80            val strandDcl = let            val strandDcl =
                 val state = if TargetSpec.dualState(Env.target env)  
                       then "_outState"  
                       else "_state"  
                 in  
81                    CL.mkDeclInit(CL.constPtrTy strandTy, strand,                    CL.mkDeclInit(CL.constPtrTy strandTy, strand,
82                      CL.mkAddrOf(CL.mkSubscript(CL.mkIndirect(worldV, state), CL.mkVar id)))                    CL.mkDispatch(strands, "strand", [CL.mkVar ix]))
                 end  
83            val env = Env.insert(env, src, strand)            val env = Env.insert(env, src, strand)
84          (* strand status *)          (* strand status *)
85            val status = CodeGenUtil.freshVar "sts"            val status = CodeGenUtil.freshVar "sts"
# Line 87  Line 87 
87                  val stsTy = CL.T_Named "diderot::strand_status"                  val stsTy = CL.T_Named "diderot::strand_status"
88                  in                  in
89                    CL.mkDeclInit(stsTy, status,                    CL.mkDeclInit(stsTy, status,
90                      CL.mkStaticCast(stsTy,                      CL.mkDispatch(strands, "status", [CL.mkVar ix]))
                       CL.mkSubscript(CL.mkIndirect(worldV, "_status"), CL.mkVar id)))  
91                  end                  end
92          (* build the body of the loop *)          (* build the body of the loop *)
93            fun doMR (acc, IR.MapReduce(x, r, f, args, set)) = let            fun doMR (acc, IR.MapReduce(x, r, f, args, set)) = let
# Line 108  Line 107 
107                        end                        end
108                  end                  end
109            val loopBody = strandDcl :: statusDcl :: ListPair.map doMR (accs, mrs)            val loopBody = strandDcl :: statusDcl :: ListPair.map doMR (accs, mrs)
110              val {begin, stop, next} = let
111                    val suffix = (case srcSet
112                           of StrandSets.ACTIVE => "active"
113                            | StrandSets.STABLE => "stable"
114                            | StrandSets.ALL => "alive"
115                          (* end case *))
116                    in {
117                      begin = CL.mkDispatch(strands, "begin_"^suffix, []),
118                      stop = CL.mkDispatch(strands, "end_"^suffix, []),
119                      next = CL.mkDispatch(strands, "next_"^suffix, [CL.mkVar ix])
120                    } end
121            val loopStm = CL.mkFor(            val loopStm = CL.mkFor(
122                  CL.uint32, [(id, CL.mkInt 0)],                  CL.autoTy, [(ix, begin)],
123                  CL.mkBinOp(CL.mkVar id, CL.#<, CL.mkIndirect(worldV, "_nstrands")),                  CL.mkBinOp(CL.mkVar ix, CL.#!=, stop),
124                  [CL.mkUnOp(CL.%++, CL.mkVar id)],                  [CL.mkAssignOp(CL.mkVar ix, CL.$=, next)],
125                  CL.mkBlock loopBody)                  CL.mkBlock loopBody)
126            in            in
127              (env, loopStm :: List.revAppend(accDcls, stms))              (env, loopStm :: List.revAppend(accDcls, stms))

Legend:
Removed from v.4518  
changed lines
  Added in v.4519

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