annotate VSs.h @ 26:a60399b62614

Update.. in middle of changes..
author Sean Halle <seanhalle@yahoo.com>
date Thu, 18 Oct 2012 02:44:30 -0700
parents b2bc97318262
children 3b30da4643d1
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@26 14 #include "PR_impl/PR.h"
seanhalle@3 15 #include "Measurement/dependency.h"
seanhalle@0 16
seanhalle@0 17
seanhalle@0 18 //===========================================================================
seanhalle@26 19 //uniquely identifies VSs -- should be a jenkins char-hash of "VSs" to int32
seanhalle@26 20 #define VSs_MAGIC_NUMBER 0000000001
seanhalle@26 21
seanhalle@0 22 #define NUM_STRUCS_IN_SEM_ENV 1000
seanhalle@0 23
seanhalle@0 24 //This is hardware dependent -- it's the number of cycles of scheduling
seanhalle@0 25 // overhead -- if a work unit is fewer than this, it is better being
seanhalle@0 26 // combined sequentially with other work
seanhalle@26 27 //This value depends on both PR overhead and VSs's plugin. At some point
seanhalle@2 28 // it will be derived by perf-counter measurements during init of VSs
seanhalle@0 29 #define MIN_WORK_UNIT_CYCLES 20000
seanhalle@0 30
seanhalle@0 31 //===========================================================================
seanhalle@2 32 /*This header defines everything specific to the VSs semantic plug-in
seanhalle@0 33 */
seanhalle@26 34 typedef struct _VSsSemReq VSsSemReq;
seanhalle@26 35 typedef struct _VSsTaskStub VSsTaskStub;
seanhalle@3 36 typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *);
seanhalle@2 37 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
seanhalle@0 38 //===========================================================================
seanhalle@0 39
seanhalle@4 40 #define NONCTLD 0
seanhalle@4 41 #define IN 1 /*Trick -- READER same as IN*/
seanhalle@4 42 #define OUT 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@4 43 #define INOUT 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@2 44
seanhalle@4 45 #define READER 1 /*Trick -- READER same as IN*/
seanhalle@4 46 #define WRITER 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@1 47
seanhalle@8 48 #define IS_A_THREAD NULL
seanhalle@8 49 #define IS_ENDED NULL
seanhalle@8 50 #define SEED_SLV NULL
seanhalle@8 51
seanhalle@26 52 #define NO_ID NULL
seanhalle@26 53 #define ANY_CORE -1
seanhalle@26 54
seanhalle@26 55 //===========================================================================
seanhalle@1 56 typedef struct
seanhalle@1 57 {
seanhalle@1 58 VSsTaskFnPtr fn;
seanhalle@2 59 int32 numTotalArgs;//the number of inputs to function
seanhalle@2 60 int32 numCtldArgs;//how many of args have dependencies
seanhalle@2 61 int32 *argTypes; //says reader, writer, or non-ctld
seanhalle@2 62 int32 *argSizes; //for detecting overlap
seanhalle@2 63 int32 sizeOfArgs; //for memcpy of args struct
seanhalle@1 64 }
seanhalle@1 65 VSsTaskType;
seanhalle@1 66
seanhalle@1 67
seanhalle@2 68 typedef struct
seanhalle@2 69 {
seanhalle@3 70 bool32 hasEnabledNonFinishedWriter;
seanhalle@3 71 int32 numEnabledNonDoneReaders;
seanhalle@3 72 PrivQueueStruc *waitersQ;
seanhalle@3 73 }
seanhalle@3 74 VSsPointerEntry;
seanhalle@3 75
seanhalle@26 76 /*This is placed into semData, used for dependencies and wait construct*/
seanhalle@26 77 struct _VSsTaskStub
seanhalle@3 78 {
seanhalle@26 79 int32 langMagicNumber; //magic num must be 1st field of langMetaTask
seanhalle@26 80 PRMetaTask *protoMetaTask; //back-link must always be 2nd field
seanhalle@26 81 void **args; //ctld args must be the first ones (as ptrs)
seanhalle@26 82 VSsPointerEntry **ptrEntries;
seanhalle@26 83 int32 numBlockingProp;
seanhalle@26 84
seanhalle@26 85 VSsTaskType *taskType; //has VSs lang related info
seanhalle@26 86
seanhalle@26 87 VSsTaskStub *parentTaskStub; //for liveness, for the wait construct
seanhalle@8 88 int32 numLiveChildTasks;
seanhalle@8 89 int32 numLiveChildThreads;
seanhalle@8 90 bool32 isWaitingForChildTasksToEnd;
seanhalle@8 91 bool32 isWaitingForChildThreadsToEnd;
seanhalle@8 92 bool32 isEnded;
seanhalle@26 93 };
nengel@5 94
seanhalle@2 95
seanhalle@2 96 typedef struct
seanhalle@2 97 {
seanhalle@2 98 VSsTaskStub *taskStub;
seanhalle@2 99 int32 argNum;
seanhalle@2 100 int32 isReader;
seanhalle@2 101 }
seanhalle@2 102 VSsTaskStubCarrier;
seanhalle@2 103
seanhalle@2 104
seanhalle@0 105 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@0 106 * to request handler called in AnimationMaster
seanhalle@0 107 */
seanhalle@0 108
seanhalle@0 109 typedef struct
seanhalle@0 110 {
seanhalle@0 111 SlaveVP *VPCurrentlyExecuting;
seanhalle@0 112 PrivQueueStruc *waitingVPQ;
seanhalle@0 113 }
seanhalle@2 114 VSsTrans;
seanhalle@0 115
seanhalle@0 116 /*WARNING: assembly hard-codes position of endInstrAddr as first field
seanhalle@0 117 */
seanhalle@0 118 typedef struct
seanhalle@0 119 {
seanhalle@0 120 void *endInstrAddr;
seanhalle@0 121 int32 hasBeenStarted;
seanhalle@0 122 int32 hasFinished;
seanhalle@0 123 PrivQueueStruc *waitQ;
seanhalle@0 124 }
seanhalle@2 125 VSsSingleton;
seanhalle@0 126
seanhalle@2 127 enum VSsReqType
seanhalle@0 128 {
seanhalle@2 129 submit_task = 1,
seanhalle@2 130 end_task,
seanhalle@2 131 create_slave,
seanhalle@2 132 create_slave_w_aff,
seanhalle@2 133 dissipate_slave,
seanhalle@2 134 //===============================
seanhalle@4 135 send_type_to,
seanhalle@4 136 receive_type_to,
seanhalle@4 137 send_from_to,
seanhalle@4 138 receive_from_to,
seanhalle@4 139 //===============================
nengel@5 140 taskwait,
seanhalle@0 141 malloc_req,
seanhalle@0 142 free_req,
seanhalle@0 143 singleton_fn_start,
seanhalle@0 144 singleton_fn_end,
seanhalle@0 145 singleton_data_start,
seanhalle@0 146 singleton_data_end,
seanhalle@0 147 atomic,
seanhalle@0 148 trans_start,
seanhalle@0 149 trans_end
seanhalle@0 150 };
seanhalle@0 151
seanhalle@2 152 struct _VSsSemReq
seanhalle@2 153 { enum VSsReqType reqType;
seanhalle@2 154 SlaveVP *callingSlv;
seanhalle@2 155 VSsTaskType *taskType;
seanhalle@2 156 void *args;
seanhalle@26 157 // VSsTaskStub *taskStub; //not needed -- get via PR accessor from slv
seanhalle@2 158
seanhalle@4 159 SlaveVP *senderSlv;
seanhalle@4 160 SlaveVP *receiverSlv;
seanhalle@4 161 int32 *senderID;
seanhalle@4 162 int32 *receiverID;
seanhalle@4 163 int32 msgType;
seanhalle@4 164 void *msg;
seanhalle@4 165 VSsSemReq *nextReqInHashEntry;
seanhalle@26 166 //In PRReq: int32 *taskID;
seanhalle@4 167
seanhalle@2 168 TopLevelFnPtr fnPtr;
seanhalle@0 169 void *initData;
seanhalle@0 170 int32 coreToAssignOnto;
seanhalle@0 171
seanhalle@26 172 //These, below, should move to util language..
seanhalle@0 173 int32 sizeToMalloc;
seanhalle@0 174 void *ptrToFree;
seanhalle@0 175
seanhalle@0 176 int32 singletonID;
seanhalle@2 177 VSsSingleton **singletonPtrAddr;
seanhalle@0 178
seanhalle@0 179 PtrToAtomicFn fnToExecInMaster;
seanhalle@0 180 void *dataForFn;
seanhalle@0 181
seanhalle@0 182 int32 transID;
seanhalle@0 183 }
seanhalle@2 184 /* VSsSemReq */;
seanhalle@0 185
seanhalle@0 186
seanhalle@0 187 typedef struct
seanhalle@26 188 { PRSemEnv *protoSemEnv;
seanhalle@9 189 PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned)
seanhalle@26 190 PrivQueueStruc *freeTaskSlvRecycleQ; //Shared
seanhalle@9 191 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
seanhalle@26 192 // SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@2 193 HashTable *argPtrHashTbl;
seanhalle@4 194 HashTable *commHashTbl;
seanhalle@26 195 // int32 numLiveFreeTaskSlvs;
seanhalle@26 196 // int32 numLiveThreadSlvs;
seanhalle@3 197 int32 nextCoreToGetNewSlv;
seanhalle@0 198 int32 primitiveStartTime;
seanhalle@0 199
seanhalle@0 200 //fix limit on num with dynArray
seanhalle@2 201 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
seanhalle@2 202 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
seanhalle@3 203
seanhalle@26 204 // bool32 *coreIsDone;
seanhalle@26 205 // int32 numCoresDone;
seanhalle@26 206
seanhalle@26 207 // SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@26 208 // int shutdownInitiated;
seanhalle@0 209
seanhalle@0 210 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
seanhalle@0 211 ListOfArrays* unitList;
seanhalle@0 212 ListOfArrays* ctlDependenciesList;
seanhalle@0 213 ListOfArrays* commDependenciesList;
seanhalle@0 214 NtoN** ntonGroups;
seanhalle@0 215 PrivDynArrayInfo* ntonGroupsInfo;
seanhalle@0 216 ListOfArrays* dynDependenciesList;
seanhalle@0 217 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
seanhalle@0 218 ListOfArrays* hwArcs;
seanhalle@0 219 #endif
seanhalle@0 220
seanhalle@0 221 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@0 222 ListOfArrays* counterList[NUM_CORES];
seanhalle@0 223 #endif
seanhalle@0 224 }
seanhalle@2 225 VSsSemEnv;
seanhalle@0 226
seanhalle@0 227
seanhalle@0 228 typedef struct _TransListElem TransListElem;
seanhalle@0 229 struct _TransListElem
seanhalle@0 230 {
seanhalle@0 231 int32 transID;
seanhalle@0 232 TransListElem *nextTrans;
seanhalle@0 233 };
seanhalle@0 234 //TransListElem
seanhalle@0 235
seanhalle@26 236 /* PR now handles what this used to be used for
seanhalle@8 237 enum VSsSlvType
seanhalle@26 238 { FreeTaskSlv = 1,
seanhalle@10 239 SlotTaskSlv,
seanhalle@10 240 ThreadSlv
seanhalle@8 241 };
seanhalle@26 242 */
nengel@5 243
seanhalle@0 244 typedef struct
seanhalle@0 245 {
seanhalle@26 246 int32 highestTransEntered;
seanhalle@26 247 TransListElem *lastTransEntered;
seanhalle@26 248 int32 primitiveStartTime;
seanhalle@26 249 // VSsTaskStub *taskStub; //get from slave via PR accessor
seanhalle@0 250 }
seanhalle@2 251 VSsSemData;
seanhalle@0 252
seanhalle@0 253 //===========================================================================
seanhalle@0 254
seanhalle@0 255 void
seanhalle@2 256 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
seanhalle@0 257
seanhalle@0 258 int32
seanhalle@2 259 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
seanhalle@0 260
seanhalle@0 261 void
seanhalle@26 262 VSs__begin_primitive();
seanhalle@0 263
seanhalle@0 264 int32
seanhalle@2 265 VSs__end_primitive_and_give_cycles();
seanhalle@0 266
seanhalle@0 267 int32
seanhalle@2 268 VSs__giveIdealNumWorkUnits();
seanhalle@0 269
seanhalle@0 270 int32
seanhalle@2 271 VSs__give_number_of_cores_to_schedule_onto();
seanhalle@0 272
seanhalle@0 273 //=======================
seanhalle@0 274
seanhalle@0 275 void
seanhalle@26 276 VSs__start( SlaveVP *seedSlv );
seanhalle@0 277
seanhalle@0 278 void
seanhalle@2 279 VSs__cleanup_after_shutdown();
seanhalle@0 280
seanhalle@0 281 //=======================
seanhalle@0 282
seanhalle@4 283 SlaveVP *
seanhalle@7 284 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 285 SlaveVP *creatingThd );
seanhalle@0 286
seanhalle@0 287 void
seanhalle@7 288 VSs__end_thread( SlaveVP *thdToEnd );
seanhalle@0 289
seanhalle@0 290 //=======================
seanhalle@2 291
seanhalle@26 292 #define VSs__malloc( numBytes, callingSlave ) PR_App__malloc( numBytes, callingSlave)
seanhalle@2 293
seanhalle@26 294 #define VSs__free(ptrToFree, callingSlave ) PR_App__free( ptrToFree, callingSlave )
seanhalle@2 295
seanhalle@2 296
seanhalle@2 297 //=======================
seanhalle@4 298 void
seanhalle@3 299 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
seanhalle@2 300
seanhalle@4 301 inline int32 *
seanhalle@4 302 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
seanhalle@4 303
seanhalle@4 304 void
seanhalle@4 305 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
seanhalle@4 306 SlaveVP *animSlv);
seanhalle@0 307
seanhalle@0 308 void
seanhalle@2 309 VSs__end_task( SlaveVP *animSlv );
seanhalle@0 310
seanhalle@4 311 //=========================
nengel@5 312 void
nengel@5 313 VSs__taskwait(SlaveVP *animSlv);
nengel@5 314
seanhalle@4 315
seanhalle@4 316 inline int32 *
seanhalle@4 317 VSs__give_self_taskID( SlaveVP *animSlv );
seanhalle@4 318
seanhalle@4 319 void
seanhalle@4 320 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
seanhalle@4 321 SlaveVP *senderSlv );
seanhalle@4 322
seanhalle@4 323 void
seanhalle@4 324 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
seanhalle@4 325
seanhalle@4 326 void *
seanhalle@4 327 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
seanhalle@4 328
seanhalle@4 329 void *
seanhalle@4 330 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
seanhalle@0 331
seanhalle@0 332 //======================= Concurrency Stuff ======================
seanhalle@0 333 void
seanhalle@2 334 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 335
seanhalle@0 336 void
seanhalle@2 337 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 338
seanhalle@0 339 void
seanhalle@2 340 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
seanhalle@0 341
seanhalle@0 342 void
seanhalle@2 343 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
seanhalle@0 344
seanhalle@0 345 void
seanhalle@2 346 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@0 347 void *data, SlaveVP *animSlv );
seanhalle@0 348
seanhalle@0 349 void
seanhalle@2 350 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 351
seanhalle@0 352 void
seanhalle@2 353 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 354
seanhalle@0 355
seanhalle@0 356 //========================= Internal use only =============================
seanhalle@0 357 void
seanhalle@3 358 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
seanhalle@0 359
seanhalle@0 360 SlaveVP *
seanhalle@2 361 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
seanhalle@0 362
seanhalle@0 363 SlaveVP*
seanhalle@2 364 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@2 365 VSsSemEnv *semEnv, int32 coreToAssignOnto );
seanhalle@0 366
seanhalle@26 367 PRMetaTask *
seanhalle@26 368 PR_int__create_generic_slave_meta_task( void *initData );
seanhalle@7 369
seanhalle@7 370
seanhalle@7 371 SlaveVP *
seanhalle@7 372 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 373 SlaveVP *creatingSlv );
seanhalle@7 374
seanhalle@7 375 SlaveVP *
seanhalle@7 376 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 377 SlaveVP *creatingSlv, int32 coreToAssignOnto);
seanhalle@7 378
seanhalle@0 379 //===================== Measurement of Lang Overheads =====================
seanhalle@3 380 #include "Measurement/VSs_Measurement.h"
seanhalle@0 381
seanhalle@0 382 //===========================================================================
seanhalle@2 383 #endif /* _VSs_H */
seanhalle@0 384