annotate VSs.h @ 23:3787df8b95f9

seedSlv gets taskID -1, assigner initiates shutdown if deadlock detected, more explicit debug messages
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Fri, 01 Feb 2013 17:18:57 +0100
parents feea343d202f
children 227db52cbd93
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
nengel@18 17 /* Switch for Nexus support
nengel@18 18 * Note: nexus incompatible with holistic recording (constraints not accessible)
nengel@18 19 * But counter recording still functional, can build constraintless display
nengel@18 20 * with wallclock time
nengel@18 21 */
nengel@20 22 //#define EXTERNAL_SCHEDULER
nengel@20 23 //#define SIMULATE_EXTERNAL_SCHEDULER
seanhalle@0 24
seanhalle@0 25 //===========================================================================
seanhalle@0 26 #define NUM_STRUCS_IN_SEM_ENV 1000
seanhalle@0 27
nengel@22 28 #define MAX_TASKS_NUM 256
nengel@22 29
seanhalle@0 30 //This is hardware dependent -- it's the number of cycles of scheduling
seanhalle@0 31 // overhead -- if a work unit is fewer than this, it is better being
seanhalle@0 32 // combined sequentially with other work
seanhalle@2 33 //This value depends on both VMS overhead and VSs's plugin. At some point
seanhalle@2 34 // it will be derived by perf-counter measurements during init of VSs
seanhalle@0 35 #define MIN_WORK_UNIT_CYCLES 20000
seanhalle@0 36
seanhalle@0 37 //===========================================================================
seanhalle@2 38 /*This header defines everything specific to the VSs semantic plug-in
seanhalle@0 39 */
seanhalle@2 40 typedef struct _VSsSemReq VSsSemReq;
seanhalle@3 41 typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *);
seanhalle@2 42 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
seanhalle@0 43 //===========================================================================
seanhalle@0 44
seanhalle@4 45 #define NONCTLD 0
seanhalle@4 46 #define IN 1 /*Trick -- READER same as IN*/
seanhalle@4 47 #define OUT 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@4 48 #define INOUT 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@2 49
seanhalle@4 50 #define READER 1 /*Trick -- READER same as IN*/
seanhalle@4 51 #define WRITER 2 /*Trick -- WRITER same as OUT and INOUT*/
seanhalle@1 52
seanhalle@8 53 #define IS_A_THREAD NULL
seanhalle@8 54 #define IS_ENDED NULL
seanhalle@8 55 #define SEED_SLV NULL
seanhalle@8 56
seanhalle@1 57 typedef struct
seanhalle@1 58 {
seanhalle@1 59 VSsTaskFnPtr fn;
seanhalle@2 60 int32 numTotalArgs;//the number of inputs to function
seanhalle@2 61 int32 numCtldArgs;//how many of args have dependencies
seanhalle@2 62 int32 *argTypes; //says reader, writer, or non-ctld
seanhalle@2 63 int32 *argSizes; //for detecting overlap
seanhalle@2 64 int32 sizeOfArgs; //for memcpy of args struct
seanhalle@1 65 }
seanhalle@1 66 VSsTaskType;
seanhalle@1 67
seanhalle@1 68
seanhalle@2 69 typedef struct
seanhalle@2 70 {
seanhalle@3 71 bool32 hasEnabledNonFinishedWriter;
seanhalle@3 72 int32 numEnabledNonDoneReaders;
seanhalle@3 73 PrivQueueStruc *waitersQ;
nengel@16 74 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@17 75 Unit lastWriter;
nengel@17 76 ListOfArrays* readersSinceLastWriter;
nengel@16 77 #endif
seanhalle@3 78 }
seanhalle@3 79 VSsPointerEntry;
seanhalle@3 80
seanhalle@6 81 typedef struct
seanhalle@3 82 {
seanhalle@2 83 void **args; //ctld args must come first, as ptrs
seanhalle@2 84 VSsTaskType *taskType;
seanhalle@4 85 int32 *taskID;
seanhalle@2 86 int32 numBlockingProp;
seanhalle@10 87 SlaveVP *slaveAssignedTo; //only valid before end task (thread)
seanhalle@3 88 VSsPointerEntry **ptrEntries;
nengel@11 89 void* parentTaskStub;
seanhalle@8 90 int32 numLiveChildTasks;
seanhalle@8 91 int32 numLiveChildThreads;
seanhalle@8 92 bool32 isWaitingForChildTasksToEnd;
seanhalle@8 93 bool32 isWaitingForChildThreadsToEnd;
seanhalle@8 94 bool32 isEnded;
nengel@17 95 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@17 96 Unit parentUnit;
nengel@21 97 Unit firstOfTask;
nengel@17 98 #endif
seanhalle@2 99 }
seanhalle@6 100 VSsTaskStub;
nengel@5 101
seanhalle@2 102
seanhalle@2 103 typedef struct
seanhalle@2 104 {
seanhalle@2 105 VSsTaskStub *taskStub;
seanhalle@2 106 int32 argNum;
seanhalle@2 107 int32 isReader;
nengel@21 108 bool32 isSuspended;
seanhalle@2 109 }
seanhalle@2 110 VSsTaskStubCarrier;
seanhalle@2 111
seanhalle@2 112
seanhalle@0 113 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@0 114 * to request handler called in AnimationMaster
seanhalle@0 115 */
seanhalle@0 116
seanhalle@0 117 typedef struct
seanhalle@0 118 {
seanhalle@0 119 SlaveVP *VPCurrentlyExecuting;
seanhalle@0 120 PrivQueueStruc *waitingVPQ;
seanhalle@0 121 }
seanhalle@2 122 VSsTrans;
seanhalle@0 123
seanhalle@0 124 /*WARNING: assembly hard-codes position of endInstrAddr as first field
seanhalle@0 125 */
seanhalle@0 126 typedef struct
seanhalle@0 127 {
seanhalle@0 128 void *endInstrAddr;
seanhalle@0 129 int32 hasBeenStarted;
seanhalle@0 130 int32 hasFinished;
seanhalle@0 131 PrivQueueStruc *waitQ;
nengel@17 132 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@17 133 Unit executingUnit;
nengel@17 134 #endif
seanhalle@0 135 }
seanhalle@2 136 VSsSingleton;
seanhalle@0 137
nengel@21 138 typedef struct
nengel@21 139 {
nengel@21 140 int32 isOccupied;
nengel@21 141 PrivQueueStruc *waitQ;
nengel@21 142 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@21 143 Unit previous;
nengel@21 144 #endif
nengel@21 145 }
nengel@21 146 VSsCritical;
nengel@21 147
seanhalle@2 148 enum VSsReqType
seanhalle@0 149 {
seanhalle@2 150 submit_task = 1,
seanhalle@2 151 end_task,
seanhalle@2 152 create_slave,
seanhalle@2 153 create_slave_w_aff,
seanhalle@2 154 dissipate_slave,
seanhalle@2 155 //===============================
seanhalle@4 156 send_type_to,
seanhalle@4 157 receive_type_to,
seanhalle@4 158 send_from_to,
seanhalle@4 159 receive_from_to,
seanhalle@4 160 //===============================
nengel@5 161 taskwait,
nengel@21 162 taskwait_on,
nengel@21 163 critical_start,
nengel@21 164 critical_end,
seanhalle@0 165 malloc_req,
seanhalle@0 166 free_req,
seanhalle@0 167 singleton_fn_start,
seanhalle@0 168 singleton_fn_end,
seanhalle@0 169 singleton_data_start,
seanhalle@0 170 singleton_data_end,
seanhalle@0 171 atomic,
seanhalle@0 172 trans_start,
seanhalle@0 173 trans_end
seanhalle@0 174 };
seanhalle@0 175
seanhalle@2 176 struct _VSsSemReq
seanhalle@2 177 { enum VSsReqType reqType;
seanhalle@2 178 SlaveVP *callingSlv;
seanhalle@2 179 VSsTaskType *taskType;
seanhalle@2 180 void *args;
seanhalle@2 181 VSsTaskStub *taskStub;
seanhalle@2 182
seanhalle@4 183 SlaveVP *senderSlv;
seanhalle@4 184 SlaveVP *receiverSlv;
seanhalle@4 185 int32 *senderID;
seanhalle@4 186 int32 *receiverID;
seanhalle@4 187 int32 msgType;
seanhalle@4 188 void *msg;
seanhalle@4 189 VSsSemReq *nextReqInHashEntry;
seanhalle@4 190 int32 *taskID;
seanhalle@4 191
seanhalle@2 192 TopLevelFnPtr fnPtr;
seanhalle@0 193 void *initData;
seanhalle@0 194 int32 coreToAssignOnto;
seanhalle@0 195
seanhalle@0 196 int32 sizeToMalloc;
seanhalle@0 197 void *ptrToFree;
seanhalle@0 198
seanhalle@0 199 int32 singletonID;
seanhalle@2 200 VSsSingleton **singletonPtrAddr;
seanhalle@0 201
seanhalle@0 202 PtrToAtomicFn fnToExecInMaster;
seanhalle@0 203 void *dataForFn;
seanhalle@0 204
seanhalle@0 205 int32 transID;
nengel@21 206 int32 criticalID;
seanhalle@0 207 }
seanhalle@2 208 /* VSsSemReq */;
seanhalle@0 209
seanhalle@0 210
seanhalle@0 211 typedef struct
seanhalle@0 212 {
seanhalle@9 213 PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned)
seanhalle@9 214 PrivQueueStruc *freeExtraTaskSlvQ; //Shared
seanhalle@9 215 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
seanhalle@10 216 SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@2 217 HashTable *argPtrHashTbl;
seanhalle@4 218 HashTable *commHashTbl;
seanhalle@8 219 int32 numLiveExtraTaskSlvs;
seanhalle@8 220 int32 numLiveThreadSlvs;
seanhalle@3 221 int32 nextCoreToGetNewSlv;
seanhalle@0 222 int32 primitiveStartTime;
seanhalle@0 223
seanhalle@0 224 //fix limit on num with dynArray
seanhalle@2 225 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
seanhalle@2 226 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
nengel@21 227 VSsCritical criticalSection[NUM_STRUCS_IN_SEM_ENV];
seanhalle@3 228
seanhalle@3 229 bool32 *coreIsDone;
seanhalle@3 230 int32 numCoresDone;
seanhalle@0 231
nengel@22 232 int numInFlightTasks;
nengel@22 233 PrivQueueStruc *deferredSubmitsQ;
nengel@22 234 int numDeferred;
nengel@22 235
seanhalle@0 236 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
seanhalle@0 237 ListOfArrays* unitList;
seanhalle@0 238 ListOfArrays* ctlDependenciesList;
seanhalle@0 239 ListOfArrays* commDependenciesList;
nengel@16 240 ListOfArrays* dataDependenciesList;
nengel@17 241 ListOfArrays* warDependenciesList;
seanhalle@0 242 NtoN** ntonGroups;
seanhalle@0 243 PrivDynArrayInfo* ntonGroupsInfo;
seanhalle@0 244 ListOfArrays* dynDependenciesList;
nengel@16 245 ListOfArrays* singletonDependenciesList;
seanhalle@0 246 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
seanhalle@0 247 ListOfArrays* hwArcs;
seanhalle@0 248 #endif
seanhalle@0 249
seanhalle@0 250 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@0 251 ListOfArrays* counterList[NUM_CORES];
seanhalle@0 252 #endif
nengel@22 253 #ifdef IDLE_SLAVES
seanhalle@3 254 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
nengel@22 255 #endif
seanhalle@0 256 int shutdownInitiated;
seanhalle@0 257 }
seanhalle@2 258 VSsSemEnv;
seanhalle@0 259
seanhalle@0 260
seanhalle@0 261 typedef struct _TransListElem TransListElem;
seanhalle@0 262 struct _TransListElem
seanhalle@0 263 {
seanhalle@0 264 int32 transID;
seanhalle@0 265 TransListElem *nextTrans;
seanhalle@0 266 };
seanhalle@0 267 //TransListElem
seanhalle@0 268
seanhalle@8 269 enum VSsSlvType
seanhalle@10 270 { ExtraTaskSlv = 1,
seanhalle@10 271 SlotTaskSlv,
seanhalle@10 272 ThreadSlv
seanhalle@8 273 };
nengel@5 274
seanhalle@0 275 typedef struct
seanhalle@0 276 {
seanhalle@14 277 int32 highestTransEntered;
seanhalle@14 278 TransListElem *lastTransEntered;
seanhalle@14 279 bool32 needsTaskAssigned;
seanhalle@14 280 VSsTaskStub *taskStub;
seanhalle@14 281 enum VSsSlvType slaveType;
seanhalle@0 282 }
seanhalle@2 283 VSsSemData;
seanhalle@0 284
seanhalle@0 285 //===========================================================================
seanhalle@0 286
seanhalle@0 287 void
seanhalle@2 288 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
seanhalle@0 289
seanhalle@0 290 int32
seanhalle@2 291 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
seanhalle@0 292
seanhalle@0 293 void
seanhalle@2 294 VSs__start_primitive();
seanhalle@0 295
seanhalle@0 296 int32
seanhalle@2 297 VSs__end_primitive_and_give_cycles();
seanhalle@0 298
seanhalle@0 299 int32
seanhalle@2 300 VSs__giveIdealNumWorkUnits();
seanhalle@0 301
seanhalle@0 302 int32
seanhalle@2 303 VSs__give_number_of_cores_to_schedule_onto();
seanhalle@0 304
seanhalle@0 305 //=======================
seanhalle@0 306
seanhalle@0 307 void
seanhalle@2 308 VSs__init();
seanhalle@0 309
seanhalle@0 310 void
seanhalle@2 311 VSs__cleanup_after_shutdown();
seanhalle@0 312
seanhalle@0 313 //=======================
seanhalle@0 314
seanhalle@4 315 SlaveVP *
seanhalle@7 316 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 317 SlaveVP *creatingThd );
seanhalle@0 318
seanhalle@0 319 void
seanhalle@7 320 VSs__end_thread( SlaveVP *thdToEnd );
seanhalle@0 321
seanhalle@0 322 //=======================
seanhalle@2 323
seanhalle@2 324 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
seanhalle@2 325
seanhalle@2 326 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
seanhalle@2 327
seanhalle@2 328
seanhalle@2 329 //=======================
seanhalle@4 330 void
seanhalle@3 331 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
seanhalle@2 332
nengel@20 333 int32 *
seanhalle@4 334 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
seanhalle@4 335
seanhalle@4 336 void
seanhalle@4 337 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
seanhalle@4 338 SlaveVP *animSlv);
seanhalle@0 339
seanhalle@0 340 void
seanhalle@2 341 VSs__end_task( SlaveVP *animSlv );
seanhalle@0 342
seanhalle@4 343 //=========================
nengel@5 344 void
nengel@5 345 VSs__taskwait(SlaveVP *animSlv);
nengel@5 346
nengel@21 347 void
nengel@21 348 VSs__taskwait_on(SlaveVP *animSlv,void* ptr);
nengel@21 349
nengel@21 350 void
nengel@21 351 VSs__start_critical(SlaveVP *animSlv,int32 name);
nengel@21 352
nengel@21 353 void
nengel@21 354 VSs__end_critical(SlaveVP *animSlv,int32 name);
seanhalle@4 355
nengel@20 356 int32 *
seanhalle@4 357 VSs__give_self_taskID( SlaveVP *animSlv );
seanhalle@4 358
seanhalle@4 359 void
seanhalle@4 360 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
seanhalle@4 361 SlaveVP *senderSlv );
seanhalle@4 362
seanhalle@4 363 void
seanhalle@4 364 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
seanhalle@4 365
seanhalle@4 366 void *
seanhalle@4 367 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
seanhalle@4 368
seanhalle@4 369 void *
seanhalle@4 370 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
seanhalle@0 371
seanhalle@0 372 //======================= Concurrency Stuff ======================
seanhalle@0 373 void
seanhalle@2 374 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 375
seanhalle@0 376 void
seanhalle@2 377 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 378
seanhalle@0 379 void
seanhalle@2 380 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
seanhalle@0 381
seanhalle@0 382 void
seanhalle@2 383 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
seanhalle@0 384
seanhalle@0 385 void
seanhalle@2 386 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@0 387 void *data, SlaveVP *animSlv );
seanhalle@0 388
seanhalle@0 389 void
seanhalle@2 390 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 391
seanhalle@0 392 void
seanhalle@2 393 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 394
seanhalle@0 395
seanhalle@0 396 //========================= Internal use only =============================
seanhalle@0 397 void
seanhalle@3 398 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
seanhalle@0 399
seanhalle@0 400 SlaveVP *
seanhalle@2 401 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
seanhalle@0 402
seanhalle@0 403 SlaveVP*
seanhalle@2 404 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@2 405 VSsSemEnv *semEnv, int32 coreToAssignOnto );
seanhalle@0 406
seanhalle@7 407 VSsTaskStub *
seanhalle@8 408 create_thread_task_stub( void *initData );
seanhalle@7 409
seanhalle@7 410
seanhalle@7 411 SlaveVP *
seanhalle@7 412 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 413 SlaveVP *creatingSlv );
seanhalle@7 414
seanhalle@7 415 SlaveVP *
seanhalle@7 416 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 417 SlaveVP *creatingSlv, int32 coreToAssignOnto);
seanhalle@7 418
seanhalle@9 419 void
seanhalle@9 420 idle_fn(void* data, SlaveVP *animatingSlv);
seanhalle@7 421
nengel@20 422 void
nengel@20 423 resume_slaveVP(SlaveVP *slave, VSsSemEnv *semEnv);
nengel@20 424
seanhalle@0 425 //===================== Measurement of Lang Overheads =====================
seanhalle@3 426 #include "Measurement/VSs_Measurement.h"
seanhalle@0 427
seanhalle@0 428 //===========================================================================
seanhalle@2 429 #endif /* _VSs_H */
seanhalle@0 430