annotate VSs.h @ 3:468b8638ff92

Works -- first working version, includes slave pruning and shutdown detection
author Sean Halle <seanhalle@yahoo.com>
date Wed, 06 Jun 2012 17:55:36 -0700
parents f2ed1c379fe7
children 13af59ed7ea5
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@2 36 #define IN 1
seanhalle@2 37 #define OUT 2
seanhalle@3 38 #define INOUT 2
seanhalle@2 39
seanhalle@2 40 #define READER 1
seanhalle@2 41 #define WRITER 2
seanhalle@1 42
seanhalle@1 43 typedef struct
seanhalle@1 44 {
seanhalle@1 45 VSsTaskFnPtr fn;
seanhalle@2 46 int32 numTotalArgs;//the number of inputs to function
seanhalle@2 47 int32 numCtldArgs;//how many of args have dependencies
seanhalle@2 48 int32 *argTypes; //says reader, writer, or non-ctld
seanhalle@2 49 int32 *argSizes; //for detecting overlap
seanhalle@2 50 int32 sizeOfArgs; //for memcpy of args struct
seanhalle@1 51 }
seanhalle@1 52 VSsTaskType;
seanhalle@1 53
seanhalle@1 54
seanhalle@2 55 typedef struct
seanhalle@2 56 {
seanhalle@3 57 bool32 hasEnabledNonFinishedWriter;
seanhalle@3 58 int32 numEnabledNonDoneReaders;
seanhalle@3 59 PrivQueueStruc *waitersQ;
seanhalle@3 60 }
seanhalle@3 61 VSsPointerEntry;
seanhalle@3 62
seanhalle@3 63 typedef struct
seanhalle@3 64 {
seanhalle@2 65 void **args; //ctld args must come first, as ptrs
seanhalle@2 66 VSsTaskType *taskType;
seanhalle@2 67 int32 numBlockingProp;
seanhalle@2 68 SlaveVP *slaveAssignedTo;
seanhalle@3 69 VSsPointerEntry **ptrEntries;
seanhalle@2 70 }
seanhalle@2 71 VSsTaskStub;
seanhalle@2 72
seanhalle@2 73 typedef struct
seanhalle@2 74 {
seanhalle@2 75 VSsTaskStub *taskStub;
seanhalle@2 76 int32 argNum;
seanhalle@2 77 int32 isReader;
seanhalle@2 78 }
seanhalle@2 79 VSsTaskStubCarrier;
seanhalle@2 80
seanhalle@2 81
seanhalle@2 82 typedef struct
seanhalle@2 83 {
seanhalle@2 84 int32 type;
seanhalle@2 85 VSsTaskStub *taskStub;
seanhalle@2 86 }
seanhalle@2 87 VSsWaiterCarrier;
seanhalle@1 88
seanhalle@0 89 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@0 90 * to request handler called in AnimationMaster
seanhalle@0 91 */
seanhalle@0 92
seanhalle@0 93 typedef struct
seanhalle@0 94 {
seanhalle@0 95 SlaveVP *VPCurrentlyExecuting;
seanhalle@0 96 PrivQueueStruc *waitingVPQ;
seanhalle@0 97 }
seanhalle@2 98 VSsTrans;
seanhalle@0 99
seanhalle@0 100 /*WARNING: assembly hard-codes position of endInstrAddr as first field
seanhalle@0 101 */
seanhalle@0 102 typedef struct
seanhalle@0 103 {
seanhalle@0 104 void *endInstrAddr;
seanhalle@0 105 int32 hasBeenStarted;
seanhalle@0 106 int32 hasFinished;
seanhalle@0 107 PrivQueueStruc *waitQ;
seanhalle@0 108 }
seanhalle@2 109 VSsSingleton;
seanhalle@0 110
seanhalle@2 111 enum VSsReqType
seanhalle@0 112 {
seanhalle@2 113 submit_task = 1,
seanhalle@2 114 end_task,
seanhalle@2 115 create_slave,
seanhalle@2 116 create_slave_w_aff,
seanhalle@2 117 dissipate_slave,
seanhalle@2 118 //===============================
seanhalle@0 119 malloc_req,
seanhalle@0 120 free_req,
seanhalle@0 121 singleton_fn_start,
seanhalle@0 122 singleton_fn_end,
seanhalle@0 123 singleton_data_start,
seanhalle@0 124 singleton_data_end,
seanhalle@0 125 atomic,
seanhalle@0 126 trans_start,
seanhalle@0 127 trans_end
seanhalle@0 128 };
seanhalle@0 129
seanhalle@2 130 struct _VSsSemReq
seanhalle@2 131 { enum VSsReqType reqType;
seanhalle@2 132 SlaveVP *callingSlv;
seanhalle@2 133 VSsTaskType *taskType;
seanhalle@2 134 void *args;
seanhalle@2 135 VSsTaskStub *taskStub;
seanhalle@2 136
seanhalle@2 137 TopLevelFnPtr fnPtr;
seanhalle@0 138 void *initData;
seanhalle@0 139 int32 coreToAssignOnto;
seanhalle@0 140
seanhalle@0 141 int32 sizeToMalloc;
seanhalle@0 142 void *ptrToFree;
seanhalle@0 143
seanhalle@0 144 int32 singletonID;
seanhalle@2 145 VSsSingleton **singletonPtrAddr;
seanhalle@0 146
seanhalle@0 147 PtrToAtomicFn fnToExecInMaster;
seanhalle@0 148 void *dataForFn;
seanhalle@0 149
seanhalle@0 150 int32 transID;
seanhalle@0 151 }
seanhalle@2 152 /* VSsSemReq */;
seanhalle@0 153
seanhalle@0 154
seanhalle@0 155 typedef struct
seanhalle@0 156 {
seanhalle@0 157 PrivQueueStruc **readyVPQs;
seanhalle@2 158 PrivQueueStruc *taskReadyQ; //Q: shared or local?
seanhalle@2 159 HashTable *argPtrHashTbl;
seanhalle@0 160 int32 numSlaveVP;
seanhalle@3 161 int32 nextCoreToGetNewSlv;
seanhalle@0 162 int32 primitiveStartTime;
seanhalle@0 163
seanhalle@0 164 //fix limit on num with dynArray
seanhalle@2 165 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
seanhalle@2 166 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
seanhalle@3 167
seanhalle@3 168 bool32 *coreIsDone;
seanhalle@3 169 int32 numCoresDone;
seanhalle@0 170
seanhalle@0 171 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
seanhalle@0 172 ListOfArrays* unitList;
seanhalle@0 173 ListOfArrays* ctlDependenciesList;
seanhalle@0 174 ListOfArrays* commDependenciesList;
seanhalle@0 175 NtoN** ntonGroups;
seanhalle@0 176 PrivDynArrayInfo* ntonGroupsInfo;
seanhalle@0 177 ListOfArrays* dynDependenciesList;
seanhalle@0 178 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
seanhalle@0 179 ListOfArrays* hwArcs;
seanhalle@0 180 #endif
seanhalle@0 181
seanhalle@0 182 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@0 183 ListOfArrays* counterList[NUM_CORES];
seanhalle@0 184 #endif
seanhalle@3 185 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@0 186 int shutdownInitiated;
seanhalle@0 187 }
seanhalle@2 188 VSsSemEnv;
seanhalle@0 189
seanhalle@0 190
seanhalle@0 191 typedef struct _TransListElem TransListElem;
seanhalle@0 192 struct _TransListElem
seanhalle@0 193 {
seanhalle@0 194 int32 transID;
seanhalle@0 195 TransListElem *nextTrans;
seanhalle@0 196 };
seanhalle@0 197 //TransListElem
seanhalle@0 198
seanhalle@0 199 typedef struct
seanhalle@0 200 {
seanhalle@0 201 int32 highestTransEntered;
seanhalle@0 202 TransListElem *lastTransEntered;
seanhalle@2 203 bool32 needsTaskAssigned;
seanhalle@2 204 VSsTaskStub *taskStub;
seanhalle@0 205 }
seanhalle@2 206 VSsSemData;
seanhalle@0 207
seanhalle@0 208 //===========================================================================
seanhalle@0 209
seanhalle@0 210 void
seanhalle@2 211 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
seanhalle@0 212
seanhalle@0 213 int32
seanhalle@2 214 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
seanhalle@0 215
seanhalle@0 216 void
seanhalle@2 217 VSs__start_primitive();
seanhalle@0 218
seanhalle@0 219 int32
seanhalle@2 220 VSs__end_primitive_and_give_cycles();
seanhalle@0 221
seanhalle@0 222 int32
seanhalle@2 223 VSs__giveIdealNumWorkUnits();
seanhalle@0 224
seanhalle@0 225 int32
seanhalle@2 226 VSs__give_number_of_cores_to_schedule_onto();
seanhalle@0 227
seanhalle@0 228 //=======================
seanhalle@0 229
seanhalle@0 230 void
seanhalle@2 231 VSs__init();
seanhalle@0 232
seanhalle@0 233 void
seanhalle@2 234 VSs__cleanup_after_shutdown();
seanhalle@0 235
seanhalle@0 236 //=======================
seanhalle@0 237
seanhalle@0 238 SlaveVP *
seanhalle@2 239 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@0 240 SlaveVP *creatingSlv );
seanhalle@0 241
seanhalle@0 242 SlaveVP *
seanhalle@2 243 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@3 244 SlaveVP *creatingSlv, int32 coreToAssignOnto);
seanhalle@0 245
seanhalle@0 246 void
seanhalle@2 247 VSs__dissipate_slave( SlaveVP *slaveToDissipate );
seanhalle@0 248
seanhalle@0 249 //=======================
seanhalle@2 250
seanhalle@2 251 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
seanhalle@2 252
seanhalle@2 253 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
seanhalle@2 254
seanhalle@2 255
seanhalle@2 256 //=======================
seanhalle@2 257 int32
seanhalle@3 258 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
seanhalle@2 259
seanhalle@0 260
seanhalle@0 261 void
seanhalle@2 262 VSs__end_task( SlaveVP *animSlv );
seanhalle@0 263
seanhalle@0 264
seanhalle@0 265 //======================= Concurrency Stuff ======================
seanhalle@0 266 void
seanhalle@2 267 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 268
seanhalle@0 269 void
seanhalle@2 270 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 271
seanhalle@0 272 void
seanhalle@2 273 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
seanhalle@0 274
seanhalle@0 275 void
seanhalle@2 276 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
seanhalle@0 277
seanhalle@0 278 void
seanhalle@2 279 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@0 280 void *data, SlaveVP *animSlv );
seanhalle@0 281
seanhalle@0 282 void
seanhalle@2 283 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 284
seanhalle@0 285 void
seanhalle@2 286 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 287
seanhalle@0 288
seanhalle@0 289 //========================= Internal use only =============================
seanhalle@0 290 void
seanhalle@3 291 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
seanhalle@0 292
seanhalle@0 293 SlaveVP *
seanhalle@2 294 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
seanhalle@0 295
seanhalle@0 296 SlaveVP*
seanhalle@2 297 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@2 298 VSsSemEnv *semEnv, int32 coreToAssignOnto );
seanhalle@0 299
seanhalle@0 300 //===================== Measurement of Lang Overheads =====================
seanhalle@3 301 #include "Measurement/VSs_Measurement.h"
seanhalle@0 302
seanhalle@0 303 //===========================================================================
seanhalle@2 304 #endif /* _VSs_H */
seanhalle@0 305