| rev |
line source |
|
seanhalle@0
|
1 /*
|
|
seanhalle@0
|
2 * Copyright 2009 OpenSourceStewardshipFoundation.org
|
|
seanhalle@0
|
3 * Licensed under GNU General Public License version 2
|
|
seanhalle@0
|
4 *
|
|
seanhalle@0
|
5 * Author: seanhalle@yahoo.com
|
|
seanhalle@0
|
6 *
|
|
seanhalle@0
|
7 */
|
|
seanhalle@0
|
8
|
|
seanhalle@2
|
9 #ifndef _VSs_H
|
|
seanhalle@2
|
10 #define _VSs_H
|
|
seanhalle@0
|
11
|
|
seanhalle@0
|
12 #include "Queue_impl/PrivateQueue.h"
|
|
seanhalle@0
|
13 #include "Hash_impl/PrivateHash.h"
|
|
seanhalle@0
|
14 #include "VMS_impl/VMS.h"
|
|
seanhalle@3
|
15 #include "Measurement/dependency.h"
|
|
seanhalle@0
|
16
|
|
seanhalle@0
|
17
|
|
seanhalle@0
|
18 //===========================================================================
|
|
seanhalle@0
|
19 #define NUM_STRUCS_IN_SEM_ENV 1000
|
|
seanhalle@0
|
20
|
|
seanhalle@0
|
21 //This is hardware dependent -- it's the number of cycles of scheduling
|
|
seanhalle@0
|
22 // overhead -- if a work unit is fewer than this, it is better being
|
|
seanhalle@0
|
23 // combined sequentially with other work
|
|
seanhalle@2
|
24 //This value depends on both VMS overhead and VSs's plugin. At some point
|
|
seanhalle@2
|
25 // it will be derived by perf-counter measurements during init of VSs
|
|
seanhalle@0
|
26 #define MIN_WORK_UNIT_CYCLES 20000
|
|
seanhalle@0
|
27
|
|
seanhalle@0
|
28 //===========================================================================
|
|
seanhalle@2
|
29 /*This header defines everything specific to the VSs semantic plug-in
|
|
seanhalle@0
|
30 */
|
|
seanhalle@2
|
31 typedef struct _VSsSemReq VSsSemReq;
|
|
seanhalle@3
|
32 typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *);
|
|
seanhalle@2
|
33 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
|
|
seanhalle@0
|
34 //===========================================================================
|
|
seanhalle@0
|
35
|
|
seanhalle@4
|
36 #define NONCTLD 0
|
|
seanhalle@4
|
37 #define IN 1 /*Trick -- READER same as IN*/
|
|
seanhalle@4
|
38 #define OUT 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@4
|
39 #define INOUT 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@2
|
40
|
|
seanhalle@4
|
41 #define READER 1 /*Trick -- READER same as IN*/
|
|
seanhalle@4
|
42 #define WRITER 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@1
|
43
|
|
seanhalle@1
|
44 typedef struct
|
|
seanhalle@1
|
45 {
|
|
seanhalle@1
|
46 VSsTaskFnPtr fn;
|
|
seanhalle@2
|
47 int32 numTotalArgs;//the number of inputs to function
|
|
seanhalle@2
|
48 int32 numCtldArgs;//how many of args have dependencies
|
|
seanhalle@2
|
49 int32 *argTypes; //says reader, writer, or non-ctld
|
|
seanhalle@2
|
50 int32 *argSizes; //for detecting overlap
|
|
seanhalle@2
|
51 int32 sizeOfArgs; //for memcpy of args struct
|
|
seanhalle@1
|
52 }
|
|
seanhalle@1
|
53 VSsTaskType;
|
|
seanhalle@1
|
54
|
|
seanhalle@1
|
55
|
|
seanhalle@2
|
56 typedef struct
|
|
seanhalle@2
|
57 {
|
|
seanhalle@3
|
58 bool32 hasEnabledNonFinishedWriter;
|
|
seanhalle@3
|
59 int32 numEnabledNonDoneReaders;
|
|
seanhalle@3
|
60 PrivQueueStruc *waitersQ;
|
|
seanhalle@3
|
61 }
|
|
seanhalle@3
|
62 VSsPointerEntry;
|
|
seanhalle@3
|
63
|
|
seanhalle@6
|
64 typedef struct
|
|
seanhalle@3
|
65 {
|
|
seanhalle@2
|
66 void **args; //ctld args must come first, as ptrs
|
|
seanhalle@2
|
67 VSsTaskType *taskType;
|
|
seanhalle@4
|
68 int32 *taskID;
|
|
seanhalle@2
|
69 int32 numBlockingProp;
|
|
seanhalle@2
|
70 SlaveVP *slaveAssignedTo;
|
|
seanhalle@3
|
71 VSsPointerEntry **ptrEntries;
|
|
nengel@5
|
72 void* parent;
|
|
nengel@5
|
73 bool32 parentIsTask;
|
|
nengel@5
|
74 int32 numChildTasks;
|
|
seanhalle@6
|
75 bool32 isWaiting;
|
|
seanhalle@2
|
76 }
|
|
seanhalle@6
|
77 VSsTaskStub;
|
|
nengel@5
|
78
|
|
seanhalle@6
|
79 typedef struct
|
|
seanhalle@6
|
80 {
|
|
nengel@5
|
81 void* parent;
|
|
nengel@5
|
82 bool32 parentIsTask;
|
|
nengel@5
|
83 int32 numChildTasks;
|
|
nengel@5
|
84 bool32 isWaiting;
|
|
nengel@5
|
85 SlaveVP *slaveAssignedTo;
|
|
seanhalle@6
|
86 }
|
|
seanhalle@6
|
87 VSsThreadInfo;
|
|
seanhalle@2
|
88
|
|
seanhalle@2
|
89 typedef struct
|
|
seanhalle@2
|
90 {
|
|
seanhalle@2
|
91 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
92 int32 argNum;
|
|
seanhalle@2
|
93 int32 isReader;
|
|
seanhalle@2
|
94 }
|
|
seanhalle@2
|
95 VSsTaskStubCarrier;
|
|
seanhalle@2
|
96
|
|
seanhalle@2
|
97
|
|
seanhalle@2
|
98 typedef struct
|
|
seanhalle@2
|
99 {
|
|
seanhalle@2
|
100 int32 type;
|
|
seanhalle@2
|
101 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
102 }
|
|
seanhalle@2
|
103 VSsWaiterCarrier;
|
|
seanhalle@1
|
104
|
|
seanhalle@0
|
105 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@0
|
106 * to request handler called in AnimationMaster
|
|
seanhalle@0
|
107 */
|
|
seanhalle@0
|
108
|
|
seanhalle@0
|
109 typedef struct
|
|
seanhalle@0
|
110 {
|
|
seanhalle@0
|
111 SlaveVP *VPCurrentlyExecuting;
|
|
seanhalle@0
|
112 PrivQueueStruc *waitingVPQ;
|
|
seanhalle@0
|
113 }
|
|
seanhalle@2
|
114 VSsTrans;
|
|
seanhalle@0
|
115
|
|
seanhalle@0
|
116 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
seanhalle@0
|
117 */
|
|
seanhalle@0
|
118 typedef struct
|
|
seanhalle@0
|
119 {
|
|
seanhalle@0
|
120 void *endInstrAddr;
|
|
seanhalle@0
|
121 int32 hasBeenStarted;
|
|
seanhalle@0
|
122 int32 hasFinished;
|
|
seanhalle@0
|
123 PrivQueueStruc *waitQ;
|
|
seanhalle@0
|
124 }
|
|
seanhalle@2
|
125 VSsSingleton;
|
|
seanhalle@0
|
126
|
|
seanhalle@2
|
127 enum VSsReqType
|
|
seanhalle@0
|
128 {
|
|
seanhalle@2
|
129 submit_task = 1,
|
|
seanhalle@2
|
130 end_task,
|
|
seanhalle@2
|
131 create_slave,
|
|
seanhalle@2
|
132 create_slave_w_aff,
|
|
seanhalle@2
|
133 dissipate_slave,
|
|
seanhalle@2
|
134 //===============================
|
|
seanhalle@4
|
135 send_type_to,
|
|
seanhalle@4
|
136 receive_type_to,
|
|
seanhalle@4
|
137 send_from_to,
|
|
seanhalle@4
|
138 receive_from_to,
|
|
seanhalle@4
|
139 //===============================
|
|
nengel@5
|
140 taskwait,
|
|
seanhalle@0
|
141 malloc_req,
|
|
seanhalle@0
|
142 free_req,
|
|
seanhalle@0
|
143 singleton_fn_start,
|
|
seanhalle@0
|
144 singleton_fn_end,
|
|
seanhalle@0
|
145 singleton_data_start,
|
|
seanhalle@0
|
146 singleton_data_end,
|
|
seanhalle@0
|
147 atomic,
|
|
seanhalle@0
|
148 trans_start,
|
|
seanhalle@0
|
149 trans_end
|
|
seanhalle@0
|
150 };
|
|
seanhalle@0
|
151
|
|
seanhalle@2
|
152 struct _VSsSemReq
|
|
seanhalle@2
|
153 { enum VSsReqType reqType;
|
|
seanhalle@2
|
154 SlaveVP *callingSlv;
|
|
seanhalle@2
|
155 VSsTaskType *taskType;
|
|
seanhalle@2
|
156 void *args;
|
|
seanhalle@2
|
157 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
158
|
|
seanhalle@4
|
159 SlaveVP *senderSlv;
|
|
seanhalle@4
|
160 SlaveVP *receiverSlv;
|
|
seanhalle@4
|
161 int32 *senderID;
|
|
seanhalle@4
|
162 int32 *receiverID;
|
|
seanhalle@4
|
163 int32 msgType;
|
|
seanhalle@4
|
164 void *msg;
|
|
seanhalle@4
|
165 VSsSemReq *nextReqInHashEntry;
|
|
seanhalle@4
|
166 int32 *taskID;
|
|
seanhalle@4
|
167
|
|
seanhalle@2
|
168 TopLevelFnPtr fnPtr;
|
|
seanhalle@0
|
169 void *initData;
|
|
seanhalle@0
|
170 int32 coreToAssignOnto;
|
|
seanhalle@0
|
171
|
|
seanhalle@0
|
172 int32 sizeToMalloc;
|
|
seanhalle@0
|
173 void *ptrToFree;
|
|
seanhalle@0
|
174
|
|
seanhalle@0
|
175 int32 singletonID;
|
|
seanhalle@2
|
176 VSsSingleton **singletonPtrAddr;
|
|
seanhalle@0
|
177
|
|
seanhalle@0
|
178 PtrToAtomicFn fnToExecInMaster;
|
|
seanhalle@0
|
179 void *dataForFn;
|
|
seanhalle@0
|
180
|
|
seanhalle@0
|
181 int32 transID;
|
|
seanhalle@0
|
182 }
|
|
seanhalle@2
|
183 /* VSsSemReq */;
|
|
seanhalle@0
|
184
|
|
seanhalle@0
|
185
|
|
seanhalle@0
|
186 typedef struct
|
|
seanhalle@0
|
187 {
|
|
seanhalle@6
|
188 PrivQueueStruc **slavesReadyToResumeQ; //Shared (slaves not pinned)
|
|
seanhalle@6
|
189 PrivQueueStruc **extraTaskSlvQ; //Shared
|
|
seanhalle@6
|
190 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
|
|
seanhalle@6
|
191 SlaveVP *currTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
|
|
seanhalle@2
|
192 HashTable *argPtrHashTbl;
|
|
seanhalle@4
|
193 HashTable *commHashTbl;
|
|
seanhalle@6
|
194 int32 numAdditionalSlvs;
|
|
seanhalle@3
|
195 int32 nextCoreToGetNewSlv;
|
|
seanhalle@0
|
196 int32 primitiveStartTime;
|
|
seanhalle@0
|
197
|
|
seanhalle@0
|
198 //fix limit on num with dynArray
|
|
seanhalle@2
|
199 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@2
|
200 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@3
|
201
|
|
seanhalle@3
|
202 bool32 *coreIsDone;
|
|
seanhalle@3
|
203 int32 numCoresDone;
|
|
seanhalle@0
|
204
|
|
seanhalle@0
|
205 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
|
|
seanhalle@0
|
206 ListOfArrays* unitList;
|
|
seanhalle@0
|
207 ListOfArrays* ctlDependenciesList;
|
|
seanhalle@0
|
208 ListOfArrays* commDependenciesList;
|
|
seanhalle@0
|
209 NtoN** ntonGroups;
|
|
seanhalle@0
|
210 PrivDynArrayInfo* ntonGroupsInfo;
|
|
seanhalle@0
|
211 ListOfArrays* dynDependenciesList;
|
|
seanhalle@0
|
212 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
|
|
seanhalle@0
|
213 ListOfArrays* hwArcs;
|
|
seanhalle@0
|
214 #endif
|
|
seanhalle@0
|
215
|
|
seanhalle@0
|
216 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
|
|
seanhalle@0
|
217 ListOfArrays* counterList[NUM_CORES];
|
|
seanhalle@0
|
218 #endif
|
|
seanhalle@3
|
219 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
|
|
seanhalle@0
|
220 int shutdownInitiated;
|
|
seanhalle@0
|
221 }
|
|
seanhalle@2
|
222 VSsSemEnv;
|
|
seanhalle@0
|
223
|
|
seanhalle@0
|
224
|
|
seanhalle@0
|
225 typedef struct _TransListElem TransListElem;
|
|
seanhalle@0
|
226 struct _TransListElem
|
|
seanhalle@0
|
227 {
|
|
seanhalle@0
|
228 int32 transID;
|
|
seanhalle@0
|
229 TransListElem *nextTrans;
|
|
seanhalle@0
|
230 };
|
|
seanhalle@0
|
231 //TransListElem
|
|
seanhalle@0
|
232
|
|
nengel@5
|
233
|
|
nengel@5
|
234
|
|
seanhalle@0
|
235 typedef struct
|
|
seanhalle@0
|
236 {
|
|
seanhalle@0
|
237 int32 highestTransEntered;
|
|
seanhalle@0
|
238 TransListElem *lastTransEntered;
|
|
seanhalle@2
|
239 bool32 needsTaskAssigned;
|
|
seanhalle@2
|
240 VSsTaskStub *taskStub;
|
|
nengel@5
|
241 VSsThreadInfo *threadInfo;
|
|
seanhalle@0
|
242 }
|
|
seanhalle@2
|
243 VSsSemData;
|
|
seanhalle@0
|
244
|
|
seanhalle@0
|
245 //===========================================================================
|
|
seanhalle@0
|
246
|
|
seanhalle@0
|
247 void
|
|
seanhalle@2
|
248 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@0
|
249
|
|
seanhalle@0
|
250 int32
|
|
seanhalle@2
|
251 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
|
|
seanhalle@0
|
252
|
|
seanhalle@0
|
253 void
|
|
seanhalle@2
|
254 VSs__start_primitive();
|
|
seanhalle@0
|
255
|
|
seanhalle@0
|
256 int32
|
|
seanhalle@2
|
257 VSs__end_primitive_and_give_cycles();
|
|
seanhalle@0
|
258
|
|
seanhalle@0
|
259 int32
|
|
seanhalle@2
|
260 VSs__giveIdealNumWorkUnits();
|
|
seanhalle@0
|
261
|
|
seanhalle@0
|
262 int32
|
|
seanhalle@2
|
263 VSs__give_number_of_cores_to_schedule_onto();
|
|
seanhalle@0
|
264
|
|
seanhalle@0
|
265 //=======================
|
|
seanhalle@0
|
266
|
|
seanhalle@0
|
267 void
|
|
seanhalle@2
|
268 VSs__init();
|
|
seanhalle@0
|
269
|
|
seanhalle@0
|
270 void
|
|
seanhalle@2
|
271 VSs__cleanup_after_shutdown();
|
|
seanhalle@0
|
272
|
|
seanhalle@0
|
273 //=======================
|
|
seanhalle@0
|
274
|
|
seanhalle@4
|
275 SlaveVP *
|
|
seanhalle@7
|
276 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
277 SlaveVP *creatingThd );
|
|
seanhalle@0
|
278
|
|
seanhalle@0
|
279 void
|
|
seanhalle@7
|
280 VSs__end_thread( SlaveVP *thdToEnd );
|
|
seanhalle@0
|
281
|
|
seanhalle@0
|
282 //=======================
|
|
seanhalle@2
|
283
|
|
seanhalle@2
|
284 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
|
|
seanhalle@2
|
285
|
|
seanhalle@2
|
286 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
|
|
seanhalle@2
|
287
|
|
seanhalle@2
|
288
|
|
seanhalle@2
|
289 //=======================
|
|
seanhalle@4
|
290 void
|
|
seanhalle@3
|
291 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
|
|
seanhalle@2
|
292
|
|
seanhalle@4
|
293 inline int32 *
|
|
seanhalle@4
|
294 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
|
|
seanhalle@4
|
295
|
|
seanhalle@4
|
296 void
|
|
seanhalle@4
|
297 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
|
|
seanhalle@4
|
298 SlaveVP *animSlv);
|
|
seanhalle@0
|
299
|
|
seanhalle@0
|
300 void
|
|
seanhalle@2
|
301 VSs__end_task( SlaveVP *animSlv );
|
|
seanhalle@0
|
302
|
|
seanhalle@4
|
303 //=========================
|
|
nengel@5
|
304 void
|
|
nengel@5
|
305 VSs__taskwait(SlaveVP *animSlv);
|
|
nengel@5
|
306
|
|
seanhalle@4
|
307
|
|
seanhalle@4
|
308 inline int32 *
|
|
seanhalle@4
|
309 VSs__give_self_taskID( SlaveVP *animSlv );
|
|
seanhalle@4
|
310
|
|
seanhalle@4
|
311 void
|
|
seanhalle@4
|
312 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
|
|
seanhalle@4
|
313 SlaveVP *senderSlv );
|
|
seanhalle@4
|
314
|
|
seanhalle@4
|
315 void
|
|
seanhalle@4
|
316 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
|
|
seanhalle@4
|
317
|
|
seanhalle@4
|
318 void *
|
|
seanhalle@4
|
319 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
|
|
seanhalle@4
|
320
|
|
seanhalle@4
|
321 void *
|
|
seanhalle@4
|
322 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
|
|
seanhalle@0
|
323
|
|
seanhalle@0
|
324 //======================= Concurrency Stuff ======================
|
|
seanhalle@0
|
325 void
|
|
seanhalle@2
|
326 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
327
|
|
seanhalle@0
|
328 void
|
|
seanhalle@2
|
329 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
330
|
|
seanhalle@0
|
331 void
|
|
seanhalle@2
|
332 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
333
|
|
seanhalle@0
|
334 void
|
|
seanhalle@2
|
335 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
336
|
|
seanhalle@0
|
337 void
|
|
seanhalle@2
|
338 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@0
|
339 void *data, SlaveVP *animSlv );
|
|
seanhalle@0
|
340
|
|
seanhalle@0
|
341 void
|
|
seanhalle@2
|
342 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
343
|
|
seanhalle@0
|
344 void
|
|
seanhalle@2
|
345 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
346
|
|
seanhalle@0
|
347
|
|
seanhalle@0
|
348 //========================= Internal use only =============================
|
|
seanhalle@0
|
349 void
|
|
seanhalle@3
|
350 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
|
|
seanhalle@0
|
351
|
|
seanhalle@0
|
352 SlaveVP *
|
|
seanhalle@2
|
353 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
|
|
seanhalle@0
|
354
|
|
seanhalle@0
|
355 SlaveVP*
|
|
seanhalle@2
|
356 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@2
|
357 VSsSemEnv *semEnv, int32 coreToAssignOnto );
|
|
seanhalle@0
|
358
|
|
seanhalle@7
|
359 VSsTaskStub *
|
|
seanhalle@7
|
360 create_expl_proc_task_stub( void *initData );
|
|
seanhalle@7
|
361
|
|
seanhalle@7
|
362
|
|
seanhalle@7
|
363 SlaveVP *
|
|
seanhalle@7
|
364 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
365 SlaveVP *creatingSlv );
|
|
seanhalle@7
|
366
|
|
seanhalle@7
|
367 SlaveVP *
|
|
seanhalle@7
|
368 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
369 SlaveVP *creatingSlv, int32 coreToAssignOnto);
|
|
seanhalle@7
|
370
|
|
seanhalle@7
|
371
|
|
seanhalle@0
|
372 //===================== Measurement of Lang Overheads =====================
|
|
seanhalle@3
|
373 #include "Measurement/VSs_Measurement.h"
|
|
seanhalle@0
|
374
|
|
seanhalle@0
|
375 //===========================================================================
|
|
seanhalle@2
|
376 #endif /* _VSs_H */
|
|
seanhalle@0
|
377
|