Me@6: /* Me@6: * Copyright 2009 OpenSourceStewardshipFoundation.org Me@6: * Licensed under GNU General Public License version 2 Me@6: * Me@6: * Author: seanhalle@yahoo.com Me@6: * Me@6: */ Me@6: Me@6: #ifndef _SSR_H Me@6: #define _SSR_H Me@6: seanhalle@60: #include "Queue_impl/PrivateQueue.h" seanhalle@60: #include "Hash_impl/PrivateHash.h" seanhalle@60: #include "VMS_impl/VMS.h" Nina@39: #include "dependency.h" Me@6: Me@17: Me@17: //=========================================================================== Me@17: #define NUM_STRUCS_IN_SEM_ENV 1000 Me@17: nengel@72: //#define IDLE_SLAVES nengel@72: seanhalle@62: //This is hardware dependent -- it's the number of cycles of scheduling seanhalle@62: // overhead -- if a work unit is fewer than this, it is better being seanhalle@62: // combined sequentially with other work seanhalle@62: //This value depends on both VMS overhead and SSR's plugin. At some point seanhalle@62: // it will be derived by perf-counter measurements during init of SSR seanhalle@62: #define MIN_WORK_UNIT_CYCLES 20000 seanhalle@62: Me@17: //=========================================================================== Me@6: /*This header defines everything specific to the SSR semantic plug-in Me@6: */ Me@6: typedef struct _SSRSemReq SSRSemReq; Me@17: typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master Me@17: //=========================================================================== Me@6: Me@6: /*Semantic layer-specific data sent inside a request from lib called in app seanhalle@67: * to request handler called in AnimationMaster Me@6: */ Me@21: Me@21: typedef struct Me@21: { seanhalle@60: SlaveVP *VPCurrentlyExecuting; Me@21: PrivQueueStruc *waitingVPQ; Me@21: } Me@21: SSRTrans; Me@21: msach@24: /*WARNING: assembly hard-codes position of endInstrAddr as first field msach@24: */ Me@21: typedef struct Me@21: { Me@22: void *endInstrAddr; Me@21: int32 hasBeenStarted; Me@21: int32 hasFinished; Me@21: PrivQueueStruc *waitQ; Me@21: } Me@21: SSRSingleton; Me@21: Me@6: enum SSRReqType Me@6: { Me@6: send_type = 1, Me@6: send_from_to, Me@6: receive_any, //order and grouping matter -- send before receive Me@6: receive_type, // and receive_any first of the receives -- Handlers Me@6: receive_from_to,// rely upon this ordering of enum Me@6: transfer_to, Me@17: transfer_out, Me@17: malloc_req, Me@17: free_req, Me@21: singleton_fn_start, Me@21: singleton_fn_end, Me@21: singleton_data_start, Me@21: singleton_data_end, Me@17: atomic, Me@17: trans_start, Me@17: trans_end Me@6: }; Me@6: Me@6: struct _SSRSemReq Me@6: { enum SSRReqType reqType; seanhalle@60: SlaveVP *sendPr; seanhalle@60: SlaveVP *receivePr; Me@17: int32 msgType; Me@17: void *msg; Me@6: SSRSemReq *nextReqInHashEntry; Me@17: Me@17: void *initData; seanhalle@60: TopLevelFnPtr fnPtr; seanhalle@64: int32 coreToAssignOnto; Me@17: Me@17: int32 sizeToMalloc; Me@17: void *ptrToFree; Me@17: Me@17: int32 singletonID; Me@22: SSRSingleton **singletonPtrAddr; Me@17: Me@17: PtrToAtomicFn fnToExecInMaster; Me@17: void *dataForFn; Me@17: Me@17: int32 transID; Me@6: } Me@6: /* SSRSemReq */; Me@6: Me@17: Me@17: typedef struct Me@17: { Me@6: PrivQueueStruc **readyVPQs; Me@14: HashTable *commHashTbl; seanhalle@60: int32 numSlaveVP; Me@14: int32 nextCoreToGetNewPr; Me@14: int32 primitiveStartTime; Me@17: Me@17: //fix limit on num with dynArray Me@21: SSRSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV]; Me@17: SSRTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV]; Nina@39: seanhalle@60: #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC nengel@47: ListOfArrays* unitList; nengel@46: ListOfArrays* ctlDependenciesList; nengel@46: ListOfArrays* commDependenciesList; nengel@48: NtoN** ntonGroups; nengel@48: PrivDynArrayInfo* ntonGroupsInfo; nengel@49: ListOfArrays* dynDependenciesList; seanhalle@69: Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS]; nengel@49: ListOfArrays* hwArcs; Nina@39: #endif nengel@50: seanhalle@60: #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS nengel@56: ListOfArrays* counterList[NUM_CORES]; nengel@50: #endif nengel@72: #ifdef IDLE_SLAVES seanhalle@69: SlaveVP* idlePr[NUM_CORES][NUM_ANIM_SLOTS]; nengel@66: int shutdownInitiated; nengel@72: #endif Me@6: } Me@6: SSRSemEnv; Me@6: Me@6: Me@17: typedef struct _TransListElem TransListElem; Me@17: struct _TransListElem Me@17: { Me@17: int32 transID; Me@17: TransListElem *nextTrans; Me@17: }; Me@18: //TransListElem Me@18: Me@17: typedef struct Me@17: { Me@17: int32 highestTransEntered; Me@17: TransListElem *lastTransEntered; Me@17: } Me@17: SSRSemData; Me@17: Me@6: //=========================================================================== Me@6: Me@6: void seanhalle@60: SSR__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData ); Me@6: Me@14: int32 Me@14: SSR__giveMinWorkUnitCycles( float32 percentOverhead ); Me@14: Me@20: void Me@14: SSR__start_primitive(); Me@14: Me@20: int32 Me@14: SSR__end_primitive_and_give_cycles(); Me@14: Me@16: int32 Me@16: SSR__giveIdealNumWorkUnits(); Me@14: Me@17: int32 Me@17: SSR__give_number_of_cores_to_schedule_onto(); Me@17: Me@6: //======================= Me@6: Me@6: void Me@6: SSR__init(); Me@6: Me@6: void Me@6: SSR__cleanup_after_shutdown(); Me@6: Me@6: //======================= Me@6: seanhalle@60: SlaveVP * seanhalle@60: SSR__create_procr_with( TopLevelFnPtr fnPtr, void *initData, seanhalle@60: SlaveVP *creatingSlv ); Me@6: seanhalle@60: SlaveVP * seanhalle@60: SSR__create_procr_with_affinity( TopLevelFnPtr fnPtr, void *initData, seanhalle@64: SlaveVP *creatingPr, int32 coreToAssignOnto); Me@17: Me@6: void seanhalle@60: SSR__dissipate_procr( SlaveVP *procrToDissipate ); Me@6: Me@6: //======================= Me@6: void * seanhalle@60: SSR__malloc_to( int numBytes, SlaveVP *ownerSlv ); Me@17: Me@17: void seanhalle@60: SSR__free( void *ptrToFree, SlaveVP *owningSlv ); Me@6: Me@6: void seanhalle@60: SSR__transfer_ownership_of_from_to( void *data, SlaveVP *oldOwnerPr, seanhalle@60: SlaveVP *newOwnerSlv ); Me@6: Me@6: void seanhalle@60: SSR__add_ownership_by_to( SlaveVP *newOwnerPr, void *data ); Me@6: Me@6: void seanhalle@60: SSR__remove_ownership_by_from( SlaveVP *loserPr, void *dataLosing ); Me@6: Me@6: void Me@6: SSR__transfer_ownership_to_outside( void *dataToTransferOwnershipOf ); Me@6: Me@6: Me@6: Me@6: //======================= Me@6: void seanhalle@60: SSR__send_of_type_to( SlaveVP *sendPr, void *msg, const int type, seanhalle@60: SlaveVP *receivePr); Me@6: Me@6: void seanhalle@60: SSR__send_from_to( void *msg, SlaveVP *sendPr, SlaveVP *receivePr); Me@6: Me@6: void * seanhalle@60: SSR__receive_type_to( const int type, SlaveVP *receiveSlv ); Me@6: Me@6: void * seanhalle@60: SSR__receive_from_to( SlaveVP *sendPr, SlaveVP *receiveSlv ); Me@6: Me@6: Me@17: //======================= Concurrency Stuff ====================== Me@17: void seanhalle@60: SSR__start_fn_singleton( int32 singletonID, SlaveVP *animSlv ); Me@21: Me@21: void seanhalle@60: SSR__end_fn_singleton( int32 singletonID, SlaveVP *animSlv ); Me@21: Me@21: void seanhalle@60: SSR__start_data_singleton( SSRSingleton **singeltonAddr, SlaveVP *animSlv ); Me@21: Me@21: void seanhalle@60: SSR__end_data_singleton( SSRSingleton **singletonAddr, SlaveVP *animSlv ); Me@6: Me@6: void Me@17: SSR__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, seanhalle@60: void *data, SlaveVP *animSlv ); Me@17: Me@17: void seanhalle@60: SSR__start_transaction( int32 transactionID, SlaveVP *animSlv ); Me@17: Me@17: void seanhalle@60: SSR__end_transaction( int32 transactionID, SlaveVP *animSlv ); Me@6: Me@6: Me@6: //========================= Internal use only ============================= Me@6: void seanhalle@60: SSR__Request_Handler( SlaveVP *requestingPr, void *_semEnv ); Me@6: seanhalle@60: SlaveVP * seanhalle@67: SSR__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot ); Me@6: seanhalle@60: SlaveVP* seanhalle@60: SSR__create_procr_helper( TopLevelFnPtr fnPtr, void *initData, seanhalle@64: SSRSemEnv *semEnv, int32 coreToAssignOnto ); Me@6: seanhalle@64: //===================== Measurement of Lang Overheads ===================== seanhalle@64: #include "SSR_Measurement.h" seanhalle@64: seanhalle@64: //=========================================================================== Me@6: #endif /* _SSR_H */ Me@6: