annotate VSs.h @ 21:feea343d202f

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