annotate VSs.h @ 4:13af59ed7ea5

Works -- with send-receive plus normal dependencies
author Sean Halle <seanhalle@yahoo.com>
date Thu, 14 Jun 2012 18:44:47 -0700
parents 468b8638ff92
children 8188c5b4bfd7
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@3 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;
seanhalle@2 72 }
seanhalle@2 73 VSsTaskStub;
seanhalle@2 74
seanhalle@2 75 typedef struct
seanhalle@2 76 {
seanhalle@2 77 VSsTaskStub *taskStub;
seanhalle@2 78 int32 argNum;
seanhalle@2 79 int32 isReader;
seanhalle@2 80 }
seanhalle@2 81 VSsTaskStubCarrier;
seanhalle@2 82
seanhalle@2 83
seanhalle@2 84 typedef struct
seanhalle@2 85 {
seanhalle@2 86 int32 type;
seanhalle@2 87 VSsTaskStub *taskStub;
seanhalle@2 88 }
seanhalle@2 89 VSsWaiterCarrier;
seanhalle@1 90
seanhalle@0 91 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@0 92 * to request handler called in AnimationMaster
seanhalle@0 93 */
seanhalle@0 94
seanhalle@0 95 typedef struct
seanhalle@0 96 {
seanhalle@0 97 SlaveVP *VPCurrentlyExecuting;
seanhalle@0 98 PrivQueueStruc *waitingVPQ;
seanhalle@0 99 }
seanhalle@2 100 VSsTrans;
seanhalle@0 101
seanhalle@0 102 /*WARNING: assembly hard-codes position of endInstrAddr as first field
seanhalle@0 103 */
seanhalle@0 104 typedef struct
seanhalle@0 105 {
seanhalle@0 106 void *endInstrAddr;
seanhalle@0 107 int32 hasBeenStarted;
seanhalle@0 108 int32 hasFinished;
seanhalle@0 109 PrivQueueStruc *waitQ;
seanhalle@0 110 }
seanhalle@2 111 VSsSingleton;
seanhalle@0 112
seanhalle@2 113 enum VSsReqType
seanhalle@0 114 {
seanhalle@2 115 submit_task = 1,
seanhalle@2 116 end_task,
seanhalle@2 117 create_slave,
seanhalle@2 118 create_slave_w_aff,
seanhalle@2 119 dissipate_slave,
seanhalle@2 120 //===============================
seanhalle@4 121 send_type_to,
seanhalle@4 122 receive_type_to,
seanhalle@4 123 send_from_to,
seanhalle@4 124 receive_from_to,
seanhalle@4 125 //===============================
seanhalle@0 126 malloc_req,
seanhalle@0 127 free_req,
seanhalle@0 128 singleton_fn_start,
seanhalle@0 129 singleton_fn_end,
seanhalle@0 130 singleton_data_start,
seanhalle@0 131 singleton_data_end,
seanhalle@0 132 atomic,
seanhalle@0 133 trans_start,
seanhalle@0 134 trans_end
seanhalle@0 135 };
seanhalle@0 136
seanhalle@2 137 struct _VSsSemReq
seanhalle@2 138 { enum VSsReqType reqType;
seanhalle@2 139 SlaveVP *callingSlv;
seanhalle@2 140 VSsTaskType *taskType;
seanhalle@2 141 void *args;
seanhalle@2 142 VSsTaskStub *taskStub;
seanhalle@2 143
seanhalle@4 144 SlaveVP *senderSlv;
seanhalle@4 145 SlaveVP *receiverSlv;
seanhalle@4 146 int32 *senderID;
seanhalle@4 147 int32 *receiverID;
seanhalle@4 148 int32 msgType;
seanhalle@4 149 void *msg;
seanhalle@4 150 VSsSemReq *nextReqInHashEntry;
seanhalle@4 151 int32 *taskID;
seanhalle@4 152
seanhalle@2 153 TopLevelFnPtr fnPtr;
seanhalle@0 154 void *initData;
seanhalle@0 155 int32 coreToAssignOnto;
seanhalle@0 156
seanhalle@0 157 int32 sizeToMalloc;
seanhalle@0 158 void *ptrToFree;
seanhalle@0 159
seanhalle@0 160 int32 singletonID;
seanhalle@2 161 VSsSingleton **singletonPtrAddr;
seanhalle@0 162
seanhalle@0 163 PtrToAtomicFn fnToExecInMaster;
seanhalle@0 164 void *dataForFn;
seanhalle@0 165
seanhalle@0 166 int32 transID;
seanhalle@0 167 }
seanhalle@2 168 /* VSsSemReq */;
seanhalle@0 169
seanhalle@0 170
seanhalle@0 171 typedef struct
seanhalle@0 172 {
seanhalle@0 173 PrivQueueStruc **readyVPQs;
seanhalle@2 174 PrivQueueStruc *taskReadyQ; //Q: shared or local?
seanhalle@2 175 HashTable *argPtrHashTbl;
seanhalle@4 176 HashTable *commHashTbl;
seanhalle@0 177 int32 numSlaveVP;
seanhalle@3 178 int32 nextCoreToGetNewSlv;
seanhalle@0 179 int32 primitiveStartTime;
seanhalle@0 180
seanhalle@0 181 //fix limit on num with dynArray
seanhalle@2 182 VSsSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
seanhalle@2 183 VSsTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
seanhalle@3 184
seanhalle@3 185 bool32 *coreIsDone;
seanhalle@3 186 int32 numCoresDone;
seanhalle@0 187
seanhalle@0 188 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
seanhalle@0 189 ListOfArrays* unitList;
seanhalle@0 190 ListOfArrays* ctlDependenciesList;
seanhalle@0 191 ListOfArrays* commDependenciesList;
seanhalle@0 192 NtoN** ntonGroups;
seanhalle@0 193 PrivDynArrayInfo* ntonGroupsInfo;
seanhalle@0 194 ListOfArrays* dynDependenciesList;
seanhalle@0 195 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
seanhalle@0 196 ListOfArrays* hwArcs;
seanhalle@0 197 #endif
seanhalle@0 198
seanhalle@0 199 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@0 200 ListOfArrays* counterList[NUM_CORES];
seanhalle@0 201 #endif
seanhalle@3 202 SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@0 203 int shutdownInitiated;
seanhalle@0 204 }
seanhalle@2 205 VSsSemEnv;
seanhalle@0 206
seanhalle@0 207
seanhalle@0 208 typedef struct _TransListElem TransListElem;
seanhalle@0 209 struct _TransListElem
seanhalle@0 210 {
seanhalle@0 211 int32 transID;
seanhalle@0 212 TransListElem *nextTrans;
seanhalle@0 213 };
seanhalle@0 214 //TransListElem
seanhalle@0 215
seanhalle@0 216 typedef struct
seanhalle@0 217 {
seanhalle@0 218 int32 highestTransEntered;
seanhalle@0 219 TransListElem *lastTransEntered;
seanhalle@2 220 bool32 needsTaskAssigned;
seanhalle@2 221 VSsTaskStub *taskStub;
seanhalle@0 222 }
seanhalle@2 223 VSsSemData;
seanhalle@0 224
seanhalle@0 225 //===========================================================================
seanhalle@0 226
seanhalle@0 227 void
seanhalle@2 228 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
seanhalle@0 229
seanhalle@0 230 int32
seanhalle@2 231 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
seanhalle@0 232
seanhalle@0 233 void
seanhalle@2 234 VSs__start_primitive();
seanhalle@0 235
seanhalle@0 236 int32
seanhalle@2 237 VSs__end_primitive_and_give_cycles();
seanhalle@0 238
seanhalle@0 239 int32
seanhalle@2 240 VSs__giveIdealNumWorkUnits();
seanhalle@0 241
seanhalle@0 242 int32
seanhalle@2 243 VSs__give_number_of_cores_to_schedule_onto();
seanhalle@0 244
seanhalle@0 245 //=======================
seanhalle@0 246
seanhalle@0 247 void
seanhalle@2 248 VSs__init();
seanhalle@0 249
seanhalle@0 250 void
seanhalle@2 251 VSs__cleanup_after_shutdown();
seanhalle@0 252
seanhalle@0 253 //=======================
seanhalle@0 254
seanhalle@4 255 SlaveVP *
seanhalle@2 256 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@0 257 SlaveVP *creatingSlv );
seanhalle@0 258
seanhalle@4 259 SlaveVP *
seanhalle@2 260 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@3 261 SlaveVP *creatingSlv, int32 coreToAssignOnto);
seanhalle@0 262
seanhalle@0 263 void
seanhalle@2 264 VSs__dissipate_slave( SlaveVP *slaveToDissipate );
seanhalle@0 265
seanhalle@0 266 //=======================
seanhalle@2 267
seanhalle@2 268 #define VSs__malloc( numBytes, callingSlave ) VMS_App__malloc( numBytes, callingSlave)
seanhalle@2 269
seanhalle@2 270 #define VSs__free(ptrToFree, callingSlave ) VMS_App__free( ptrToFree, callingSlave )
seanhalle@2 271
seanhalle@2 272
seanhalle@2 273 //=======================
seanhalle@4 274 void
seanhalle@3 275 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
seanhalle@2 276
seanhalle@4 277 inline int32 *
seanhalle@4 278 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
seanhalle@4 279
seanhalle@4 280 void
seanhalle@4 281 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
seanhalle@4 282 SlaveVP *animSlv);
seanhalle@0 283
seanhalle@0 284 void
seanhalle@2 285 VSs__end_task( SlaveVP *animSlv );
seanhalle@0 286
seanhalle@4 287 //=========================
seanhalle@4 288
seanhalle@4 289 inline int32 *
seanhalle@4 290 VSs__give_self_taskID( SlaveVP *animSlv );
seanhalle@4 291
seanhalle@4 292 void
seanhalle@4 293 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
seanhalle@4 294 SlaveVP *senderSlv );
seanhalle@4 295
seanhalle@4 296 void
seanhalle@4 297 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
seanhalle@4 298
seanhalle@4 299 void *
seanhalle@4 300 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
seanhalle@4 301
seanhalle@4 302 void *
seanhalle@4 303 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
seanhalle@0 304
seanhalle@0 305 //======================= Concurrency Stuff ======================
seanhalle@0 306 void
seanhalle@2 307 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 308
seanhalle@0 309 void
seanhalle@2 310 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
seanhalle@0 311
seanhalle@0 312 void
seanhalle@2 313 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
seanhalle@0 314
seanhalle@0 315 void
seanhalle@2 316 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
seanhalle@0 317
seanhalle@0 318 void
seanhalle@2 319 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@0 320 void *data, SlaveVP *animSlv );
seanhalle@0 321
seanhalle@0 322 void
seanhalle@2 323 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 324
seanhalle@0 325 void
seanhalle@2 326 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
seanhalle@0 327
seanhalle@0 328
seanhalle@0 329 //========================= Internal use only =============================
seanhalle@0 330 void
seanhalle@3 331 VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
seanhalle@0 332
seanhalle@0 333 SlaveVP *
seanhalle@2 334 VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
seanhalle@0 335
seanhalle@0 336 SlaveVP*
seanhalle@2 337 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@2 338 VSsSemEnv *semEnv, int32 coreToAssignOnto );
seanhalle@0 339
seanhalle@0 340 //===================== Measurement of Lang Overheads =====================
seanhalle@3 341 #include "Measurement/VSs_Measurement.h"
seanhalle@0 342
seanhalle@0 343 //===========================================================================
seanhalle@2 344 #endif /* _VSs_H */
seanhalle@0 345