annotate VSs.h @ 7:3999b8429ddd

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