annotate VSs.h @ 27:3b30da4643d1

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