annotate VSs.h @ 44:7e7f37aa2f61

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