| 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@2
|
36 #define IN 1
|
|
seanhalle@2
|
37 #define OUT 2
|
|
seanhalle@3
|
38 #define INOUT 2
|
|
seanhalle@2
|
39
|
|
seanhalle@2
|
40 #define READER 1
|
|
seanhalle@2
|
41 #define WRITER 2
|
|
seanhalle@1
|
42
|
|
seanhalle@1
|
43 typedef struct
|
|
seanhalle@1
|
44 {
|
|
seanhalle@1
|
45 VSsTaskFnPtr fn;
|
|
seanhalle@2
|
46 int32 numTotalArgs;//the number of inputs to function
|
|
seanhalle@2
|
47 int32 numCtldArgs;//how many of args have dependencies
|
|
seanhalle@2
|
48 int32 *argTypes; //says reader, writer, or non-ctld
|
|
seanhalle@2
|
49 int32 *argSizes; //for detecting overlap
|
|
seanhalle@2
|
50 int32 sizeOfArgs; //for memcpy of args struct
|
|
seanhalle@1
|
51 }
|
|
seanhalle@1
|
52 VSsTaskType;
|
|
seanhalle@1
|
53
|
|
seanhalle@1
|
54
|
|
seanhalle@2
|
55 typedef struct
|
|
seanhalle@2
|
56 {
|
|
seanhalle@3
|
57 bool32 hasEnabledNonFinishedWriter;
|
|
seanhalle@3
|
58 int32 numEnabledNonDoneReaders;
|
|
seanhalle@3
|
59 PrivQueueStruc *waitersQ;
|
|
seanhalle@3
|
60 }
|
|
seanhalle@3
|
61 VSsPointerEntry;
|
|
seanhalle@3
|
62
|
|
seanhalle@3
|
63 typedef struct
|
|
seanhalle@3
|
64 {
|
|
seanhalle@2
|
65 void **args; //ctld args must come first, as ptrs
|
|
seanhalle@2
|
66 VSsTaskType *taskType;
|
|
seanhalle@2
|
67 int32 numBlockingProp;
|
|
seanhalle@2
|
68 SlaveVP *slaveAssignedTo;
|
|
seanhalle@3
|
69 VSsPointerEntry **ptrEntries;
|
|
seanhalle@2
|
70 }
|
|
seanhalle@2
|
71 VSsTaskStub;
|
|
seanhalle@2
|
72
|
|
seanhalle@2
|
73 typedef struct
|
|
seanhalle@2
|
74 {
|
|
seanhalle@2
|
75 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
76 int32 argNum;
|
|
seanhalle@2
|
77 int32 isReader;
|
|
seanhalle@2
|
78 }
|
|
seanhalle@2
|
79 VSsTaskStubCarrier;
|
|
seanhalle@2
|
80
|
|
seanhalle@2
|
81
|
|
seanhalle@2
|
82 typedef struct
|
|
seanhalle@2
|
83 {
|
|
seanhalle@2
|
84 int32 type;
|
|
seanhalle@2
|
85 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
86 }
|
|
seanhalle@2
|
87 VSsWaiterCarrier;
|
|
seanhalle@1
|
88
|
|
seanhalle@0
|
89 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@0
|
90 * to request handler called in AnimationMaster
|
|
seanhalle@0
|
91 */
|
|
seanhalle@0
|
92
|
|
seanhalle@0
|
93 typedef struct
|
|
seanhalle@0
|
94 {
|
|
seanhalle@0
|
95 SlaveVP *VPCurrentlyExecuting;
|
|
seanhalle@0
|
96 PrivQueueStruc *waitingVPQ;
|
|
seanhalle@0
|
97 }
|
|
seanhalle@2
|
98 VSsTrans;
|
|
seanhalle@0
|
99
|
|
seanhalle@0
|
100 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
seanhalle@0
|
101 */
|
|
seanhalle@0
|
102 typedef struct
|
|
seanhalle@0
|
103 {
|
|
seanhalle@0
|
104 void *endInstrAddr;
|
|
seanhalle@0
|
105 int32 hasBeenStarted;
|
|
seanhalle@0
|
106 int32 hasFinished;
|
|
seanhalle@0
|
107 PrivQueueStruc *waitQ;
|
|
seanhalle@0
|
108 }
|
|
seanhalle@2
|
109 VSsSingleton;
|
|
seanhalle@0
|
110
|
|
seanhalle@2
|
111 enum VSsReqType
|
|
seanhalle@0
|
112 {
|
|
seanhalle@2
|
113 submit_task = 1,
|
|
seanhalle@2
|
114 end_task,
|
|
seanhalle@2
|
115 create_slave,
|
|
seanhalle@2
|
116 create_slave_w_aff,
|
|
seanhalle@2
|
117 dissipate_slave,
|
|
seanhalle@2
|
118 //===============================
|
|
seanhalle@0
|
119 malloc_req,
|
|
seanhalle@0
|
120 free_req,
|
|
seanhalle@0
|
121 singleton_fn_start,
|
|
seanhalle@0
|
122 singleton_fn_end,
|
|
seanhalle@0
|
123 singleton_data_start,
|
|
seanhalle@0
|
124 singleton_data_end,
|
|
seanhalle@0
|
125 atomic,
|
|
seanhalle@0
|
126 trans_start,
|
|
seanhalle@0
|
127 trans_end
|
|
seanhalle@0
|
128 };
|
|
seanhalle@0
|
129
|
|
seanhalle@2
|
130 struct _VSsSemReq
|
|
seanhalle@2
|
131 { enum VSsReqType reqType;
|
|
seanhalle@2
|
132 SlaveVP *callingSlv;
|
|
seanhalle@2
|
133 VSsTaskType *taskType;
|
|
seanhalle@2
|
134 void *args;
|
|
seanhalle@2
|
135 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
136
|
|
seanhalle@2
|
137 TopLevelFnPtr fnPtr;
|
|
seanhalle@0
|
138 void *initData;
|
|
seanhalle@0
|
139 int32 coreToAssignOnto;
|
|
seanhalle@0
|
140
|
|
seanhalle@0
|
141 int32 sizeToMalloc;
|
|
seanhalle@0
|
142 void *ptrToFree;
|
|
seanhalle@0
|
143
|
|
seanhalle@0
|
144 int32 singletonID;
|
|
seanhalle@2
|
145 VSsSingleton **singletonPtrAddr;
|
|
seanhalle@0
|
146
|
|
seanhalle@0
|
147 PtrToAtomicFn fnToExecInMaster;
|
|
seanhalle@0
|
148 void *dataForFn;
|
|
seanhalle@0
|
149
|
|
seanhalle@0
|
150 int32 transID;
|
|
seanhalle@0
|
151 }
|
|
seanhalle@2
|
152 /* VSsSemReq */;
|
|
seanhalle@0
|
153
|
|
seanhalle@0
|
154
|
|
seanhalle@0
|
155 typedef struct
|
|
seanhalle@0
|
156 {
|
|
seanhalle@0
|
157 PrivQueueStruc **readyVPQs;
|
|
seanhalle@2
|
158 PrivQueueStruc *taskReadyQ; //Q: shared or local?
|
|
seanhalle@2
|
159 HashTable *argPtrHashTbl;
|
|
seanhalle@0
|
160 int32 numSlaveVP;
|
|
seanhalle@3
|
161 int32 nextCoreToGetNewSlv;
|
|
seanhalle@0
|
162 int32 primitiveStartTime;
|
|
seanhalle@0
|
163
|
|
seanhalle@0
|
164 //fix limit on num with dynArray
|
|
seanhalle@2
|
165 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@2
|
166 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@3
|
167
|
|
seanhalle@3
|
168 bool32 *coreIsDone;
|
|
seanhalle@3
|
169 int32 numCoresDone;
|
|
seanhalle@0
|
170
|
|
seanhalle@0
|
171 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
|
|
seanhalle@0
|
172 ListOfArrays* unitList;
|
|
seanhalle@0
|
173 ListOfArrays* ctlDependenciesList;
|
|
seanhalle@0
|
174 ListOfArrays* commDependenciesList;
|
|
seanhalle@0
|
175 NtoN** ntonGroups;
|
|
seanhalle@0
|
176 PrivDynArrayInfo* ntonGroupsInfo;
|
|
seanhalle@0
|
177 ListOfArrays* dynDependenciesList;
|
|
seanhalle@0
|
178 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
|
|
seanhalle@0
|
179 ListOfArrays* hwArcs;
|
|
seanhalle@0
|
180 #endif
|
|
seanhalle@0
|
181
|
|
seanhalle@0
|
182 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
|
|
seanhalle@0
|
183 ListOfArrays* counterList[NUM_CORES];
|
|
seanhalle@0
|
184 #endif
|
|
seanhalle@3
|
185 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
|
|
seanhalle@0
|
186 int shutdownInitiated;
|
|
seanhalle@0
|
187 }
|
|
seanhalle@2
|
188 VSsSemEnv;
|
|
seanhalle@0
|
189
|
|
seanhalle@0
|
190
|
|
seanhalle@0
|
191 typedef struct _TransListElem TransListElem;
|
|
seanhalle@0
|
192 struct _TransListElem
|
|
seanhalle@0
|
193 {
|
|
seanhalle@0
|
194 int32 transID;
|
|
seanhalle@0
|
195 TransListElem *nextTrans;
|
|
seanhalle@0
|
196 };
|
|
seanhalle@0
|
197 //TransListElem
|
|
seanhalle@0
|
198
|
|
seanhalle@0
|
199 typedef struct
|
|
seanhalle@0
|
200 {
|
|
seanhalle@0
|
201 int32 highestTransEntered;
|
|
seanhalle@0
|
202 TransListElem *lastTransEntered;
|
|
seanhalle@2
|
203 bool32 needsTaskAssigned;
|
|
seanhalle@2
|
204 VSsTaskStub *taskStub;
|
|
seanhalle@0
|
205 }
|
|
seanhalle@2
|
206 VSsSemData;
|
|
seanhalle@0
|
207
|
|
seanhalle@0
|
208 //===========================================================================
|
|
seanhalle@0
|
209
|
|
seanhalle@0
|
210 void
|
|
seanhalle@2
|
211 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@0
|
212
|
|
seanhalle@0
|
213 int32
|
|
seanhalle@2
|
214 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
|
|
seanhalle@0
|
215
|
|
seanhalle@0
|
216 void
|
|
seanhalle@2
|
217 VSs__start_primitive();
|
|
seanhalle@0
|
218
|
|
seanhalle@0
|
219 int32
|
|
seanhalle@2
|
220 VSs__end_primitive_and_give_cycles();
|
|
seanhalle@0
|
221
|
|
seanhalle@0
|
222 int32
|
|
seanhalle@2
|
223 VSs__giveIdealNumWorkUnits();
|
|
seanhalle@0
|
224
|
|
seanhalle@0
|
225 int32
|
|
seanhalle@2
|
226 VSs__give_number_of_cores_to_schedule_onto();
|
|
seanhalle@0
|
227
|
|
seanhalle@0
|
228 //=======================
|
|
seanhalle@0
|
229
|
|
seanhalle@0
|
230 void
|
|
seanhalle@2
|
231 VSs__init();
|
|
seanhalle@0
|
232
|
|
seanhalle@0
|
233 void
|
|
seanhalle@2
|
234 VSs__cleanup_after_shutdown();
|
|
seanhalle@0
|
235
|
|
seanhalle@0
|
236 //=======================
|
|
seanhalle@0
|
237
|
|
seanhalle@0
|
238 SlaveVP *
|
|
seanhalle@2
|
239 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@0
|
240 SlaveVP *creatingSlv );
|
|
seanhalle@0
|
241
|
|
seanhalle@0
|
242 SlaveVP *
|
|
seanhalle@2
|
243 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@3
|
244 SlaveVP *creatingSlv, int32 coreToAssignOnto);
|
|
seanhalle@0
|
245
|
|
seanhalle@0
|
246 void
|
|
seanhalle@2
|
247 VSs__dissipate_slave( SlaveVP *slaveToDissipate );
|
|
seanhalle@0
|
248
|
|
seanhalle@0
|
249 //=======================
|
|
seanhalle@2
|
250
|
|
seanhalle@2
|
251 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
|
|
seanhalle@2
|
252
|
|
seanhalle@2
|
253 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
|
|
seanhalle@2
|
254
|
|
seanhalle@2
|
255
|
|
seanhalle@2
|
256 //=======================
|
|
seanhalle@2
|
257 int32
|
|
seanhalle@3
|
258 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
|
|
seanhalle@2
|
259
|
|
seanhalle@0
|
260
|
|
seanhalle@0
|
261 void
|
|
seanhalle@2
|
262 VSs__end_task( SlaveVP *animSlv );
|
|
seanhalle@0
|
263
|
|
seanhalle@0
|
264
|
|
seanhalle@0
|
265 //======================= Concurrency Stuff ======================
|
|
seanhalle@0
|
266 void
|
|
seanhalle@2
|
267 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
268
|
|
seanhalle@0
|
269 void
|
|
seanhalle@2
|
270 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
271
|
|
seanhalle@0
|
272 void
|
|
seanhalle@2
|
273 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
274
|
|
seanhalle@0
|
275 void
|
|
seanhalle@2
|
276 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
277
|
|
seanhalle@0
|
278 void
|
|
seanhalle@2
|
279 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@0
|
280 void *data, SlaveVP *animSlv );
|
|
seanhalle@0
|
281
|
|
seanhalle@0
|
282 void
|
|
seanhalle@2
|
283 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
284
|
|
seanhalle@0
|
285 void
|
|
seanhalle@2
|
286 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
287
|
|
seanhalle@0
|
288
|
|
seanhalle@0
|
289 //========================= Internal use only =============================
|
|
seanhalle@0
|
290 void
|
|
seanhalle@3
|
291 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
|
|
seanhalle@0
|
292
|
|
seanhalle@0
|
293 SlaveVP *
|
|
seanhalle@2
|
294 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
|
|
seanhalle@0
|
295
|
|
seanhalle@0
|
296 SlaveVP*
|
|
seanhalle@2
|
297 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@2
|
298 VSsSemEnv *semEnv, int32 coreToAssignOnto );
|
|
seanhalle@0
|
299
|
|
seanhalle@0
|
300 //===================== Measurement of Lang Overheads =====================
|
|
seanhalle@3
|
301 #include "Measurement/VSs_Measurement.h"
|
|
seanhalle@0
|
302
|
|
seanhalle@0
|
303 //===========================================================================
|
|
seanhalle@2
|
304 #endif /* _VSs_H */
|
|
seanhalle@0
|
305
|