# HG changeset patch # User Me # Date 1289762272 28800 # Node ID 13b22ffb8a2f405b55c1ae8e50fc2d3b98d7049e # Parent 5cb919ac890f0147f9d6c8c48f0d2b3bc3ac4b62 Nov 14 vers -- Added measurement of Plugin, malloc, & master lock, + vutilities diff -r 5cb919ac890f -r 13b22ffb8a2f CoreLoop.c --- a/CoreLoop.c Sat Nov 13 14:39:40 2010 -0800 +++ b/CoreLoop.c Sun Nov 14 11:17:52 2010 -0800 @@ -119,27 +119,45 @@ #endif if( currPr != NULL ) _VMSMasterEnv->numMasterInARow[thisCoresIdx] = 0; + else + { + //============================= MEASUREMENT STUFF ===================== + #ifdef MEAS__TIME_MASTER_LOCK + int32 startStamp, endStamp; + saveLowTimeStampCountInto( startStamp ); + #endif + //===================================================================== + int tries = 0; int gotLock = 0; + while( currPr == NULL ) //if queue was empty, enter get masterLock loop + { //queue was empty, so get master lock - int tries = 0; int gotLock = 0; - while( currPr == NULL ) //if queue was empty, enter get masterLock loop - { //queue was empty, so get master lock - gotLock = __sync_bool_compare_and_swap( &(_VMSMasterEnv->masterLock), \ + gotLock = __sync_bool_compare_and_swap(&(_VMSMasterEnv->masterLock), UNLOCKED, LOCKED ); - if( gotLock ) - { //run own MasterVP -- jmps to coreLoops startPt when done - currPr = _VMSMasterEnv->masterVPs[thisCoresIdx]; - if( _VMSMasterEnv->numMasterInARow[thisCoresIdx] > 1000 ) - { DEBUG( dbgB2BMaster,"Many back to back MasterVPs\n"); - pthread_yield(); + if( gotLock ) + { //run own MasterVP -- jmps to coreLoops startPt when done + currPr = _VMSMasterEnv->masterVPs[thisCoresIdx]; + if( _VMSMasterEnv->numMasterInARow[thisCoresIdx] > 1000 ) + { DEBUG( dbgB2BMaster,"Many back to back MasterVPs\n"); + pthread_yield(); + } + _VMSMasterEnv->numMasterInARow[thisCoresIdx] += 1; + break; //end while -- have a VP to animate now } - _VMSMasterEnv->numMasterInARow[thisCoresIdx] += 1; - break; //end while -- have a VP to animate now + + tries++; //if too many, means master on other core taking too long + if( tries > MASTERLOCK_RETRIES ) { tries = 0; pthread_yield(); } } - - tries++; //if too many, means master on other core taking too long - if( tries > MASTERLOCK_RETRIES ) { tries = 0; pthread_yield(); } + //============================= MEASUREMENT STUFF ===================== + #ifdef MEAS__TIME_MASTER_LOCK + saveLowTimeStampCountInto( endStamp ); + addIntervalToHist( startStamp, endStamp, + _VMSMasterEnv->masterLockLowTimeHist ); + addIntervalToHist( startStamp, endStamp, + _VMSMasterEnv->masterLockHighTimeHist ); + #endif + //===================================================================== + } - /* VirtProcr offsets: * 0xc stackPtr * 0x10 framePtr @@ -150,7 +168,7 @@ * _VMSMasterEnv offsets: * 0x24 coreLoopStartPt * 0x28 coreLoopEndPt - * 0x30 masterLock + * 0x30 masterLock */ // SwitchToVP( currPr ) asm volatile("movl %0, %%ebx; \ diff -r 5cb919ac890f -r 13b22ffb8a2f VMS.c --- a/VMS.c Sat Nov 13 14:39:40 2010 -0800 +++ b/VMS.c Sun Nov 14 11:17:52 2010 -0800 @@ -101,6 +101,16 @@ //After this, all other mallocs are VMS__malloc. _VMSMasterEnv->freeListHead = VMS_ext__create_free_list(); + + //============================= MEASUREMENT STUFF ======================== + #ifdef MEAS__TIME_MALLOC + _VMSMasterEnv->mallocTimeHist = makeFixedBinHistExt( 100, 50, 10, + "malloc time hist"); + _VMSMasterEnv->freeTimeHist = makeFixedBinHistExt( 100, 50, 10, + "free time hist"); + #endif + //======================================================================== + //===================== Only VMS__malloc after this ==================== masterEnv = _VMSMasterEnv; @@ -147,6 +157,18 @@ _VMSMasterEnv->createPtInSecs = timeStamp.tv_sec +(timeStamp.tv_usec/1000000.0); #endif + #ifdef MEAS__TIME_PLUGIN + _VMSMasterEnv->pluginLowTimeHist = makeFixedBinHist( 50, 0, 2, + "plugin low time hist"); + _VMSMasterEnv->pluginHighTimeHist = makeFixedBinHist( 100, 0, 200, + "plugin high time hist"); + #endif + #ifdef MEAS__TIME_MASTER_LOCK + _VMSMasterEnv->masterLockLowTimeHist = makeFixedBinHist( 50, 0, 2, + "master lock low time hist"); + _VMSMasterEnv->masterLockHighTimeHist = makeFixedBinHist( 100, 0, 200, + "master lock high time hist"); + #endif //======================================================================== } @@ -600,9 +622,7 @@ semReq = req->semReqData; newProbe = VMS__malloc( sizeof(IntervalProbe) ); - nameLen = strlen( semReq->nameStr ); - newProbe->nameStr = VMS__malloc( nameLen ); - memcpy( newProbe->nameStr, semReq->nameStr, nameLen ); + newProbe->nameStr = VMS__strDup( semReq->nameStr ); newProbe->hist = NULL; newProbe->schedChoiceWasRecorded = FALSE; @@ -744,6 +764,44 @@ VirtProcr **masterVPs; SchedSlot ***allSchedSlots; //ptr to array of ptrs + //Before getting rid of everything, print out any measurements made + #ifdef MEAS__TIME_PLUGIN + printHist( _VMSMasterEnv->pluginLowTimeHist ); + printHist( _VMSMasterEnv->pluginHighTimeHist ); + #endif + #ifdef MEAS__TIME_MALLOC + printHist( _VMSMasterEnv->mallocTimeHist ); + printHist( _VMSMasterEnv->freeTimeHist ); + freeHistExt( _VMSMasterEnv->mallocTimeHist ); + freeHistExt( _VMSMasterEnv->freeTimeHist ); + #endif + #ifdef MEAS__TIME_MASTER_LOCK + printHist( _VMSMasterEnv->masterLockLowTimeHist ); + printHist( _VMSMasterEnv->masterLockHighTimeHist ); + #endif + #ifdef MEAS__TIME_MASTER + printHist( _VMSMasterEnv->pluginTimeHist ); + for( coreIdx = 0; coreIdx < NUM_CORES; coreIdx++ ) + { + freeVMSQ( readyToAnimateQs[ coreIdx ] ); + //master VPs were created external to VMS, so use external free + VMS__dissipate_procr( masterVPs[ coreIdx ] ); + + freeSchedSlots( allSchedSlots[ coreIdx ] ); + } + #endif + #ifdef MEAS__TIME_STAMP_SUSP + printHist( _VMSMasterEnv->pluginTimeHist ); + for( coreIdx = 0; coreIdx < NUM_CORES; coreIdx++ ) + { + freeVMSQ( readyToAnimateQs[ coreIdx ] ); + //master VPs were created external to VMS, so use external free + VMS__dissipate_procr( masterVPs[ coreIdx ] ); + + freeSchedSlots( allSchedSlots[ coreIdx ] ); + } + #endif + //All the environment data has been allocated with VMS__malloc, so just // free its internal big-chunk and all inside it disappear. /* diff -r 5cb919ac890f -r 13b22ffb8a2f VMS.h --- a/VMS.h Sat Nov 13 14:39:40 2010 -0800 +++ b/VMS.h Sun Nov 14 11:17:52 2010 -0800 @@ -61,8 +61,11 @@ // suspending a processor and just after resuming that processor. It is // saved into a field added to VirtProcr. Have to sanity-check for // rollover of low portion into high portion. -#define MEAS__TIME_STAMP_SUSP -#define MEAS__TIME_MASTER +//#define MEAS__TIME_STAMP_SUSP +//#define MEAS__TIME_MASTER +//#define MEAS__TIME_PLUGIN +//#define MEAS__TIME_MALLOC +#define MEAS__TIME_MASTER_LOCK #define MEAS__NUM_TIMES_TO_RUN 100000 //For code that calculates normalization-offset between TSC counts of @@ -192,10 +195,11 @@ unsigned int preSuspTSCLow; unsigned int postSuspTSCLow; #endif - #ifdef MEAS__TIME_MASTER + #ifdef MEAS__TIME_MASTER /* in VirtProcr because multiple masterVPs*/ unsigned int startMasterTSCLow; unsigned int endMasterTSCLow; #endif + //======================================== float64 createPtInSecs; //have space but don't use on some configs }; @@ -238,6 +242,18 @@ HashTable *probeNameHashTbl; int32 masterCreateProbeID; float64 createPtInSecs; + #ifdef MEAS__TIME_PLUGIN + Histogram *pluginLowTimeHist; + Histogram *pluginHighTimeHist; + #endif + #ifdef MEAS__TIME_MALLOC + Histogram *mallocTimeHist; + Histogram *freeTimeHist; + #endif + #ifdef MEAS__TIME_MASTER_LOCK + Histogram *masterLockLowTimeHist; + Histogram *masterLockHighTimeHist; + #endif } MasterEnv; @@ -378,6 +394,7 @@ #include "SwitchAnimators.h" #include "probes.h" +#include "vutilities.h" #endif /* _VMS_H */ diff -r 5cb919ac890f -r 13b22ffb8a2f probes.c --- a/probes.c Sat Nov 13 14:39:40 2010 -0800 +++ b/probes.c Sun Nov 14 11:17:52 2010 -0800 @@ -334,6 +334,7 @@ } +inline void doNothing(){}; void generic_print_probe( void *_probe ) diff -r 5cb919ac890f -r 13b22ffb8a2f probes.h --- a/probes.h Sat Nov 13 14:39:40 2010 -0800 +++ b/probes.h Sun Nov 14 11:17:52 2010 -0800 @@ -135,7 +135,7 @@ 0 /* do nothing */ int32 -VMS_ext_impl__record_time_point_into_new_probe( char *nameStr, VirtProcr *animPr); +VMS_ext_impl__record_time_point_into_new_probe( char *nameStr ); #define VMS_ext__record_time_point_into_new_probe( nameStr ) \ 0 /* do nothing */ @@ -178,15 +178,16 @@ #define VMS__record_interval_end_in_probe( probeID ) \ /* do nothing */ +inline void doNothing(); void VMS_impl__print_stats_of_probe( int32 probeID ); #define VMS__print_stats_of_probe( probeID ) \ - /* do nothing */ + doNothing/* do nothing */ void VMS_impl__print_stats_of_all_probes(); #define VMS__print_stats_of_all_probes \ - /* do nothing */ + doNothing/* do nothing */ #endif /* defined STATS__ENABLE_PROBES */ diff -r 5cb919ac890f -r 13b22ffb8a2f vmalloc.c --- a/vmalloc.c Sat Nov 13 14:39:40 2010 -0800 +++ b/vmalloc.c Sun Nov 14 11:17:52 2010 -0800 @@ -49,6 +49,13 @@ { MallocProlog *foundElem = NULL, *currElem, *newElem; int32 amountExtra, foundElemIsTopOfHeap, sizeConsumed,sizeOfFound; + //============================= MEASUREMENT STUFF ======================== + #ifdef MEAS__TIME_MALLOC + int32 startStamp, endStamp; + saveLowTimeStampCountInto( startStamp ); + #endif + //======================================================================== + //step up the size to be aligned at 16-byte boundary, prob better ways sizeRequested = ((sizeRequested + 16) >> 4) << 4; currElem = (_VMSMasterEnv->freeListHead)->nextChunkInFreeList; @@ -108,6 +115,13 @@ } _VMSMasterEnv->amtOfOutstandingMem += sizeConsumed; + //============================= MEASUREMENT STUFF ======================== + #ifdef MEAS__TIME_MALLOC + saveLowTimeStampCountInto( endStamp ); + addIntervalToHist( startStamp, endStamp, _VMSMasterEnv->mallocTimeHist ); + #endif + //======================================================================== + //skip over the prolog by adding its size to the pointer return return (void *)((char *)foundElem + sizeof(MallocProlog)); } @@ -124,6 +138,13 @@ { MallocProlog *elemToFree, *nextLowerElem, *nextHigherElem; int32 lowerExistsAndIsFree, higherExistsAndIsFree, sizeOfElem; + //============================= MEASUREMENT STUFF ======================== + #ifdef MEAS__TIME_MALLOC + int32 startStamp, endStamp; + saveLowTimeStampCountInto( startStamp ); + #endif + //======================================================================== + if( ptrToFree < (void*)_VMSMasterEnv->freeListHead->nextLowerInMem || ptrToFree > (void*)_VMSMasterEnv->freeListHead->nextHigherInMem ) { //outside the range of data owned by VMS's malloc, so do nothing @@ -211,6 +232,12 @@ elemToFree->prevChunkInFreeList = _VMSMasterEnv->freeListHead; } } + //============================= MEASUREMENT STUFF ======================== + #ifdef MEAS__TIME_MALLOC + saveLowTimeStampCountInto( endStamp ); + addIntervalToHist( startStamp, endStamp, _VMSMasterEnv->freeTimeHist ); + #endif + //======================================================================== } diff -r 5cb919ac890f -r 13b22ffb8a2f vmalloc.h --- a/vmalloc.h Sat Nov 13 14:39:40 2010 -0800 +++ b/vmalloc.h Sun Nov 14 11:17:52 2010 -0800 @@ -7,6 +7,9 @@ * Created on November 14, 2009, 9:07 PM */ +#ifndef _VMALLOC_H +#define _VMALLOC_H + #include #include "VMS_primitive_data_types.h" @@ -50,3 +53,5 @@ void VMS_ext__free_free_list( MallocProlog *freeListHead ); + +#endif \ No newline at end of file diff -r 5cb919ac890f -r 13b22ffb8a2f vutilities.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vutilities.c Sun Nov 14 11:17:52 2010 -0800 @@ -0,0 +1,25 @@ +/* + * Copyright 2009 OpenSourceCodeStewardshipFoundation.org + * Licensed under GNU General Public License version 2 + * + * Author: seanhalle@yahoo.com + * + * Created on November 14, 2009, 9:07 PM + */ + +#include +#include + +#include "VMS.h" + + +inline char * +VMS__strDup( char *str ) + { char *retStr; + + retStr = VMS__malloc( strlen(str) + 1 ); + if( str == NULL ) return str; + strcpy( retStr, str ); + + return retStr; + } diff -r 5cb919ac890f -r 13b22ffb8a2f vutilities.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vutilities.h Sun Nov 14 11:17:52 2010 -0800 @@ -0,0 +1,20 @@ +/* + * Copyright 2009 OpenSourceCodeStewardshipFoundation.org + * Licensed under GNU General Public License version 2 + * + * Author: seanhalle@yahoo.com + * + * Created on November 14, 2009, 9:07 PM + */ + + +#ifndef _UTILITIES_H +#define _UTILITIES_H + +#include +#include "VMS_primitive_data_types.h" + +inline char * +VMS__strDup( char *str ); + +#endif