annotate VSs.h @ 18:c9606ea7abc8

add interface for Tamer's nexus board
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 11 Sep 2012 17:51:05 +0200
parents f83fff8bd4b2
children 58a71af04cd1
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@18 22 //#define EXTERNAL_SCHEDULER
nengel@18 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@17 95 #endif
seanhalle@2 96 }
seanhalle@6 97 VSsTaskStub;
nengel@5 98
seanhalle@2 99
seanhalle@2 100 typedef struct
seanhalle@2 101 {
seanhalle@2 102 VSsTaskStub *taskStub;
seanhalle@2 103 int32 argNum;
seanhalle@2 104 int32 isReader;
seanhalle@2 105 }
seanhalle@2 106 VSsTaskStubCarrier;
seanhalle@2 107
seanhalle@2 108
seanhalle@0 109 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@0 110 * to request handler called in AnimationMaster
seanhalle@0 111 */
seanhalle@0 112
seanhalle@0 113 typedef struct
seanhalle@0 114 {
seanhalle@0 115 SlaveVP *VPCurrentlyExecuting;
seanhalle@0 116 PrivQueueStruc *waitingVPQ;
seanhalle@0 117 }
seanhalle@2 118 VSsTrans;
seanhalle@0 119
seanhalle@0 120 /*WARNING: assembly hard-codes position of endInstrAddr as first field
seanhalle@0 121 */
seanhalle@0 122 typedef struct
seanhalle@0 123 {
seanhalle@0 124 void *endInstrAddr;
seanhalle@0 125 int32 hasBeenStarted;
seanhalle@0 126 int32 hasFinished;
seanhalle@0 127 PrivQueueStruc *waitQ;
nengel@17 128 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@17 129 Unit executingUnit;
nengel@17 130 #endif
seanhalle@0 131 }
seanhalle@2 132 VSsSingleton;
seanhalle@0 133
seanhalle@2 134 enum VSsReqType
seanhalle@0 135 {
seanhalle@2 136 submit_task = 1,
seanhalle@2 137 end_task,
seanhalle@2 138 create_slave,
seanhalle@2 139 create_slave_w_aff,
seanhalle@2 140 dissipate_slave,
seanhalle@2 141 //===============================
seanhalle@4 142 send_type_to,
seanhalle@4 143 receive_type_to,
seanhalle@4 144 send_from_to,
seanhalle@4 145 receive_from_to,
seanhalle@4 146 //===============================
nengel@5 147 taskwait,
seanhalle@0 148 malloc_req,
seanhalle@0 149 free_req,
seanhalle@0 150 singleton_fn_start,
seanhalle@0 151 singleton_fn_end,
seanhalle@0 152 singleton_data_start,
seanhalle@0 153 singleton_data_end,
seanhalle@0 154 atomic,
seanhalle@0 155 trans_start,
seanhalle@0 156 trans_end
seanhalle@0 157 };
seanhalle@0 158
seanhalle@2 159 struct _VSsSemReq
seanhalle@2 160 { enum VSsReqType reqType;
seanhalle@2 161 SlaveVP *callingSlv;
seanhalle@2 162 VSsTaskType *taskType;
seanhalle@2 163 void *args;
seanhalle@2 164 VSsTaskStub *taskStub;
seanhalle@2 165
seanhalle@4 166 SlaveVP *senderSlv;
seanhalle@4 167 SlaveVP *receiverSlv;
seanhalle@4 168 int32 *senderID;
seanhalle@4 169 int32 *receiverID;
seanhalle@4 170 int32 msgType;
seanhalle@4 171 void *msg;
seanhalle@4 172 VSsSemReq *nextReqInHashEntry;
seanhalle@4 173 int32 *taskID;
seanhalle@4 174
seanhalle@2 175 TopLevelFnPtr fnPtr;
seanhalle@0 176 void *initData;
seanhalle@0 177 int32 coreToAssignOnto;
seanhalle@0 178
seanhalle@0 179 int32 sizeToMalloc;
seanhalle@0 180 void *ptrToFree;
seanhalle@0 181
seanhalle@0 182 int32 singletonID;
seanhalle@2 183 VSsSingleton **singletonPtrAddr;
seanhalle@0 184
seanhalle@0 185 PtrToAtomicFn fnToExecInMaster;
seanhalle@0 186 void *dataForFn;
seanhalle@0 187
seanhalle@0 188 int32 transID;
seanhalle@0 189 }
seanhalle@2 190 /* VSsSemReq */;
seanhalle@0 191
seanhalle@0 192
seanhalle@0 193 typedef struct
seanhalle@0 194 {
seanhalle@9 195 PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned)
seanhalle@9 196 PrivQueueStruc *freeExtraTaskSlvQ; //Shared
seanhalle@9 197 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
seanhalle@10 198 SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@2 199 HashTable *argPtrHashTbl;
seanhalle@4 200 HashTable *commHashTbl;
seanhalle@8 201 int32 numLiveExtraTaskSlvs;
seanhalle@8 202 int32 numLiveThreadSlvs;
seanhalle@3 203 int32 nextCoreToGetNewSlv;
seanhalle@0 204 int32 primitiveStartTime;
seanhalle@0 205
seanhalle@0 206 //fix limit on num with dynArray
seanhalle@2 207 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
seanhalle@2 208 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
seanhalle@3 209
seanhalle@3 210 bool32 *coreIsDone;
seanhalle@3 211 int32 numCoresDone;
seanhalle@0 212
seanhalle@0 213 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
seanhalle@0 214 ListOfArrays* unitList;
seanhalle@0 215 ListOfArrays* ctlDependenciesList;
seanhalle@0 216 ListOfArrays* commDependenciesList;
nengel@16 217 ListOfArrays* dataDependenciesList;
nengel@17 218 ListOfArrays* warDependenciesList;
seanhalle@0 219 NtoN** ntonGroups;
seanhalle@0 220 PrivDynArrayInfo* ntonGroupsInfo;
seanhalle@0 221 ListOfArrays* dynDependenciesList;
nengel@16 222 ListOfArrays* singletonDependenciesList;
seanhalle@0 223 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
seanhalle@0 224 ListOfArrays* hwArcs;
seanhalle@0 225 #endif
seanhalle@0 226
seanhalle@0 227 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@0 228 ListOfArrays* counterList[NUM_CORES];
seanhalle@0 229 #endif
seanhalle@3 230 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@0 231 int shutdownInitiated;
seanhalle@0 232 }
seanhalle@2 233 VSsSemEnv;
seanhalle@0 234
seanhalle@0 235
seanhalle@0 236 typedef struct _TransListElem TransListElem;
seanhalle@0 237 struct _TransListElem
seanhalle@0 238 {
seanhalle@0 239 int32 transID;
seanhalle@0 240 TransListElem *nextTrans;
seanhalle@0 241 };
seanhalle@0 242 //TransListElem
seanhalle@0 243
seanhalle@8 244 enum VSsSlvType
seanhalle@10 245 { ExtraTaskSlv = 1,
seanhalle@10 246 SlotTaskSlv,
seanhalle@10 247 ThreadSlv
seanhalle@8 248 };
nengel@5 249
seanhalle@0 250 typedef struct
seanhalle@0 251 {
seanhalle@14 252 int32 highestTransEntered;
seanhalle@14 253 TransListElem *lastTransEntered;
seanhalle@14 254 bool32 needsTaskAssigned;
seanhalle@14 255 VSsTaskStub *taskStub;
seanhalle@14 256 enum VSsSlvType slaveType;
seanhalle@0 257 }
seanhalle@2 258 VSsSemData;
seanhalle@0 259
seanhalle@0 260 //===========================================================================
seanhalle@0 261
seanhalle@0 262 void
seanhalle@2 263 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
seanhalle@0 264
seanhalle@0 265 int32
seanhalle@2 266 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
seanhalle@0 267
seanhalle@0 268 void
seanhalle@2 269 VSs__start_primitive();
seanhalle@0 270
seanhalle@0 271 int32
seanhalle@2 272 VSs__end_primitive_and_give_cycles();
seanhalle@0 273
seanhalle@0 274 int32
seanhalle@2 275 VSs__giveIdealNumWorkUnits();
seanhalle@0 276
seanhalle@0 277 int32
seanhalle@2 278 VSs__give_number_of_cores_to_schedule_onto();
seanhalle@0 279
seanhalle@0 280 //=======================
seanhalle@0 281
seanhalle@0 282 void
seanhalle@2 283 VSs__init();
seanhalle@0 284
seanhalle@0 285 void
seanhalle@2 286 VSs__cleanup_after_shutdown();
seanhalle@0 287
seanhalle@0 288 //=======================
seanhalle@0 289
seanhalle@4 290 SlaveVP *
seanhalle@7 291 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 292 SlaveVP *creatingThd );
seanhalle@0 293
seanhalle@0 294 void
seanhalle@7 295 VSs__end_thread( SlaveVP *thdToEnd );
seanhalle@0 296
seanhalle@0 297 //=======================
seanhalle@2 298
seanhalle@2 299 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
seanhalle@2 300
seanhalle@2 301 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
seanhalle@2 302
seanhalle@2 303
seanhalle@2 304 //=======================
seanhalle@4 305 void
seanhalle@3 306 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
seanhalle@2 307
seanhalle@4 308 inline int32 *
seanhalle@4 309 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
seanhalle@4 310
seanhalle@4 311 void
seanhalle@4 312 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
seanhalle@4 313 SlaveVP *animSlv);
seanhalle@0 314
seanhalle@0 315 void
seanhalle@2 316 VSs__end_task( SlaveVP *animSlv );
seanhalle@0 317
seanhalle@4 318 //=========================
nengel@5 319 void
nengel@5 320 VSs__taskwait(SlaveVP *animSlv);
nengel@5 321
seanhalle@4 322
seanhalle@4 323 inline int32 *
seanhalle@4 324 VSs__give_self_taskID( SlaveVP *animSlv );
seanhalle@4 325
seanhalle@4 326 void
seanhalle@4 327 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
seanhalle@4 328 SlaveVP *senderSlv );
seanhalle@4 329
seanhalle@4 330 void
seanhalle@4 331 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
seanhalle@4 332
seanhalle@4 333 void *
seanhalle@4 334 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
seanhalle@4 335
seanhalle@4 336 void *
seanhalle@4 337 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
seanhalle@0 338
seanhalle@0 339 //======================= Concurrency Stuff ======================
seanhalle@0 340 void
seanhalle@2 341 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 342
seanhalle@0 343 void
seanhalle@2 344 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 345
seanhalle@0 346 void
seanhalle@2 347 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
seanhalle@0 348
seanhalle@0 349 void
seanhalle@2 350 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
seanhalle@0 351
seanhalle@0 352 void
seanhalle@2 353 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@0 354 void *data, SlaveVP *animSlv );
seanhalle@0 355
seanhalle@0 356 void
seanhalle@2 357 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 358
seanhalle@0 359 void
seanhalle@2 360 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 361
seanhalle@0 362
seanhalle@0 363 //========================= Internal use only =============================
seanhalle@0 364 void
seanhalle@3 365 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
seanhalle@0 366
seanhalle@0 367 SlaveVP *
seanhalle@2 368 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
seanhalle@0 369
seanhalle@0 370 SlaveVP*
seanhalle@2 371 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@2 372 VSsSemEnv *semEnv, int32 coreToAssignOnto );
seanhalle@0 373
seanhalle@7 374 VSsTaskStub *
seanhalle@8 375 create_thread_task_stub( void *initData );
seanhalle@7 376
seanhalle@7 377
seanhalle@7 378 SlaveVP *
seanhalle@7 379 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 380 SlaveVP *creatingSlv );
seanhalle@7 381
seanhalle@7 382 SlaveVP *
seanhalle@7 383 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@7 384 SlaveVP *creatingSlv, int32 coreToAssignOnto);
seanhalle@7 385
seanhalle@9 386 void
seanhalle@9 387 idle_fn(void* data, SlaveVP *animatingSlv);
seanhalle@7 388
seanhalle@0 389 //===================== Measurement of Lang Overheads =====================
seanhalle@3 390 #include "Measurement/VSs_Measurement.h"
seanhalle@0 391
seanhalle@0 392 //===========================================================================
seanhalle@2 393 #endif /* _VSs_H */
seanhalle@0 394