annotate SSR.h @ 81:2a64d3178882

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