annotate VSs.h @ 14:b2bc97318262

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