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

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/target-cpu/fragments/seq-sarr-dual.in
ViewVC logotype

Annotation of /branches/vis15/src/compiler/target-cpu/fragments/seq-sarr-dual.in

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4631 - (view) (download)

1 : jhr 4631 // forward declarations of strand methods
2 : jhr 4501 #ifdef DIDEROT_HAS_START_METHOD
3 :     static diderot::strand_status @STRAND@_start (@START_PARAMS@
4 :     @STRAND@_local *selfLocal, @STRAND@_shared *selfIn, @STRAND@_shared *selfOut);
5 :     #endif // DIDEROT_HAS_START_METHOD
6 :     static diderot::strand_status @STRAND@_update (@UPDATE_PARAMS@
7 :     @STRAND@_local *selfLocal, @STRAND@_shared *selfIn, @STRAND@_shared *selfOut);
8 :     #ifdef DIDEROT_HAS_STABILIZE_METHOD
9 :     static void @STRAND@_stabilize (@STABILIZE_PARAMS@
10 :     @STRAND@_local *selfLocal, @STRAND@_shared *selfIn, @STRAND@_shared *selfOut);
11 :     #endif // DIDEROT_HAS_STABILIZE_METHOD
12 :    
13 : jhr 4460 // strand_array for BSP/DUAL STATE/DIRECT ACCESS
14 :     //
15 :     struct strand_array {
16 : jhr 4516 typedef @STRANDTY@ strand_t;
17 : jhr 4460 typedef uint32_t index_t;
18 : jhr 4591 typedef index_t sid_t; // strand ID (index into strand-state storage)
19 : jhr 4460
20 : jhr 4575 uint8_t *_status; // the array of status information for the strands
21 :     char *_storage; // points to array of @STRANDTY@ structs
22 : jhr 4516 uint32_t _inIdx; // index of shared input state (either 0 or 1)
23 : jhr 4575 uint32_t _nItems; // number of items in the _storage and _status arrays
24 :     uint32_t _nStable; // stable strands (in locations 0.._nStable-1)
25 :     uint32_t _nActive; // active strands (in locations _nStable.._nStable+_nActive-1)
26 : jhr 4460
27 : jhr 4515 strand_array () : _status(nullptr), _storage(nullptr), _nItems(0) { }
28 : jhr 4551 ~strand_array ();
29 : jhr 4515
30 : jhr 4516 uint32_t in_state_index () const { return this->_inIdx; }
31 :    
32 : jhr 4515 uint32_t num_active () const { return this->_nActive; }
33 : jhr 4609 uint32_t current_active () const { return this->_nActive; }
34 : jhr 4515 uint32_t num_stable () const { return this->_nStable; }
35 :     uint32_t num_alive () const { return this->_nActive+this->_nStable; }
36 :    
37 : jhr 4590 // return the ID of a strand, which is the same as the ix index
38 :     sid_t id (index_t ix) const
39 :     {
40 : jhr 4591 assert (ix < this->_nItems);
41 :     return ix;
42 : jhr 4590 }
43 :     // return a pointer to the strand with the given ID
44 :     @STRANDTY@ *id_to_strand (sid_t id) const
45 :     {
46 : jhr 4591 assert (id < this->_nItems);
47 : jhr 4590 return reinterpret_cast<@STRANDTY@ *>(this->_storage + id * sizeof(@STRANDTY@));
48 :     }
49 :    
50 : jhr 4575 // return a strand's status
51 :     diderot::strand_status status (index_t ix) const
52 :     {
53 : jhr 4582 assert (ix < this->_nItems);
54 : jhr 4575 return static_cast<diderot::strand_status>(this->_status[ix]);
55 :     }
56 : jhr 4460 // return a pointer to the given strand
57 :     @STRANDTY@ *strand (index_t ix) const
58 :     {
59 : jhr 4591 return this->id_to_strand(this->id(ix));
60 : jhr 4460 }
61 :    
62 : jhr 4489 // return a pointer to the local state of strand ix
63 : jhr 4460 @STRAND@_local *local_state (index_t ix) const
64 :     {
65 : jhr 4582 return &(this->strand(ix)->_local);
66 : jhr 4460 }
67 : jhr 4590 // return a pointer to the local state of strand with the given ID
68 :     @STRAND@_local *id_to_local_state (sid_t id) const
69 :     {
70 :     return &(this->id_to_strand(id)->_local);
71 :     }
72 : jhr 4460 // return a pointer to the in-state of strand ix
73 :     const @STRAND@_shared *in_state (index_t ix) const
74 :     {
75 : jhr 4582 return &(this->strand(ix)->_shared[this->_inIdx]);
76 : jhr 4460 }
77 : jhr 4631 // return a pointer to the in-state of the strand with the given ID
78 :     const @STRAND@_shared *id_to_in_state (sid_t id) const
79 :     {
80 :     return &(this->id_to_strand(id)->_shared[this->_inIdx]);
81 :     }
82 : jhr 4460 // return a pointer to the out-state of strand ix
83 :     @STRAND@_shared *out_state (index_t ix) const
84 :     {
85 : jhr 4582 return &(this->strand(ix)->_shared[this->_inIdx ^ 1]);
86 : jhr 4460 }
87 :    
88 :     // allocate space for nItems
89 :     bool alloc (uint32_t nItems)
90 :     {
91 : jhr 4575 this->_storage = static_cast<char *>(std::malloc (nItems * sizeof(@STRANDTY@)));
92 :     if (this->_storage == nullptr) {
93 :     return true;
94 :     }
95 :     this->_status = static_cast<uint8_t *>(std::malloc (nItems * sizeof(uint8_t)));
96 :     if (this->_status == nullptr) {
97 :     std::free (this->_storage);
98 :     return true;
99 :     }
100 :     this->_inIdx = 0;
101 :     this->_nItems = nItems;
102 :     this->_nActive = 0;
103 :     this->_nStable = 0;
104 :     return false;
105 : jhr 4460 }
106 :    
107 :     // initialize the first nStrands locations as new active strands
108 :     void create_strands (uint32_t nStrands)
109 :     {
110 : jhr 4575 assert (this->_nActive == 0);
111 :     assert (this->_nItems == nStrands);
112 : jhr 4582
113 :     for (index_t ix = 0; ix < nStrands; ix++) {
114 : jhr 4575 this->_status[ix] = diderot::kActive;
115 : jhr 4582 new (this->strand(ix)) @STRANDTY@;
116 : jhr 4575 }
117 : jhr 4582
118 : jhr 4575 this->_nActive = nStrands;
119 : jhr 4460 }
120 :    
121 :     // swap in and out states
122 :     void swap ()
123 :     {
124 : jhr 4582 this->_inIdx ^= 1;
125 : jhr 4460 }
126 :    
127 : jhr 4501 #ifdef DIDEROT_HAS_START_METHOD
128 :     // invoke strand's start method
129 :     diderot::strand_status strand_start (@START_PARAMS@index_t ix)
130 : jhr 4460 {
131 : jhr 4582 @STRANDTY@ *self = this->strand(ix);
132 : jhr 4575 return @STRAND@_start (@START_ARGS@
133 : jhr 4582 &self->_local,
134 :     &self->_shared[this->_inIdx],
135 :     &self->_shared[this->_inIdx^1]);
136 : jhr 4460 }
137 : jhr 4501 #endif // DIDEROT_HAS_START_METHOD
138 : jhr 4460
139 : jhr 4501 // invoke strand's update method
140 :     diderot::strand_status strand_update (@UPDATE_PARAMS@index_t ix)
141 :     {
142 : jhr 4582 @STRANDTY@ *self = this->strand(ix);
143 : jhr 4575 return @STRAND@_update (@UPDATE_ARGS@
144 : jhr 4582 &self->_local,
145 :     &self->_shared[this->_inIdx],
146 :     &self->_shared[this->_inIdx^1]);
147 : jhr 4501 }
148 :    
149 :     // invoke strand's stabilize method
150 : jhr 4580 index_t strand_stabilize (@STABILIZE_PARAMS@index_t ix)
151 : jhr 4501 {
152 : jhr 4582 @STRANDTY@ *self = this->strand(ix);
153 :     @STRAND@_shared *selfIn = &self->_shared[this->_inIdx];
154 :     @STRAND@_shared *selfOut = &self->_shared[this->_inIdx^1];
155 : jhr 4501 #ifdef DIDEROT_HAS_STABILIZE_METHOD
156 : jhr 4582 // note that we swap out and in here because out holds the current state
157 :     @STRAND@_stabilize (@STABILIZE_ARGS@&self->_local, selfOut, selfIn);
158 :     std::memcpy (selfOut, selfIn, sizeof(@STRAND@_shared));
159 :     #else
160 :     std::memcpy (selfIn, selfOut, sizeof(@STRAND@_shared));
161 : jhr 4501 #endif // DIDEROT_HAS_STABILIZE_METHOD
162 : jhr 4575 this->_status[ix] = diderot::kStable;
163 :     this->_nActive--;
164 :     this->_nStable++;
165 : jhr 4582 return ix+1;
166 : jhr 4501 }
167 :    
168 : jhr 4582 #ifdef DIDEROT_HAS_STRAND_DIE
169 :     #error seq-sarr-dual for program with "die"
170 :     #endif
171 :    
172 : jhr 4516 // finish a step (NOP)
173 :     void finish_step ()
174 :     {
175 :     }
176 :    
177 : jhr 4515 // iterator over alive (active+stable) strands
178 : jhr 4582 index_t begin_alive () const { return 0; }
179 : jhr 4515 index_t end_alive () const { return this->_nItems; }
180 : jhr 4582 index_t next_alive (index_t &ix) const { return ++ix; }
181 : jhr 4515
182 :     // iterator over active strands
183 : jhr 4575 index_t begin_active () const
184 :     {
185 :     index_t ix = 0;
186 :     while ((ix < this->_nItems) && (this->_status[ix] != diderot::kActive)) {
187 :     ix++;
188 :     }
189 :     return ix;
190 :     }
191 : jhr 4515 index_t end_active () const { return this->_nItems; }
192 : jhr 4518 index_t next_active (index_t &ix) const
193 : jhr 4515 {
194 :     ix++;
195 :     while ((ix < this->_nItems) && (this->_status[ix] != diderot::kActive)) {
196 :     ix++;
197 :     }
198 :     return ix;
199 :     }
200 :    
201 :     // iterator over stable strands
202 : jhr 4575 index_t begin_stable () const
203 :     {
204 :     index_t ix = 0;
205 :     while ((ix < this->_nItems) && (this->_status[ix] != diderot::kStable)) {
206 :     ix++;
207 :     }
208 :     return ix;
209 :     }
210 : jhr 4515 index_t end_stable () const { return this->_nItems; }
211 : jhr 4518 index_t next_stable (index_t &ix) const
212 : jhr 4515 {
213 :     ix++;
214 :     while ((ix < this->_nItems) && (this->_status[ix] != diderot::kStable)) {
215 :     ix++;
216 :     }
217 :     return ix;
218 :     }
219 :    
220 : jhr 4460 }; // struct strand_array
221 : jhr 4551
222 :     strand_array::~strand_array ()
223 :     {
224 :     // run destructors to reclaim any dynamic memory attached to the strand state
225 :     for (auto ix = this->begin_alive(); ix != this->end_alive(); ix = this->next_alive(ix)) {
226 : jhr 4575 this->strand(ix)->~@STRANDTY@();
227 : jhr 4551 }
228 :     if (this->_status != nullptr) std::free (this->_status);
229 :     if (this->_storage != nullptr) std::free (this->_storage);
230 :     }

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