seanhalle@0: /* seanhalle@0: * Copyright 2009 OpenSourceStewardshipFoundation.org seanhalle@0: * Licensed under GNU General Public License version 2 seanhalle@0: * seanhalle@0: * Author: seanhalle@yahoo.com seanhalle@0: * seanhalle@0: */ seanhalle@0: seanhalle@0: #ifndef _VOMP_H seanhalle@0: #define _VOMP_H seanhalle@0: seanhalle@0: #include "Queue_impl/PrivateQueue.h" seanhalle@0: #include "Hash_impl/PrivateHash.h" seanhalle@0: #include "VMS_impl/VMS.h" seanhalle@0: #include "dependency.h" seanhalle@0: seanhalle@0: seanhalle@0: //=========================================================================== seanhalle@0: #define NUM_STRUCS_IN_SEM_ENV 1000 seanhalle@0: seanhalle@0: //This is hardware dependent -- it's the number of cycles of scheduling seanhalle@0: // overhead -- if a work unit is fewer than this, it is better being seanhalle@0: // combined sequentially with other work seanhalle@0: //This value depends on both VMS overhead and VOMP's plugin. At some point seanhalle@0: // it will be derived by perf-counter measurements during init of VOMP seanhalle@0: #define MIN_WORK_UNIT_CYCLES 20000 seanhalle@0: seanhalle@0: //=========================================================================== seanhalle@0: /*This header defines everything specific to the VOMP semantic plug-in seanhalle@0: */ seanhalle@0: typedef struct _VOMPSemReq VOMPSemReq; seanhalle@0: typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master seanhalle@0: //=========================================================================== seanhalle@0: seanhalle@0: /*Semantic layer-specific data sent inside a request from lib called in app seanhalle@0: * to request handler called in AnimationMaster seanhalle@0: */ seanhalle@0: seanhalle@0: typedef struct seanhalle@0: { seanhalle@0: SlaveVP *VPCurrentlyExecuting; seanhalle@0: PrivQueueStruc *waitingVPQ; seanhalle@0: } seanhalle@0: VOMPTrans; seanhalle@0: seanhalle@0: /*WARNING: assembly hard-codes position of endInstrAddr as first field seanhalle@0: */ seanhalle@0: typedef struct seanhalle@0: { seanhalle@0: void *endInstrAddr; seanhalle@0: int32 hasBeenStarted; seanhalle@0: int32 hasFinished; seanhalle@0: PrivQueueStruc *waitQ; seanhalle@0: } seanhalle@0: VOMPSingleton; seanhalle@0: seanhalle@0: enum VOMPReqType seanhalle@0: { seanhalle@0: send_type = 1, seanhalle@0: send_from_to, seanhalle@0: receive_any, //order and grouping matter -- send before receive seanhalle@0: receive_type, // and receive_any first of the receives -- Handlers seanhalle@0: receive_from_to,// rely upon this ordering of enum seanhalle@0: transfer_to, seanhalle@0: transfer_out, seanhalle@0: malloc_req, seanhalle@0: free_req, seanhalle@0: singleton_fn_start, seanhalle@0: singleton_fn_end, seanhalle@0: singleton_data_start, seanhalle@0: singleton_data_end, seanhalle@0: atomic, seanhalle@0: trans_start, seanhalle@0: trans_end seanhalle@0: }; seanhalle@0: seanhalle@0: struct _VOMPSemReq seanhalle@0: { enum VOMPReqType reqType; seanhalle@0: SlaveVP *sendPr; seanhalle@0: SlaveVP *receivePr; seanhalle@0: int32 msgType; seanhalle@0: void *msg; seanhalle@0: VOMPSemReq *nextReqInHashEntry; seanhalle@0: seanhalle@0: void *initData; seanhalle@0: TopLevelFnPtr fnPtr; seanhalle@0: int32 coreToAssignOnto; seanhalle@0: seanhalle@0: int32 sizeToMalloc; seanhalle@0: void *ptrToFree; seanhalle@0: seanhalle@0: int32 singletonID; seanhalle@0: VOMPSingleton **singletonPtrAddr; seanhalle@0: seanhalle@0: PtrToAtomicFn fnToExecInMaster; seanhalle@0: void *dataForFn; seanhalle@0: seanhalle@0: int32 transID; seanhalle@0: } seanhalle@0: /* VOMPSemReq */; seanhalle@0: seanhalle@0: seanhalle@0: typedef struct seanhalle@0: { seanhalle@0: PrivQueueStruc **readyVPQs; seanhalle@0: HashTable *commHashTbl; seanhalle@0: int32 numSlaveVP; seanhalle@0: int32 nextCoreToGetNewPr; seanhalle@0: int32 primitiveStartTime; seanhalle@0: seanhalle@0: //fix limit on num with dynArray seanhalle@0: VOMPSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV]; seanhalle@0: VOMPTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV]; seanhalle@0: seanhalle@0: #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC seanhalle@0: ListOfArrays* unitList; seanhalle@0: ListOfArrays* ctlDependenciesList; seanhalle@0: ListOfArrays* commDependenciesList; seanhalle@0: NtoN** ntonGroups; seanhalle@0: PrivDynArrayInfo* ntonGroupsInfo; seanhalle@0: ListOfArrays* dynDependenciesList; seanhalle@0: Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS]; seanhalle@0: ListOfArrays* hwArcs; seanhalle@0: #endif seanhalle@0: seanhalle@0: #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS seanhalle@0: ListOfArrays* counterList[NUM_CORES]; seanhalle@0: #endif seanhalle@0: SlaveVP* idlePr[NUM_CORES][NUM_ANIM_SLOTS]; seanhalle@0: int shutdownInitiated; seanhalle@0: } seanhalle@0: VOMPSemEnv; seanhalle@0: seanhalle@0: seanhalle@0: typedef struct _TransListElem TransListElem; seanhalle@0: struct _TransListElem seanhalle@0: { seanhalle@0: int32 transID; seanhalle@0: TransListElem *nextTrans; seanhalle@0: }; seanhalle@0: //TransListElem seanhalle@0: seanhalle@0: typedef struct seanhalle@0: { seanhalle@0: int32 highestTransEntered; seanhalle@0: TransListElem *lastTransEntered; seanhalle@0: } seanhalle@0: VOMPSemData; seanhalle@0: seanhalle@0: //=========================================================================== seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData ); seanhalle@0: seanhalle@0: int32 seanhalle@0: VOMP__giveMinWorkUnitCycles( float32 percentOverhead ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__start_primitive(); seanhalle@0: seanhalle@0: int32 seanhalle@0: VOMP__end_primitive_and_give_cycles(); seanhalle@0: seanhalle@0: int32 seanhalle@0: VOMP__giveIdealNumWorkUnits(); seanhalle@0: seanhalle@0: int32 seanhalle@0: VOMP__give_number_of_cores_to_schedule_onto(); seanhalle@0: seanhalle@0: //======================= seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__init(); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__cleanup_after_shutdown(); seanhalle@0: seanhalle@0: //======================= seanhalle@0: seanhalle@0: SlaveVP * seanhalle@0: VOMP__create_procr_with( TopLevelFnPtr fnPtr, void *initData, seanhalle@0: SlaveVP *creatingSlv ); seanhalle@0: seanhalle@0: SlaveVP * seanhalle@0: VOMP__create_procr_with_affinity( TopLevelFnPtr fnPtr, void *initData, seanhalle@0: SlaveVP *creatingPr, int32 coreToAssignOnto); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__dissipate_procr( SlaveVP *procrToDissipate ); seanhalle@0: seanhalle@0: //======================= seanhalle@0: void * seanhalle@0: VOMP__malloc_to( int numBytes, SlaveVP *ownerSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__free( void *ptrToFree, SlaveVP *owningSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__transfer_ownership_of_from_to( void *data, SlaveVP *oldOwnerPr, seanhalle@0: SlaveVP *newOwnerSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__add_ownership_by_to( SlaveVP *newOwnerPr, void *data ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__remove_ownership_by_from( SlaveVP *loserPr, void *dataLosing ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__transfer_ownership_to_outside( void *dataToTransferOwnershipOf ); seanhalle@0: seanhalle@0: seanhalle@0: seanhalle@0: //======================= seanhalle@0: void seanhalle@0: VOMP__send_of_type_to( SlaveVP *sendPr, void *msg, const int type, seanhalle@0: SlaveVP *receivePr); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__send_from_to( void *msg, SlaveVP *sendPr, SlaveVP *receivePr); seanhalle@0: seanhalle@0: void * seanhalle@0: VOMP__receive_type_to( const int type, SlaveVP *receiveSlv ); seanhalle@0: seanhalle@0: void * seanhalle@0: VOMP__receive_from_to( SlaveVP *sendPr, SlaveVP *receiveSlv ); seanhalle@0: seanhalle@0: seanhalle@0: //======================= Concurrency Stuff ====================== seanhalle@0: void seanhalle@0: VOMP__start_fn_singleton( int32 singletonID, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__end_fn_singleton( int32 singletonID, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__start_data_singleton( VOMPSingleton **singeltonAddr, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__end_data_singleton( VOMPSingleton **singletonAddr, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, seanhalle@0: void *data, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__start_transaction( int32 transactionID, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: void seanhalle@0: VOMP__end_transaction( int32 transactionID, SlaveVP *animSlv ); seanhalle@0: seanhalle@0: seanhalle@0: //========================= Internal use only ============================= seanhalle@0: void seanhalle@0: VOMP__Request_Handler( SlaveVP *requestingPr, void *_semEnv ); seanhalle@0: seanhalle@0: SlaveVP * seanhalle@0: VOMP__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot ); seanhalle@0: seanhalle@0: SlaveVP* seanhalle@0: VOMP__create_procr_helper( TopLevelFnPtr fnPtr, void *initData, seanhalle@0: VOMPSemEnv *semEnv, int32 coreToAssignOnto ); seanhalle@0: seanhalle@0: //===================== Measurement of Lang Overheads ===================== seanhalle@0: #include "VOMP_Measurement.h" seanhalle@0: seanhalle@0: //=========================================================================== seanhalle@0: #endif /* _VOMP_H */ seanhalle@0: