view VSs.h @ 3:468b8638ff92

Works -- first working version, includes slave pruning and shutdown detection
author Sean Halle <seanhalle@yahoo.com>
date Wed, 06 Jun 2012 17:55:36 -0700
parents f2ed1c379fe7
children 13af59ed7ea5
line source
1 /*
2 * Copyright 2009 OpenSourceStewardshipFoundation.org
3 * Licensed under GNU General Public License version 2
4 *
5 * Author: seanhalle@yahoo.com
6 *
7 */
9 #ifndef _VSs_H
10 #define _VSs_H
12 #include "Queue_impl/PrivateQueue.h"
13 #include "Hash_impl/PrivateHash.h"
14 #include "VMS_impl/VMS.h"
15 #include "Measurement/dependency.h"
18 //===========================================================================
19 #define NUM_STRUCS_IN_SEM_ENV 1000
21 //This is hardware dependent -- it's the number of cycles of scheduling
22 // overhead -- if a work unit is fewer than this, it is better being
23 // combined sequentially with other work
24 //This value depends on both VMS overhead and VSs's plugin. At some point
25 // it will be derived by perf-counter measurements during init of VSs
26 #define MIN_WORK_UNIT_CYCLES 20000
28 //===========================================================================
29 /*This header defines everything specific to the VSs semantic plug-in
30 */
31 typedef struct _VSsSemReq VSsSemReq;
32 typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *);
33 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
34 //===========================================================================
36 #define IN 1
37 #define OUT 2
38 #define INOUT 2
40 #define READER 1
41 #define WRITER 2
43 typedef struct
44 {
45 VSsTaskFnPtr fn;
46 int32 numTotalArgs;//the number of inputs to function
47 int32 numCtldArgs;//how many of args have dependencies
48 int32 *argTypes; //says reader, writer, or non-ctld
49 int32 *argSizes; //for detecting overlap
50 int32 sizeOfArgs; //for memcpy of args struct
51 }
52 VSsTaskType;
55 typedef struct
56 {
57 bool32 hasEnabledNonFinishedWriter;
58 int32 numEnabledNonDoneReaders;
59 PrivQueueStruc *waitersQ;
60 }
61 VSsPointerEntry;
63 typedef struct
64 {
65 void **args; //ctld args must come first, as ptrs
66 VSsTaskType *taskType;
67 int32 numBlockingProp;
68 SlaveVP *slaveAssignedTo;
69 VSsPointerEntry **ptrEntries;
70 }
71 VSsTaskStub;
73 typedef struct
74 {
75 VSsTaskStub *taskStub;
76 int32 argNum;
77 int32 isReader;
78 }
79 VSsTaskStubCarrier;
82 typedef struct
83 {
84 int32 type;
85 VSsTaskStub *taskStub;
86 }
87 VSsWaiterCarrier;
89 /*Semantic layer-specific data sent inside a request from lib called in app
90 * to request handler called in AnimationMaster
91 */
93 typedef struct
94 {
95 SlaveVP *VPCurrentlyExecuting;
96 PrivQueueStruc *waitingVPQ;
97 }
98 VSsTrans;
100 /*WARNING: assembly hard-codes position of endInstrAddr as first field
101 */
102 typedef struct
103 {
104 void *endInstrAddr;
105 int32 hasBeenStarted;
106 int32 hasFinished;
107 PrivQueueStruc *waitQ;
108 }
109 VSsSingleton;
111 enum VSsReqType
112 {
113 submit_task = 1,
114 end_task,
115 create_slave,
116 create_slave_w_aff,
117 dissipate_slave,
118 //===============================
119 malloc_req,
120 free_req,
121 singleton_fn_start,
122 singleton_fn_end,
123 singleton_data_start,
124 singleton_data_end,
125 atomic,
126 trans_start,
127 trans_end
128 };
130 struct _VSsSemReq
131 { enum VSsReqType reqType;
132 SlaveVP *callingSlv;
133 VSsTaskType *taskType;
134 void *args;
135 VSsTaskStub *taskStub;
137 TopLevelFnPtr fnPtr;
138 void *initData;
139 int32 coreToAssignOnto;
141 int32 sizeToMalloc;
142 void *ptrToFree;
144 int32 singletonID;
145 VSsSingleton **singletonPtrAddr;
147 PtrToAtomicFn fnToExecInMaster;
148 void *dataForFn;
150 int32 transID;
151 }
152 /* VSsSemReq */;
155 typedef struct
156 {
157 PrivQueueStruc **readyVPQs;
158 PrivQueueStruc *taskReadyQ; //Q: shared or local?
159 HashTable *argPtrHashTbl;
160 int32 numSlaveVP;
161 int32 nextCoreToGetNewSlv;
162 int32 primitiveStartTime;
164 //fix limit on num with dynArray
165 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
166 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
168 bool32 *coreIsDone;
169 int32 numCoresDone;
171 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
172 ListOfArrays* unitList;
173 ListOfArrays* ctlDependenciesList;
174 ListOfArrays* commDependenciesList;
175 NtoN** ntonGroups;
176 PrivDynArrayInfo* ntonGroupsInfo;
177 ListOfArrays* dynDependenciesList;
178 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
179 ListOfArrays* hwArcs;
180 #endif
182 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
183 ListOfArrays* counterList[NUM_CORES];
184 #endif
185 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
186 int shutdownInitiated;
187 }
188 VSsSemEnv;
191 typedef struct _TransListElem TransListElem;
192 struct _TransListElem
193 {
194 int32 transID;
195 TransListElem *nextTrans;
196 };
197 //TransListElem
199 typedef struct
200 {
201 int32 highestTransEntered;
202 TransListElem *lastTransEntered;
203 bool32 needsTaskAssigned;
204 VSsTaskStub *taskStub;
205 }
206 VSsSemData;
208 //===========================================================================
210 void
211 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
213 int32
214 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
216 void
217 VSs__start_primitive();
219 int32
220 VSs__end_primitive_and_give_cycles();
222 int32
223 VSs__giveIdealNumWorkUnits();
225 int32
226 VSs__give_number_of_cores_to_schedule_onto();
228 //=======================
230 void
231 VSs__init();
233 void
234 VSs__cleanup_after_shutdown();
236 //=======================
238 SlaveVP *
239 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
240 SlaveVP *creatingSlv );
242 SlaveVP *
243 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
244 SlaveVP *creatingSlv, int32 coreToAssignOnto);
246 void
247 VSs__dissipate_slave( SlaveVP *slaveToDissipate );
249 //=======================
251 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
253 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
256 //=======================
257 int32
258 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
261 void
262 VSs__end_task( SlaveVP *animSlv );
265 //======================= Concurrency Stuff ======================
266 void
267 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
269 void
270 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
272 void
273 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
275 void
276 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
278 void
279 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
280 void *data, SlaveVP *animSlv );
282 void
283 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
285 void
286 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
289 //========================= Internal use only =============================
290 void
291 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
293 SlaveVP *
294 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
296 SlaveVP*
297 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
298 VSsSemEnv *semEnv, int32 coreToAssignOnto );
300 //===================== Measurement of Lang Overheads =====================
301 #include "Measurement/VSs_Measurement.h"
303 //===========================================================================
304 #endif /* _VSs_H */