Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VMS_impls > VMS__MC_shared_impl
view VMS.h @ 218:82f7defac851
Added backoff to core loop, cleaned up core loop code, cleaned comments
| author | Some Random Person <seanhalle@yahoo.com> |
|---|---|
| date | Sat, 10 Mar 2012 21:48:53 -0800 |
| parents | 10a72bcedbf0 |
| children | 8059fb8d5465 |
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 _VMS_H
10 #define _VMS_H
11 #define _GNU_SOURCE
13 #include "VMS_primitive_data_types.h"
14 #include "DynArray/DynArray.h"
15 #include "Hash_impl/PrivateHash.h"
16 #include "Histogram/Histogram.h"
17 #include "Queue_impl/PrivateQueue.h"
18 #include "vmalloc.h"
20 #include <pthread.h>
21 #include <sys/time.h>
23 //================= Defines: included from separate files =================
24 //
25 // Note: ALL defines are in other files, none are in here
26 //
27 #include "Defines/VMS_defs__main.h"
30 //================================ Typedefs =================================
31 //
32 typedef unsigned long long TSCount;
33 typedef union
34 { uint32 lowHigh[2];
35 uint64 longVal;
36 }
37 TSCountLowHigh;
39 typedef struct _SchedSlot SchedSlot;
40 typedef struct _VMSReqst VMSReqst;
41 typedef struct _SlaveVP SlaveVP;
42 typedef struct _MasterVP MasterVP;
43 typedef struct _IntervalProbe IntervalProbe;
44 typedef struct _GateStruc GateStruc;
47 typedef SlaveVP * (*Sched_Assigner) ( void *, int ); //semEnv, coreIdx
48 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
49 typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv
50 typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv
51 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
53 //============================ HW Dependent Fns ================================
55 #include "Hardware_Dependent/VMS__HW_measurement.h"
56 #include "Hardware_Dependent/VMS__primitives.h"
58 //============================= Statistics ==================================
60 inline TSCount getTSCount();
62 //============= Request Related ===========
63 //
65 enum VMSReqstType //avoid starting enums at 0, for debug reasons
66 {
67 semantic = 1,
68 createReq,
69 dissipate,
70 VMSSemantic //goes with VMSSemReqst below
71 };
73 struct _VMSReqst
74 {
75 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
76 void *semReqData;
78 VMSReqst *nextReqst;
79 };
80 //VMSReqst
82 enum VMSSemReqstType //These are equivalent to semantic requests, but for
83 { // VMS's services available directly to app, like OS
84 createProbe = 1, // and probe services -- like a VMS-wide built-in lang
85 openFile,
86 otherIO
87 };
89 typedef struct
90 { enum VMSSemReqstType reqType;
91 SlaveVP *requestingSlv;
92 char *nameStr; //for create probe
93 }
94 VMSSemReq;
97 //==================== Core data structures ===================
99 struct _SchedSlot
100 {
101 int workIsDone;
102 int needsSlaveAssigned;
103 SlaveVP *slaveAssignedToSlot;
104 };
105 //SchedSlot
107 /*WARNING: re-arranging this data structure could cause Slv switching
108 * assembly code to fail -- hard-codes offsets of fields
109 */
110 struct _SlaveVP
111 { int slaveID; //each slave given a unique ID
112 int coreAnimatedBy;
113 void *startOfStack;
114 void *stackPtr;
115 void *framePtr;
116 void *resumeInstrPtr;
118 void *coreCtlrStartPt; //allows proto-runtime to be linked later
119 void *coreCtlrFramePtr; //restore before jmp back to core controller
120 void *coreCtlrStackPtr; //restore before jmp back to core controller
122 SchedSlot *schedSlot;
123 VMSReqst *requests;
125 void *semanticData; //this is live for the life of Slv
126 void *dataRetFromReq;//Used to return vals from plugin to Wrapper Lib
128 //=========== MEASUREMENT STUFF ==========
129 MEAS__Insert_Meas_Fields_into_Slave;
130 //========================================
132 float64 createPtInSecs; //have space but don't use on some configs
133 };
134 //SlaveVP
137 /*WARNING: re-arranging this data structure could cause Slv-switching
138 * assembly code to fail -- hard-codes offsets of fields
139 * (because -O3 messes with things otherwise)
140 */
141 typedef struct
142 {
143 Sched_Assigner slaveAssigner;
144 RequestHandler requestHandler;
146 SchedSlot ***allSchedSlots;
147 VMSQueueStruc **readyToAnimateQs;
148 SlaveVP **masterVPs;
150 void *semanticEnv;
151 void *OSEventStruc; //for future, when add I/O to BLIS
152 MallocArrays *freeLists;
153 int32 amtOfOutstandingMem; //total currently allocated
155 void *coreCtlrReturnPt;//addr to jump to to re-enter coreCtlr
157 int32 setupComplete;
158 int32 numMasterInARow[NUM_CORES];//detect back-to-back masterVP
159 int32 masterLock __align_to_cacheline__;
160 GateStruc *workStealingGates[ NUM_CORES ]; //concurrent work-steal
161 int32 workStealingLock;
163 int32 numSlavesCreated; //gives ordering to processor creation
164 int32 numSlavesAlive; //used to detect when to shutdown
166 //=========== MEASUREMENT STUFF =============
167 IntervalProbe **intervalProbes;
168 PrivDynArrayInfo *dynIntervalProbesInfo;
169 HashTable *probeNameHashTbl;
170 int32 masterCreateProbeID;
171 float64 createPtInSecs;
172 Histogram **measHists;
173 PrivDynArrayInfo *measHistsInfo;
174 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
175 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
176 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
177 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
178 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
179 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
180 //==========================================
181 }
182 MasterEnv;
184 //========================= Extra Stuff Data Strucs =======================
185 typedef struct
186 {
188 }
189 VMSExcp;
191 struct _GateStruc
192 {
193 int32 gateClosed;
194 int32 preGateProgress;
195 int32 waitProgress;
196 int32 exitProgress;
197 };
198 //GateStruc
200 //======================= OS Thread related ===============================
202 void * coreController( void *paramsIn ); //standard PThreads fn prototype
203 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
204 void masterLoop( void *initData, SlaveVP *masterVP );
207 typedef struct
208 {
209 void *endThdPt;
210 unsigned int coreNum;
211 }
212 ThdParams;
214 //============================= Global Vars ================================
216 volatile MasterEnv *_VMSMasterEnv __align_to_cacheline__;
218 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
219 ThdParams *coreCtlrThdParams [ NUM_CORES ];
220 pthread_mutex_t suspendLock = PTHREAD_MUTEX_INITIALIZER;
221 pthread_cond_t suspendCond = PTHREAD_COND_INITIALIZER;
223 //========================= Function Prototypes ===========================
225 /* MEANING OF WL PI SS int
226 * These indicate which places the function is safe to use. They stand for:
227 * WL: Wrapper Library
228 * PI: Plugin
229 * SS: Startup and Shutdown
230 * int: internal to the VMS implementation
231 */
233 //========== Setup and shutdown ==========
234 void
235 VMS_SS__init();
237 //Fix;
238 /*seed-slaveVP creation -- put box around language, have lang register stuff
239 with VMS.
240 have main program explicitly INIT Lang! -- makes more sense to
241 C programmers -- makes it clear that there's a transition.
242 (might need to have the pthreads remain waiting for
243 cond until work is scheduled)
244 Have main do call to tell language to perform work -- like did with DKU
246 Ex: "HWSim__run_a_simulation(netlist, paramBag);"
247 "processID = SSR__run_program(seed_fn, seedData); "
248 "SSR__Wait_for_program_to_end(processID);"
249 "SSR__run_program_and_wait_till_it_ends(seed_fn, seedData);"
251 allows multiple languages to be started, and programs run in several,
252 overlapped, or one program to be run that uses multiple langs..?
253 So, each program is in separate directory:
254 "HWSim_ArchDef__PingPong" "SSR_Program__Blocked_Matrix_Mult"
256 Those programs can talk to each other, via VMS, by handles they each
257 return
258 "processIDs[0] = SSR__run_program(seed_fn1, seedData1);"
259 "processIDs[1] = SSR__run_program(seed_fn2, seedData2);"
260 "SSR__link_programs(processIDs, 2);"
261 or even
262 "processIDs[0] = Vthread__run_program(seed_fn1, seedData1);"
263 "processIDs[1] = SSR__run_program(seed_fn2, seedData2);"
264 "VMS__link_programs(processIDs, 2);"
265 Then, the programs just know they sync with other prog, but use own
266 lang's sync constructs -- VMS uses message system to establish tie-pt,
267 each lang defines what a tie-point means to it.. (work with the
268 diff semantics?)
269 */
270 void
271 VMS_SS__start_the_work_then_wait_until_done();
273 void
274 VMS_SS__shutdown();
276 void
277 VMS_SS__cleanup_at_end_of_shutdown();
280 //============== ===============
282 inline SlaveVP *
283 VMS_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
284 #define VMS_PI__create_slaveVP VMS_int__create_slaveVP
285 #define VMS_WL__create_slaveVP VMS_int__create_slaveVP
287 //Use this to create processor inside entry point & other places outside
288 // the VMS system boundary (IE, don't animate with a SlaveVP or MasterVP)
289 SlaveVP *
290 VMS_ext__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
292 inline SlaveVP *
293 VMS_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
294 void *dataParam, void *stackLocs );
296 inline void
297 VMS_int__point_slaveVP_to_Fn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
298 void *dataParam);
300 void
301 VMS_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
302 #define VMS_PI__dissipate_slaveVP VMS_int__dissipate_slaveVP
303 //WL: dissipate a SlaveVP by sending a request
305 void
306 VMS_ext__dissipate_slaveVP( SlaveVP *slaveToDissipate );
308 void
309 VMS_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
310 #define VMS_PI__throw_exception VMS_int__throw_exception
311 #define VMS_WL__throw_exception VMS_int__throw_exception
313 void *
314 VMS_int__give_sem_env_for( SlaveVP *animSlv );
315 #define VMS_PI__give_sem_env_for VMS_int__give_sem_env_for
316 #define VMS_SS__give_sem_env_for VMS_int__give_sem_env_for
317 //No WL version -- not safe! if use in WL, be sure data rd & wr is stable
319 //============== Request Related ===============
321 void
322 VMS_int__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
324 inline void
325 VMS_WL__add_sem_request_in_mallocd_VMSReqst( void *semReqData, SlaveVP *callingSlv );
327 inline void
328 VMS_WL__send_sem_request( void *semReqData, SlaveVP *callingSlv );
330 void
331 VMS_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
333 void inline
334 VMS_WL__send_dissipate_req( SlaveVP *prToDissipate );
336 inline void
337 VMS_WL__send_VMSSem_request( void *semReqData, SlaveVP *callingSlv );
339 VMSReqst *
340 VMS_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
342 inline void *
343 VMS_PI__take_sem_reqst_from( VMSReqst *req );
345 void inline
346 VMS_PI__handle_VMSSemReq( VMSReqst *req, SlaveVP *requestingSlv, void *semEnv,
347 ResumeSlvFnPtr resumeSlvFnPtr );
349 //======================== MEASUREMENT ======================
350 uint64
351 VMS_WL__give_num_plugin_cycles();
352 uint32
353 VMS_WL__give_num_plugin_animations();
356 //========================= Utilities =======================
357 inline char *
358 VMS_int__strDup( char *str );
361 //========================= Probes =======================
362 #include "Probes/probes.h"
364 //================================================
365 #endif /* _VMS_H */
