annotate SSR.h @ 78:0d04c3e608cc

Creating a new branch for development of the DKU Pattern
author Sean Halle <seanhalle@yahoo.com>
date Sun, 26 Aug 2012 02:49:34 -0700
parents 8882e795016d
children ee8510009267
rev   line source
Me@6 1 /*
Me@6 2 * Copyright 2009 OpenSourceStewardshipFoundation.org
Me@6 3 * Licensed under GNU General Public License version 2
Me@6 4 *
Me@6 5 * Author: seanhalle@yahoo.com
Me@6 6 *
Me@6 7 */
Me@6 8
Me@6 9 #ifndef _SSR_H
Me@6 10 #define _SSR_H
Me@6 11
seanhalle@60 12 #include "Queue_impl/PrivateQueue.h"
seanhalle@60 13 #include "Hash_impl/PrivateHash.h"
seanhalle@60 14 #include "VMS_impl/VMS.h"
Nina@39 15 #include "dependency.h"
Me@6 16
Me@17 17
Me@17 18 //===========================================================================
Me@17 19 #define NUM_STRUCS_IN_SEM_ENV 1000
Me@17 20
seanhalle@62 21 //This is hardware dependent -- it's the number of cycles of scheduling
seanhalle@62 22 // overhead -- if a work unit is fewer than this, it is better being
seanhalle@62 23 // combined sequentially with other work
seanhalle@62 24 //This value depends on both VMS overhead and SSR's plugin. At some point
seanhalle@62 25 // it will be derived by perf-counter measurements during init of SSR
seanhalle@62 26 #define MIN_WORK_UNIT_CYCLES 20000
seanhalle@62 27
Me@17 28 //===========================================================================
Me@6 29 /*This header defines everything specific to the SSR semantic plug-in
Me@6 30 */
Me@6 31 typedef struct _SSRSemReq SSRSemReq;
Me@17 32 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
Me@17 33 //===========================================================================
Me@6 34
Me@6 35 /*Semantic layer-specific data sent inside a request from lib called in app
seanhalle@67 36 * to request handler called in AnimationMaster
Me@6 37 */
Me@21 38
Me@21 39 typedef struct
Me@21 40 {
seanhalle@60 41 SlaveVP *VPCurrentlyExecuting;
Me@21 42 PrivQueueStruc *waitingVPQ;
Me@21 43 }
Me@21 44 SSRTrans;
Me@21 45
msach@24 46 /*WARNING: assembly hard-codes position of endInstrAddr as first field
msach@24 47 */
Me@21 48 typedef struct
Me@21 49 {
Me@22 50 void *endInstrAddr;
Me@21 51 int32 hasBeenStarted;
Me@21 52 int32 hasFinished;
Me@21 53 PrivQueueStruc *waitQ;
Me@21 54 }
Me@21 55 SSRSingleton;
Me@21 56
Me@6 57 enum SSRReqType
Me@6 58 {
Me@6 59 send_type = 1,
Me@6 60 send_from_to,
Me@6 61 receive_any, //order and grouping matter -- send before receive
Me@6 62 receive_type, // and receive_any first of the receives -- Handlers
Me@6 63 receive_from_to,// rely upon this ordering of enum
Me@6 64 transfer_to,
Me@17 65 transfer_out,
Me@17 66 malloc_req,
Me@17 67 free_req,
Me@21 68 singleton_fn_start,
Me@21 69 singleton_fn_end,
Me@21 70 singleton_data_start,
Me@21 71 singleton_data_end,
Me@17 72 atomic,
Me@17 73 trans_start,
Me@17 74 trans_end
Me@6 75 };
Me@6 76
Me@6 77 struct _SSRSemReq
Me@6 78 { enum SSRReqType reqType;
seanhalle@60 79 SlaveVP *sendPr;
seanhalle@60 80 SlaveVP *receivePr;
Me@17 81 int32 msgType;
Me@17 82 void *msg;
Me@6 83 SSRSemReq *nextReqInHashEntry;
Me@17 84
Me@17 85 void *initData;
seanhalle@60 86 TopLevelFnPtr fnPtr;
seanhalle@64 87 int32 coreToAssignOnto;
Me@17 88
Me@17 89 int32 sizeToMalloc;
Me@17 90 void *ptrToFree;
Me@17 91
Me@17 92 int32 singletonID;
Me@22 93 SSRSingleton **singletonPtrAddr;
Me@17 94
Me@17 95 PtrToAtomicFn fnToExecInMaster;
Me@17 96 void *dataForFn;
Me@17 97
Me@17 98 int32 transID;
Me@6 99 }
Me@6 100 /* SSRSemReq */;
Me@6 101
Me@17 102
Me@17 103 typedef struct
Me@17 104 {
Me@6 105 PrivQueueStruc **readyVPQs;
Me@14 106 HashTable *commHashTbl;
seanhalle@60 107 int32 numSlaveVP;
Me@14 108 int32 nextCoreToGetNewPr;
Me@14 109 int32 primitiveStartTime;
Me@17 110
Me@17 111 //fix limit on num with dynArray
Me@21 112 SSRSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
Me@17 113 SSRTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
Nina@39 114
seanhalle@60 115 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
nengel@47 116 ListOfArrays* unitList;
nengel@46 117 ListOfArrays* ctlDependenciesList;
nengel@46 118 ListOfArrays* commDependenciesList;
nengel@48 119 NtoN** ntonGroups;
nengel@48 120 PrivDynArrayInfo* ntonGroupsInfo;
nengel@49 121 ListOfArrays* dynDependenciesList;
seanhalle@69 122 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
nengel@49 123 ListOfArrays* hwArcs;
Nina@39 124 #endif
nengel@50 125
seanhalle@60 126 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
nengel@56 127 ListOfArrays* counterList[NUM_CORES];
nengel@50 128 #endif
seanhalle@69 129 SlaveVP* idlePr[NUM_CORES][NUM_ANIM_SLOTS];
nengel@66 130 int shutdownInitiated;
Me@6 131 }
Me@6 132 SSRSemEnv;
Me@6 133
Me@6 134
seanhalle@78 135 typedef struct _DKUPiece DKUPiece;
seanhalle@78 136
seanhalle@78 137 typedef DKUPiece * (*DKUDividerFn ) ( DKUPiece * );
seanhalle@78 138
seanhalle@78 139 struct _DKUPiece
seanhalle@78 140 {
seanhalle@78 141 void *workData;
seanhalle@78 142 DKUPiece **subPieces;
seanhalle@78 143 void *infoForUndiv; //app creates own struct and casts
seanhalle@78 144 };
seanhalle@78 145 //DKUPiece
seanhalle@78 146
Me@17 147 typedef struct _TransListElem TransListElem;
Me@17 148 struct _TransListElem
Me@17 149 {
Me@17 150 int32 transID;
Me@17 151 TransListElem *nextTrans;
Me@17 152 };
Me@18 153 //TransListElem
Me@18 154
Me@17 155 typedef struct
Me@17 156 {
Me@17 157 int32 highestTransEntered;
Me@17 158 TransListElem *lastTransEntered;
Me@17 159 }
Me@17 160 SSRSemData;
Me@17 161
Me@6 162 //===========================================================================
Me@6 163
Me@6 164 void
seanhalle@60 165 SSR__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData );
Me@6 166
Me@14 167 int32
Me@14 168 SSR__giveMinWorkUnitCycles( float32 percentOverhead );
Me@14 169
Me@20 170 void
Me@14 171 SSR__start_primitive();
Me@14 172
Me@20 173 int32
Me@14 174 SSR__end_primitive_and_give_cycles();
Me@14 175
Me@16 176 int32
Me@16 177 SSR__giveIdealNumWorkUnits();
Me@14 178
Me@17 179 int32
Me@17 180 SSR__give_number_of_cores_to_schedule_onto();
Me@17 181
Me@6 182 //=======================
Me@6 183
Me@6 184 void
Me@6 185 SSR__init();
Me@6 186
Me@6 187 void
Me@6 188 SSR__cleanup_after_shutdown();
Me@6 189
Me@6 190 //=======================
Me@6 191
seanhalle@60 192 SlaveVP *
seanhalle@60 193 SSR__create_procr_with( TopLevelFnPtr fnPtr, void *initData,
seanhalle@60 194 SlaveVP *creatingSlv );
Me@6 195
seanhalle@60 196 SlaveVP *
seanhalle@60 197 SSR__create_procr_with_affinity( TopLevelFnPtr fnPtr, void *initData,
seanhalle@64 198 SlaveVP *creatingPr, int32 coreToAssignOnto);
Me@17 199
Me@6 200 void
seanhalle@60 201 SSR__dissipate_procr( SlaveVP *procrToDissipate );
Me@6 202
Me@6 203 //=======================
Me@6 204 void *
seanhalle@60 205 SSR__malloc_to( int numBytes, SlaveVP *ownerSlv );
Me@17 206
Me@17 207 void
seanhalle@60 208 SSR__free( void *ptrToFree, SlaveVP *owningSlv );
Me@6 209
Me@6 210 void
seanhalle@60 211 SSR__transfer_ownership_of_from_to( void *data, SlaveVP *oldOwnerPr,
seanhalle@60 212 SlaveVP *newOwnerSlv );
Me@6 213
Me@6 214 void
seanhalle@60 215 SSR__add_ownership_by_to( SlaveVP *newOwnerPr, void *data );
Me@6 216
Me@6 217 void
seanhalle@60 218 SSR__remove_ownership_by_from( SlaveVP *loserPr, void *dataLosing );
Me@6 219
Me@6 220 void
Me@6 221 SSR__transfer_ownership_to_outside( void *dataToTransferOwnershipOf );
Me@6 222
Me@6 223
Me@6 224
Me@6 225 //=======================
Me@6 226 void
seanhalle@60 227 SSR__send_of_type_to( SlaveVP *sendPr, void *msg, const int type,
seanhalle@60 228 SlaveVP *receivePr);
Me@6 229
Me@6 230 void
seanhalle@60 231 SSR__send_from_to( void *msg, SlaveVP *sendPr, SlaveVP *receivePr);
Me@6 232
Me@6 233 void *
seanhalle@60 234 SSR__receive_type_to( const int type, SlaveVP *receiveSlv );
Me@6 235
Me@6 236 void *
seanhalle@60 237 SSR__receive_from_to( SlaveVP *sendPr, SlaveVP *receiveSlv );
Me@6 238
Me@6 239
seanhalle@78 240
seanhalle@78 241 //=========================== DKU ==============================
seanhalle@78 242 void
seanhalle@78 243 VMS_App__register_DKU_divider( DKUID ID, DKUDividerFn dividerFn,
seanhalle@78 244 SlaveVP *animSlv );
seanhalle@78 245 void
seanhalle@78 246 VMS_App__register_DKU_kernel( DKUID ID, DKUKernelFn kernelFn,
seanhalle@78 247 SlaveVP *animSlv );
seanhalle@78 248
seanhalle@78 249 void
seanhalle@78 250 VMS_App__register_DKU_undivider( DKUID ID, DKUUndividerFn undividerFn,
seanhalle@78 251 SlaveVP *animSlv );
seanhalle@78 252
seanhalle@78 253
seanhalle@78 254
Me@17 255 //======================= Concurrency Stuff ======================
Me@17 256 void
seanhalle@60 257 SSR__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
Me@21 258
Me@21 259 void
seanhalle@60 260 SSR__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
Me@21 261
Me@21 262 void
seanhalle@60 263 SSR__start_data_singleton( SSRSingleton **singeltonAddr, SlaveVP *animSlv );
Me@21 264
Me@21 265 void
seanhalle@60 266 SSR__end_data_singleton( SSRSingleton **singletonAddr, SlaveVP *animSlv );
Me@6 267
Me@6 268 void
Me@17 269 SSR__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
seanhalle@60 270 void *data, SlaveVP *animSlv );
Me@17 271
Me@17 272 void
seanhalle@60 273 SSR__start_transaction( int32 transactionID, SlaveVP *animSlv );
Me@17 274
Me@17 275 void
seanhalle@60 276 SSR__end_transaction( int32 transactionID, SlaveVP *animSlv );
Me@6 277
Me@6 278
Me@6 279 //========================= Internal use only =============================
Me@6 280 void
seanhalle@60 281 SSR__Request_Handler( SlaveVP *requestingPr, void *_semEnv );
Me@6 282
seanhalle@60 283 SlaveVP *
seanhalle@67 284 SSR__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
Me@6 285
seanhalle@60 286 SlaveVP*
seanhalle@60 287 SSR__create_procr_helper( TopLevelFnPtr fnPtr, void *initData,
seanhalle@64 288 SSRSemEnv *semEnv, int32 coreToAssignOnto );
Me@6 289
seanhalle@64 290 //===================== Measurement of Lang Overheads =====================
seanhalle@64 291 #include "SSR_Measurement.h"
seanhalle@64 292
seanhalle@64 293 //===========================================================================
Me@6 294 #endif /* _SSR_H */
Me@6 295