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@8
|
44 #define IS_A_THREAD NULL
|
seanhalle@8
|
45 #define IS_ENDED NULL
|
seanhalle@8
|
46 #define SEED_SLV NULL
|
seanhalle@8
|
47
|
seanhalle@1
|
48 typedef struct
|
seanhalle@1
|
49 {
|
seanhalle@1
|
50 VSsTaskFnPtr fn;
|
seanhalle@2
|
51 int32 numTotalArgs;//the number of inputs to function
|
seanhalle@2
|
52 int32 numCtldArgs;//how many of args have dependencies
|
seanhalle@2
|
53 int32 *argTypes; //says reader, writer, or non-ctld
|
seanhalle@2
|
54 int32 *argSizes; //for detecting overlap
|
seanhalle@2
|
55 int32 sizeOfArgs; //for memcpy of args struct
|
seanhalle@1
|
56 }
|
seanhalle@1
|
57 VSsTaskType;
|
seanhalle@1
|
58
|
seanhalle@1
|
59
|
seanhalle@2
|
60 typedef struct
|
seanhalle@2
|
61 {
|
seanhalle@3
|
62 bool32 hasEnabledNonFinishedWriter;
|
seanhalle@3
|
63 int32 numEnabledNonDoneReaders;
|
seanhalle@3
|
64 PrivQueueStruc *waitersQ;
|
seanhalle@3
|
65 }
|
seanhalle@3
|
66 VSsPointerEntry;
|
seanhalle@3
|
67
|
seanhalle@6
|
68 typedef struct
|
seanhalle@3
|
69 {
|
seanhalle@2
|
70 void **args; //ctld args must come first, as ptrs
|
seanhalle@2
|
71 VSsTaskType *taskType;
|
seanhalle@4
|
72 int32 *taskID;
|
seanhalle@2
|
73 int32 numBlockingProp;
|
seanhalle@10
|
74 SlaveVP *slaveAssignedTo; //only valid before end task (thread)
|
seanhalle@3
|
75 VSsPointerEntry **ptrEntries;
|
nengel@11
|
76 void* parentTaskStub;
|
seanhalle@8
|
77 int32 numLiveChildTasks;
|
seanhalle@8
|
78 int32 numLiveChildThreads;
|
seanhalle@8
|
79 bool32 isWaitingForChildTasksToEnd;
|
seanhalle@8
|
80 bool32 isWaitingForChildThreadsToEnd;
|
seanhalle@8
|
81 bool32 isEnded;
|
seanhalle@2
|
82 }
|
seanhalle@6
|
83 VSsTaskStub;
|
nengel@5
|
84
|
seanhalle@2
|
85
|
seanhalle@2
|
86 typedef struct
|
seanhalle@2
|
87 {
|
seanhalle@2
|
88 VSsTaskStub *taskStub;
|
seanhalle@2
|
89 int32 argNum;
|
seanhalle@2
|
90 int32 isReader;
|
seanhalle@2
|
91 }
|
seanhalle@2
|
92 VSsTaskStubCarrier;
|
seanhalle@2
|
93
|
seanhalle@2
|
94
|
seanhalle@0
|
95 /*Semantic layer-specific data sent inside a request from lib called in app
|
seanhalle@0
|
96 * to request handler called in AnimationMaster
|
seanhalle@0
|
97 */
|
seanhalle@0
|
98
|
seanhalle@0
|
99 typedef struct
|
seanhalle@0
|
100 {
|
seanhalle@0
|
101 SlaveVP *VPCurrentlyExecuting;
|
seanhalle@0
|
102 PrivQueueStruc *waitingVPQ;
|
seanhalle@0
|
103 }
|
seanhalle@2
|
104 VSsTrans;
|
seanhalle@0
|
105
|
seanhalle@0
|
106 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
seanhalle@0
|
107 */
|
seanhalle@0
|
108 typedef struct
|
seanhalle@0
|
109 {
|
seanhalle@0
|
110 void *endInstrAddr;
|
seanhalle@0
|
111 int32 hasBeenStarted;
|
seanhalle@0
|
112 int32 hasFinished;
|
seanhalle@0
|
113 PrivQueueStruc *waitQ;
|
seanhalle@0
|
114 }
|
seanhalle@2
|
115 VSsSingleton;
|
seanhalle@0
|
116
|
seanhalle@2
|
117 enum VSsReqType
|
seanhalle@0
|
118 {
|
seanhalle@2
|
119 submit_task = 1,
|
seanhalle@2
|
120 end_task,
|
seanhalle@2
|
121 create_slave,
|
seanhalle@2
|
122 create_slave_w_aff,
|
seanhalle@2
|
123 dissipate_slave,
|
seanhalle@2
|
124 //===============================
|
seanhalle@4
|
125 send_type_to,
|
seanhalle@4
|
126 receive_type_to,
|
seanhalle@4
|
127 send_from_to,
|
seanhalle@4
|
128 receive_from_to,
|
seanhalle@4
|
129 //===============================
|
nengel@5
|
130 taskwait,
|
seanhalle@0
|
131 malloc_req,
|
seanhalle@0
|
132 free_req,
|
seanhalle@0
|
133 singleton_fn_start,
|
seanhalle@0
|
134 singleton_fn_end,
|
seanhalle@0
|
135 singleton_data_start,
|
seanhalle@0
|
136 singleton_data_end,
|
seanhalle@0
|
137 atomic,
|
seanhalle@0
|
138 trans_start,
|
seanhalle@0
|
139 trans_end
|
seanhalle@0
|
140 };
|
seanhalle@0
|
141
|
seanhalle@2
|
142 struct _VSsSemReq
|
seanhalle@2
|
143 { enum VSsReqType reqType;
|
seanhalle@2
|
144 SlaveVP *callingSlv;
|
seanhalle@2
|
145 VSsTaskType *taskType;
|
seanhalle@2
|
146 void *args;
|
seanhalle@2
|
147 VSsTaskStub *taskStub;
|
seanhalle@2
|
148
|
seanhalle@4
|
149 SlaveVP *senderSlv;
|
seanhalle@4
|
150 SlaveVP *receiverSlv;
|
seanhalle@4
|
151 int32 *senderID;
|
seanhalle@4
|
152 int32 *receiverID;
|
seanhalle@4
|
153 int32 msgType;
|
seanhalle@4
|
154 void *msg;
|
seanhalle@4
|
155 VSsSemReq *nextReqInHashEntry;
|
seanhalle@4
|
156 int32 *taskID;
|
seanhalle@4
|
157
|
seanhalle@2
|
158 TopLevelFnPtr fnPtr;
|
seanhalle@0
|
159 void *initData;
|
seanhalle@0
|
160 int32 coreToAssignOnto;
|
seanhalle@0
|
161
|
seanhalle@0
|
162 int32 sizeToMalloc;
|
seanhalle@0
|
163 void *ptrToFree;
|
seanhalle@0
|
164
|
seanhalle@0
|
165 int32 singletonID;
|
seanhalle@2
|
166 VSsSingleton **singletonPtrAddr;
|
seanhalle@0
|
167
|
seanhalle@0
|
168 PtrToAtomicFn fnToExecInMaster;
|
seanhalle@0
|
169 void *dataForFn;
|
seanhalle@0
|
170
|
seanhalle@0
|
171 int32 transID;
|
seanhalle@0
|
172 }
|
seanhalle@2
|
173 /* VSsSemReq */;
|
seanhalle@0
|
174
|
seanhalle@0
|
175
|
seanhalle@0
|
176 typedef struct
|
seanhalle@0
|
177 {
|
seanhalle@9
|
178 PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned)
|
seanhalle@9
|
179 PrivQueueStruc *freeExtraTaskSlvQ; //Shared
|
seanhalle@9
|
180 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
|
seanhalle@10
|
181 SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
|
seanhalle@2
|
182 HashTable *argPtrHashTbl;
|
seanhalle@4
|
183 HashTable *commHashTbl;
|
seanhalle@8
|
184 int32 numLiveExtraTaskSlvs;
|
seanhalle@8
|
185 int32 numLiveThreadSlvs;
|
seanhalle@3
|
186 int32 nextCoreToGetNewSlv;
|
seanhalle@0
|
187 int32 primitiveStartTime;
|
seanhalle@0
|
188
|
seanhalle@0
|
189 //fix limit on num with dynArray
|
seanhalle@2
|
190 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
seanhalle@2
|
191 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
seanhalle@3
|
192
|
seanhalle@3
|
193 bool32 *coreIsDone;
|
seanhalle@3
|
194 int32 numCoresDone;
|
seanhalle@0
|
195
|
seanhalle@0
|
196 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
|
seanhalle@0
|
197 ListOfArrays* unitList;
|
seanhalle@0
|
198 ListOfArrays* ctlDependenciesList;
|
seanhalle@0
|
199 ListOfArrays* commDependenciesList;
|
seanhalle@0
|
200 NtoN** ntonGroups;
|
seanhalle@0
|
201 PrivDynArrayInfo* ntonGroupsInfo;
|
seanhalle@0
|
202 ListOfArrays* dynDependenciesList;
|
seanhalle@0
|
203 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
|
seanhalle@0
|
204 ListOfArrays* hwArcs;
|
seanhalle@0
|
205 #endif
|
seanhalle@0
|
206
|
seanhalle@0
|
207 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
|
seanhalle@0
|
208 ListOfArrays* counterList[NUM_CORES];
|
seanhalle@0
|
209 #endif
|
seanhalle@3
|
210 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
|
seanhalle@0
|
211 int shutdownInitiated;
|
seanhalle@0
|
212 }
|
seanhalle@2
|
213 VSsSemEnv;
|
seanhalle@0
|
214
|
seanhalle@0
|
215
|
seanhalle@0
|
216 typedef struct _TransListElem TransListElem;
|
seanhalle@0
|
217 struct _TransListElem
|
seanhalle@0
|
218 {
|
seanhalle@0
|
219 int32 transID;
|
seanhalle@0
|
220 TransListElem *nextTrans;
|
seanhalle@0
|
221 };
|
seanhalle@0
|
222 //TransListElem
|
seanhalle@0
|
223
|
seanhalle@8
|
224 enum VSsSlvType
|
seanhalle@10
|
225 { ExtraTaskSlv = 1,
|
seanhalle@10
|
226 SlotTaskSlv,
|
seanhalle@10
|
227 ThreadSlv
|
seanhalle@8
|
228 };
|
nengel@5
|
229
|
seanhalle@0
|
230 typedef struct
|
seanhalle@0
|
231 {
|
seanhalle@14
|
232 int32 highestTransEntered;
|
seanhalle@14
|
233 TransListElem *lastTransEntered;
|
seanhalle@14
|
234 bool32 needsTaskAssigned;
|
seanhalle@14
|
235 VSsTaskStub *taskStub;
|
seanhalle@14
|
236 enum VSsSlvType slaveType;
|
seanhalle@0
|
237 }
|
seanhalle@2
|
238 VSsSemData;
|
seanhalle@0
|
239
|
seanhalle@0
|
240 //===========================================================================
|
seanhalle@0
|
241
|
seanhalle@0
|
242 void
|
seanhalle@2
|
243 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
|
seanhalle@0
|
244
|
seanhalle@0
|
245 int32
|
seanhalle@2
|
246 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
|
seanhalle@0
|
247
|
seanhalle@0
|
248 void
|
seanhalle@2
|
249 VSs__start_primitive();
|
seanhalle@0
|
250
|
seanhalle@0
|
251 int32
|
seanhalle@2
|
252 VSs__end_primitive_and_give_cycles();
|
seanhalle@0
|
253
|
seanhalle@0
|
254 int32
|
seanhalle@2
|
255 VSs__giveIdealNumWorkUnits();
|
seanhalle@0
|
256
|
seanhalle@0
|
257 int32
|
seanhalle@2
|
258 VSs__give_number_of_cores_to_schedule_onto();
|
seanhalle@0
|
259
|
seanhalle@0
|
260 //=======================
|
seanhalle@0
|
261
|
seanhalle@0
|
262 void
|
seanhalle@2
|
263 VSs__init();
|
seanhalle@0
|
264
|
seanhalle@0
|
265 void
|
seanhalle@2
|
266 VSs__cleanup_after_shutdown();
|
seanhalle@0
|
267
|
seanhalle@0
|
268 //=======================
|
seanhalle@0
|
269
|
seanhalle@4
|
270 SlaveVP *
|
seanhalle@7
|
271 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
seanhalle@7
|
272 SlaveVP *creatingThd );
|
seanhalle@0
|
273
|
seanhalle@0
|
274 void
|
seanhalle@7
|
275 VSs__end_thread( SlaveVP *thdToEnd );
|
seanhalle@0
|
276
|
seanhalle@0
|
277 //=======================
|
seanhalle@2
|
278
|
seanhalle@2
|
279 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
|
seanhalle@2
|
280
|
seanhalle@2
|
281 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
|
seanhalle@2
|
282
|
seanhalle@2
|
283
|
seanhalle@2
|
284 //=======================
|
seanhalle@4
|
285 void
|
seanhalle@3
|
286 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
|
seanhalle@2
|
287
|
seanhalle@4
|
288 inline int32 *
|
seanhalle@4
|
289 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
|
seanhalle@4
|
290
|
seanhalle@4
|
291 void
|
seanhalle@4
|
292 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
|
seanhalle@4
|
293 SlaveVP *animSlv);
|
seanhalle@0
|
294
|
seanhalle@0
|
295 void
|
seanhalle@2
|
296 VSs__end_task( SlaveVP *animSlv );
|
seanhalle@0
|
297
|
seanhalle@4
|
298 //=========================
|
nengel@5
|
299 void
|
nengel@5
|
300 VSs__taskwait(SlaveVP *animSlv);
|
nengel@5
|
301
|
seanhalle@4
|
302
|
seanhalle@4
|
303 inline int32 *
|
seanhalle@4
|
304 VSs__give_self_taskID( SlaveVP *animSlv );
|
seanhalle@4
|
305
|
seanhalle@4
|
306 void
|
seanhalle@4
|
307 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
|
seanhalle@4
|
308 SlaveVP *senderSlv );
|
seanhalle@4
|
309
|
seanhalle@4
|
310 void
|
seanhalle@4
|
311 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
|
seanhalle@4
|
312
|
seanhalle@4
|
313 void *
|
seanhalle@4
|
314 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
|
seanhalle@4
|
315
|
seanhalle@4
|
316 void *
|
seanhalle@4
|
317 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
|
seanhalle@0
|
318
|
seanhalle@0
|
319 //======================= Concurrency Stuff ======================
|
seanhalle@0
|
320 void
|
seanhalle@2
|
321 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
seanhalle@0
|
322
|
seanhalle@0
|
323 void
|
seanhalle@2
|
324 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
seanhalle@0
|
325
|
seanhalle@0
|
326 void
|
seanhalle@2
|
327 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
|
seanhalle@0
|
328
|
seanhalle@0
|
329 void
|
seanhalle@2
|
330 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
|
seanhalle@0
|
331
|
seanhalle@0
|
332 void
|
seanhalle@2
|
333 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
seanhalle@0
|
334 void *data, SlaveVP *animSlv );
|
seanhalle@0
|
335
|
seanhalle@0
|
336 void
|
seanhalle@2
|
337 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
seanhalle@0
|
338
|
seanhalle@0
|
339 void
|
seanhalle@2
|
340 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
seanhalle@0
|
341
|
seanhalle@0
|
342
|
seanhalle@0
|
343 //========================= Internal use only =============================
|
seanhalle@0
|
344 void
|
seanhalle@3
|
345 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
|
seanhalle@0
|
346
|
seanhalle@0
|
347 SlaveVP *
|
seanhalle@2
|
348 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
|
seanhalle@0
|
349
|
seanhalle@0
|
350 SlaveVP*
|
seanhalle@2
|
351 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
|
seanhalle@2
|
352 VSsSemEnv *semEnv, int32 coreToAssignOnto );
|
seanhalle@0
|
353
|
seanhalle@7
|
354 VSsTaskStub *
|
seanhalle@8
|
355 create_thread_task_stub( void *initData );
|
seanhalle@7
|
356
|
seanhalle@7
|
357
|
seanhalle@7
|
358 SlaveVP *
|
seanhalle@7
|
359 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
|
seanhalle@7
|
360 SlaveVP *creatingSlv );
|
seanhalle@7
|
361
|
seanhalle@7
|
362 SlaveVP *
|
seanhalle@7
|
363 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
seanhalle@7
|
364 SlaveVP *creatingSlv, int32 coreToAssignOnto);
|
seanhalle@7
|
365
|
seanhalle@9
|
366 void
|
seanhalle@9
|
367 idle_fn(void* data, SlaveVP *animatingSlv);
|
seanhalle@7
|
368
|
seanhalle@0
|
369 //===================== Measurement of Lang Overheads =====================
|
seanhalle@3
|
370 #include "Measurement/VSs_Measurement.h"
|
seanhalle@0
|
371
|
seanhalle@0
|
372 //===========================================================================
|
seanhalle@2
|
373 #endif /* _VSs_H */
|
seanhalle@0
|
374
|