| rev |
line source |
|
Me@6
|
1 /*
|
|
seanhalle@81
|
2 * Copyright 2009 OpenSourceResearchInstitute.org
|
|
Me@6
|
3 * Licensed under GNU General Public License version 2
|
|
Me@6
|
4 *
|
|
Me@6
|
5 * Author: seanhalle@yahoo.com
|
|
Me@6
|
6 *
|
|
Me@6
|
7 */
|
|
Me@6
|
8
|
|
Me@6
|
9 #ifndef _SSR_H
|
|
Me@6
|
10 #define _SSR_H
|
|
Me@6
|
11
|
|
seanhalle@60
|
12 #include "Queue_impl/PrivateQueue.h"
|
|
seanhalle@60
|
13 #include "Hash_impl/PrivateHash.h"
|
|
seanhalle@60
|
14 #include "VMS_impl/VMS.h"
|
|
Nina@39
|
15 #include "dependency.h"
|
|
Me@6
|
16
|
|
Me@17
|
17
|
|
Me@17
|
18 //===========================================================================
|
|
Me@17
|
19 #define NUM_STRUCS_IN_SEM_ENV 1000
|
|
Me@17
|
20
|
|
nengel@72
|
21 //#define IDLE_SLAVES
|
|
nengel@72
|
22
|
|
seanhalle@62
|
23 //This is hardware dependent -- it's the number of cycles of scheduling
|
|
seanhalle@62
|
24 // overhead -- if a work unit is fewer than this, it is better being
|
|
seanhalle@62
|
25 // combined sequentially with other work
|
|
seanhalle@62
|
26 //This value depends on both VMS overhead and SSR's plugin. At some point
|
|
seanhalle@62
|
27 // it will be derived by perf-counter measurements during init of SSR
|
|
seanhalle@62
|
28 #define MIN_WORK_UNIT_CYCLES 20000
|
|
seanhalle@62
|
29
|
|
Me@17
|
30 //===========================================================================
|
|
Me@6
|
31 /*This header defines everything specific to the SSR semantic plug-in
|
|
Me@6
|
32 */
|
|
Me@6
|
33 typedef struct _SSRSemReq SSRSemReq;
|
|
Me@17
|
34 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
|
|
Me@17
|
35 //===========================================================================
|
|
Me@6
|
36
|
|
Me@6
|
37 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@67
|
38 * to request handler called in AnimationMaster
|
|
Me@6
|
39 */
|
|
Me@21
|
40
|
|
Me@21
|
41 typedef struct
|
|
Me@21
|
42 {
|
|
seanhalle@60
|
43 SlaveVP *VPCurrentlyExecuting;
|
|
Me@21
|
44 PrivQueueStruc *waitingVPQ;
|
|
Me@21
|
45 }
|
|
Me@21
|
46 SSRTrans;
|
|
Me@21
|
47
|
|
msach@24
|
48 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
msach@24
|
49 */
|
|
Me@21
|
50 typedef struct
|
|
Me@21
|
51 {
|
|
Me@22
|
52 void *endInstrAddr;
|
|
Me@21
|
53 int32 hasBeenStarted;
|
|
Me@21
|
54 int32 hasFinished;
|
|
Me@21
|
55 PrivQueueStruc *waitQ;
|
|
nengel@74
|
56 int executingVp;
|
|
nengel@74
|
57 int executingTask;
|
|
Me@21
|
58 }
|
|
Me@21
|
59 SSRSingleton;
|
|
Me@21
|
60
|
|
Me@6
|
61 enum SSRReqType
|
|
Me@6
|
62 {
|
|
Me@6
|
63 send_type = 1,
|
|
Me@6
|
64 send_from_to,
|
|
Me@6
|
65 receive_any, //order and grouping matter -- send before receive
|
|
Me@6
|
66 receive_type, // and receive_any first of the receives -- Handlers
|
|
Me@6
|
67 receive_from_to,// rely upon this ordering of enum
|
|
Me@6
|
68 transfer_to,
|
|
Me@17
|
69 transfer_out,
|
|
Me@17
|
70 malloc_req,
|
|
Me@17
|
71 free_req,
|
|
Me@21
|
72 singleton_fn_start,
|
|
Me@21
|
73 singleton_fn_end,
|
|
Me@21
|
74 singleton_data_start,
|
|
Me@21
|
75 singleton_data_end,
|
|
Me@17
|
76 atomic,
|
|
Me@17
|
77 trans_start,
|
|
Me@17
|
78 trans_end
|
|
Me@6
|
79 };
|
|
Me@6
|
80
|
|
Me@6
|
81 struct _SSRSemReq
|
|
Me@6
|
82 { enum SSRReqType reqType;
|
|
seanhalle@60
|
83 SlaveVP *sendPr;
|
|
seanhalle@60
|
84 SlaveVP *receivePr;
|
|
Me@17
|
85 int32 msgType;
|
|
Me@17
|
86 void *msg;
|
|
Me@6
|
87 SSRSemReq *nextReqInHashEntry;
|
|
Me@17
|
88
|
|
Me@17
|
89 void *initData;
|
|
seanhalle@60
|
90 TopLevelFnPtr fnPtr;
|
|
seanhalle@64
|
91 int32 coreToAssignOnto;
|
|
Me@17
|
92
|
|
Me@17
|
93 int32 sizeToMalloc;
|
|
Me@17
|
94 void *ptrToFree;
|
|
Me@17
|
95
|
|
Me@17
|
96 int32 singletonID;
|
|
Me@22
|
97 SSRSingleton **singletonPtrAddr;
|
|
Me@17
|
98
|
|
Me@17
|
99 PtrToAtomicFn fnToExecInMaster;
|
|
Me@17
|
100 void *dataForFn;
|
|
Me@17
|
101
|
|
Me@17
|
102 int32 transID;
|
|
Me@6
|
103 }
|
|
Me@6
|
104 /* SSRSemReq */;
|
|
Me@6
|
105
|
|
Me@17
|
106
|
|
Me@17
|
107 typedef struct
|
|
Me@17
|
108 {
|
|
Me@6
|
109 PrivQueueStruc **readyVPQs;
|
|
Me@14
|
110 HashTable *commHashTbl;
|
|
seanhalle@60
|
111 int32 numSlaveVP;
|
|
Me@14
|
112 int32 nextCoreToGetNewPr;
|
|
Me@14
|
113 int32 primitiveStartTime;
|
|
Me@17
|
114
|
|
Me@17
|
115 //fix limit on num with dynArray
|
|
Me@21
|
116 SSRSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
|
Me@17
|
117 SSRTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
|
Nina@39
|
118
|
|
seanhalle@60
|
119 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
|
|
nengel@47
|
120 ListOfArrays* unitList;
|
|
nengel@46
|
121 ListOfArrays* ctlDependenciesList;
|
|
nengel@46
|
122 ListOfArrays* commDependenciesList;
|
|
nengel@48
|
123 NtoN** ntonGroups;
|
|
nengel@48
|
124 PrivDynArrayInfo* ntonGroupsInfo;
|
|
nengel@49
|
125 ListOfArrays* dynDependenciesList;
|
|
nengel@74
|
126 ListOfArrays* singletonDependenciesList;
|
|
seanhalle@69
|
127 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
|
|
nengel@49
|
128 ListOfArrays* hwArcs;
|
|
nengel@73
|
129 int lastReqType;
|
|
Nina@39
|
130 #endif
|
|
nengel@50
|
131
|
|
seanhalle@60
|
132 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
|
|
nengel@56
|
133 ListOfArrays* counterList[NUM_CORES];
|
|
nengel@50
|
134 #endif
|
|
nengel@72
|
135 #ifdef IDLE_SLAVES
|
|
seanhalle@69
|
136 SlaveVP* idlePr[NUM_CORES][NUM_ANIM_SLOTS];
|
|
nengel@66
|
137 int shutdownInitiated;
|
|
nengel@72
|
138 #endif
|
|
Me@6
|
139 }
|
|
Me@6
|
140 SSRSemEnv;
|
|
Me@6
|
141
|
|
Me@6
|
142
|
|
seanhalle@78
|
143 typedef struct _DKUPiece DKUPiece;
|
|
seanhalle@78
|
144
|
|
seanhalle@78
|
145 typedef DKUPiece * (*DKUDividerFn ) ( DKUPiece * );
|
|
seanhalle@78
|
146
|
|
seanhalle@78
|
147 struct _DKUPiece
|
|
seanhalle@78
|
148 {
|
|
seanhalle@78
|
149 void *workData;
|
|
seanhalle@78
|
150 DKUPiece **subPieces;
|
|
seanhalle@78
|
151 void *infoForUndiv; //app creates own struct and casts
|
|
seanhalle@78
|
152 };
|
|
seanhalle@78
|
153 //DKUPiece
|
|
seanhalle@78
|
154
|
|
Me@17
|
155 typedef struct _TransListElem TransListElem;
|
|
Me@17
|
156 struct _TransListElem
|
|
Me@17
|
157 {
|
|
Me@17
|
158 int32 transID;
|
|
Me@17
|
159 TransListElem *nextTrans;
|
|
Me@17
|
160 };
|
|
Me@18
|
161 //TransListElem
|
|
Me@18
|
162
|
|
Me@17
|
163 typedef struct
|
|
Me@17
|
164 {
|
|
Me@17
|
165 int32 highestTransEntered;
|
|
Me@17
|
166 TransListElem *lastTransEntered;
|
|
Me@17
|
167 }
|
|
Me@17
|
168 SSRSemData;
|
|
Me@17
|
169
|
|
Me@6
|
170 //===========================================================================
|
|
Me@6
|
171
|
|
Me@6
|
172 void
|
|
seanhalle@60
|
173 SSR__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
Me@6
|
174
|
|
Me@14
|
175 int32
|
|
Me@14
|
176 SSR__giveMinWorkUnitCycles( float32 percentOverhead );
|
|
Me@14
|
177
|
|
Me@20
|
178 void
|
|
Me@14
|
179 SSR__start_primitive();
|
|
Me@14
|
180
|
|
Me@20
|
181 int32
|
|
Me@14
|
182 SSR__end_primitive_and_give_cycles();
|
|
Me@14
|
183
|
|
Me@16
|
184 int32
|
|
Me@16
|
185 SSR__giveIdealNumWorkUnits();
|
|
Me@14
|
186
|
|
Me@17
|
187 int32
|
|
Me@17
|
188 SSR__give_number_of_cores_to_schedule_onto();
|
|
Me@17
|
189
|
|
Me@6
|
190 //=======================
|
|
Me@6
|
191
|
|
Me@6
|
192 void
|
|
Me@6
|
193 SSR__init();
|
|
Me@6
|
194
|
|
Me@6
|
195 void
|
|
Me@6
|
196 SSR__cleanup_after_shutdown();
|
|
Me@6
|
197
|
|
Me@6
|
198 //=======================
|
|
Me@6
|
199
|
|
seanhalle@60
|
200 SlaveVP *
|
|
seanhalle@60
|
201 SSR__create_procr_with( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@60
|
202 SlaveVP *creatingSlv );
|
|
Me@6
|
203
|
|
seanhalle@60
|
204 SlaveVP *
|
|
seanhalle@60
|
205 SSR__create_procr_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@64
|
206 SlaveVP *creatingPr, int32 coreToAssignOnto);
|
|
Me@17
|
207
|
|
Me@6
|
208 void
|
|
seanhalle@60
|
209 SSR__dissipate_procr( SlaveVP *procrToDissipate );
|
|
Me@6
|
210
|
|
Me@6
|
211 //=======================
|
|
Me@6
|
212 void *
|
|
seanhalle@60
|
213 SSR__malloc_to( int numBytes, SlaveVP *ownerSlv );
|
|
Me@17
|
214
|
|
Me@17
|
215 void
|
|
seanhalle@60
|
216 SSR__free( void *ptrToFree, SlaveVP *owningSlv );
|
|
Me@6
|
217
|
|
Me@6
|
218 void
|
|
seanhalle@60
|
219 SSR__transfer_ownership_of_from_to( void *data, SlaveVP *oldOwnerPr,
|
|
seanhalle@60
|
220 SlaveVP *newOwnerSlv );
|
|
Me@6
|
221
|
|
Me@6
|
222 void
|
|
seanhalle@60
|
223 SSR__add_ownership_by_to( SlaveVP *newOwnerPr, void *data );
|
|
Me@6
|
224
|
|
Me@6
|
225 void
|
|
seanhalle@60
|
226 SSR__remove_ownership_by_from( SlaveVP *loserPr, void *dataLosing );
|
|
Me@6
|
227
|
|
Me@6
|
228 void
|
|
Me@6
|
229 SSR__transfer_ownership_to_outside( void *dataToTransferOwnershipOf );
|
|
Me@6
|
230
|
|
Me@6
|
231
|
|
Me@6
|
232
|
|
Me@6
|
233 //=======================
|
|
Me@6
|
234 void
|
|
seanhalle@60
|
235 SSR__send_of_type_to( SlaveVP *sendPr, void *msg, const int type,
|
|
seanhalle@60
|
236 SlaveVP *receivePr);
|
|
Me@6
|
237
|
|
Me@6
|
238 void
|
|
seanhalle@60
|
239 SSR__send_from_to( void *msg, SlaveVP *sendPr, SlaveVP *receivePr);
|
|
Me@6
|
240
|
|
Me@6
|
241 void *
|
|
seanhalle@60
|
242 SSR__receive_type_to( const int type, SlaveVP *receiveSlv );
|
|
Me@6
|
243
|
|
Me@6
|
244 void *
|
|
seanhalle@60
|
245 SSR__receive_from_to( SlaveVP *sendPr, SlaveVP *receiveSlv );
|
|
Me@6
|
246
|
|
Me@6
|
247
|
|
seanhalle@78
|
248
|
|
Me@17
|
249 //======================= Concurrency Stuff ======================
|
|
Me@17
|
250 void
|
|
seanhalle@60
|
251 SSR__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
Me@21
|
252
|
|
Me@21
|
253 void
|
|
seanhalle@60
|
254 SSR__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
Me@21
|
255
|
|
Me@21
|
256 void
|
|
seanhalle@60
|
257 SSR__start_data_singleton( SSRSingleton **singeltonAddr, SlaveVP *animSlv );
|
|
Me@21
|
258
|
|
Me@21
|
259 void
|
|
seanhalle@60
|
260 SSR__end_data_singleton( SSRSingleton **singletonAddr, SlaveVP *animSlv );
|
|
Me@6
|
261
|
|
Me@6
|
262 void
|
|
Me@17
|
263 SSR__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@60
|
264 void *data, SlaveVP *animSlv );
|
|
Me@17
|
265
|
|
Me@17
|
266 void
|
|
seanhalle@60
|
267 SSR__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
Me@17
|
268
|
|
Me@17
|
269 void
|
|
seanhalle@60
|
270 SSR__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
Me@6
|
271
|
|
Me@6
|
272
|
|
Me@6
|
273 //========================= Internal use only =============================
|
|
Me@6
|
274 void
|
|
seanhalle@60
|
275 SSR__Request_Handler( SlaveVP *requestingPr, void *_semEnv );
|
|
Me@6
|
276
|
|
seanhalle@60
|
277 SlaveVP *
|
|
seanhalle@67
|
278 SSR__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
|
|
Me@6
|
279
|
|
seanhalle@60
|
280 SlaveVP*
|
|
seanhalle@60
|
281 SSR__create_procr_helper( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@64
|
282 SSRSemEnv *semEnv, int32 coreToAssignOnto );
|
|
Me@6
|
283
|
|
seanhalle@64
|
284 //===================== Measurement of Lang Overheads =====================
|
|
seanhalle@64
|
285 #include "SSR_Measurement.h"
|
|
seanhalle@64
|
286
|
|
seanhalle@64
|
287 //===========================================================================
|
|
Me@6
|
288 #endif /* _SSR_H */
|
|
Me@6
|
289
|