From 6737424150caf7fcbb565038703dad9694657de1 Mon Sep 17 00:00:00 2001 From: jzhou Date: Sat, 16 Jul 2011 17:26:01 +0000 Subject: [PATCH] Add gcprofile to PMC garbage collector and compute the size of allocated obj instead of the number of allocated obj per collection --- Robust/src/Runtime/bamboo/multicoregarbage.c | 10 +- .../src/Runtime/bamboo/multicoregccompact.c | 6 +- .../src/Runtime/bamboo/multicoregcprofile.c | 4 +- .../src/Runtime/bamboo/multicoregcprofile.h | 106 +++++++++++++----- Robust/src/Runtime/bamboo/multicoremem.c | 1 + Robust/src/Runtime/bamboo/multicoremsg.c | 9 +- Robust/src/Runtime/bamboo/multicoreruntime.c | 8 -- Robust/src/Runtime/bamboo/pmc_garbage.c | 25 ++++- 8 files changed, 118 insertions(+), 51 deletions(-) diff --git a/Robust/src/Runtime/bamboo/multicoregarbage.c b/Robust/src/Runtime/bamboo/multicoregarbage.c index 058c92b8..4518fed8 100644 --- a/Robust/src/Runtime/bamboo/multicoregarbage.c +++ b/Robust/src/Runtime/bamboo/multicoregarbage.c @@ -385,7 +385,7 @@ void master_getlargeobjs() { //spin until we have all responses while(numconfirm!=0) ; - GCPROFILE_ITEM(); + GCPROFILE_ITEM_MASTER(); GC_PRINTF("prepare to cache large objs \n"); } @@ -412,7 +412,7 @@ void master_finish() { bamboo_smem_size = 0; bamboo_smem_zero_top = NULL; - GCPROFILE_END(); + GCPROFILE_END_MASTER(); unsigned long long tmpt = BAMBOO_GET_EXE_TIME(); CACHEADAPT_OUTPUT_CACHE_POLICY(); gc_output_cache_policy_time += (BAMBOO_GET_EXE_TIME()-tmpt); @@ -446,14 +446,14 @@ void gc_master(struct garbagelist * stackptr) { CACHEADAPT_GC(true); //tprintf("Check core status \n"); GC_CHECK_ALL_CORE_STATUS(); - GCPROFILE_ITEM(); + GCPROFILE_ITEM_MASTER(); unsigned long long tmpt = BAMBOO_GET_EXE_TIME(); CACHEADAPT_OUTPUT_CACHE_SAMPLING(); gc_output_cache_policy_time += (BAMBOO_GET_EXE_TIME()-tmpt); //tprintf("start mark phase\n"); // do mark phase master_mark(stackptr); - GCPROFILE_ITEM(); + GCPROFILE_ITEM_MASTER(); //tprintf("finish mark phase\n"); // get large objects from all cores master_getlargeobjs(); @@ -545,7 +545,7 @@ bool gc(struct garbagelist * stackptr) { ; pregccheck(); - GCPROFILE_START(); + GCPROFILE_START_MASTER(); GC_PRINTF("start gc! \n"); pregcprocessing(); gc_master(stackptr); diff --git a/Robust/src/Runtime/bamboo/multicoregccompact.c b/Robust/src/Runtime/bamboo/multicoregccompact.c index 75b0b3fc..adb3be11 100644 --- a/Robust/src/Runtime/bamboo/multicoregccompact.c +++ b/Robust/src/Runtime/bamboo/multicoregccompact.c @@ -559,7 +559,7 @@ void master_compact() { gcblock2fill = numblockspercore; } } - GCPROFILE_ITEM(); + GCPROFILE_ITEM_MASTER(); // compact phase compact(); /* wait for all cores to finish compacting */ @@ -603,14 +603,14 @@ void master_compact() { } #endif - GCPROFILE_ITEM(); + GCPROFILE_ITEM_MASTER(); //just in case we didn't get blocks back... if (allocationinfo.lowestfreeblock==NOFREEBLOCK) allocationinfo.lowestfreeblock=numblockspercore*NUMCORES4GC; // compute live object space - GCPROFILE_RECORD_SPACE(); + GCPROFILE_RECORD_SPACE_MASTER(); GC_PRINTF("compact phase finished \n"); } diff --git a/Robust/src/Runtime/bamboo/multicoregcprofile.c b/Robust/src/Runtime/bamboo/multicoregcprofile.c index bf9da3ed..9f3b1af8 100644 --- a/Robust/src/Runtime/bamboo/multicoregcprofile.c +++ b/Robust/src/Runtime/bamboo/multicoregcprofile.c @@ -12,7 +12,7 @@ void initmulticoregcprofiledata() { gc_num_livespace = 0; gc_num_freespace = 0; } - gc_num_obj = 0; + gc_size_allocatedobj = 0; gc_num_liveobj = 0; gc_num_forwardobj = 0; gc_num_profiles = NUMCORESACTIVE - 1; @@ -84,7 +84,7 @@ void gc_outputProfileDataReadable() { printf("Freespace %llu\n", gcInfo->time[gcInfo->index-6]); printf("# Lobj %llu\n", gcInfo->time[gcInfo->index-5]); printf("Lobj space %llu\n", gcInfo->time[gcInfo->index-4]); - printf("# obj %llu\n", gcInfo->time[gcInfo->index-3]); + printf("# obj allocated %llu\n", gcInfo->time[gcInfo->index-3]); printf("# live obj %llu\n", gcInfo->time[gcInfo->index-2]); printf("# forward obj %llu\n", gcInfo->time[gcInfo->index-1]); } diff --git a/Robust/src/Runtime/bamboo/multicoregcprofile.h b/Robust/src/Runtime/bamboo/multicoregcprofile.h index 9ddbf86a..899c7b70 100644 --- a/Robust/src/Runtime/bamboo/multicoregcprofile.h +++ b/Robust/src/Runtime/bamboo/multicoregcprofile.h @@ -10,6 +10,8 @@ #ifdef GC_CACHE_ADAPT #define GC_PROFILE_NUM_FIELD 15 +#elif defined PMC_GC +#define GC_PROFILE_NUM_FIELD 15 #else #define GC_PROFILE_NUM_FIELD 14 #endif // GC_CACHE_ADAPT @@ -19,18 +21,22 @@ typedef struct gc_info { unsigned int index; } GCInfo; +// the following data are supposed to be only valid on the master core +// the other cores should not maintain them GCInfo * gc_infoArray[GCINFOLENGTH]; unsigned int gc_infoIndex; bool gc_infoOverflow; +unsigned int gc_num_profiles; +unsigned int gc_size_allocatedobj; unsigned long long gc_num_livespace; unsigned long long gc_num_freespace; unsigned long long gc_num_lobjspace; unsigned int gc_num_lobj; +// these data should be maintained by all gc cores unsigned int gc_num_liveobj; -unsigned int gc_num_obj; unsigned int gc_num_forwardobj; -unsigned int gc_num_profiles; + #ifdef MGC_SPEC volatile bool gc_profile_flag; @@ -50,7 +56,8 @@ INLINE static void gc_profileInit() { gc_num_profiles = NUMCORESACTIVE - 1; } -INLINE static void gc_profileStart(void) { +// these *_master function can only be invoked by the master core +INLINE static void gc_profileStart_master(void) { if(!gc_infoOverflow) { GCInfo* gcInfo = RUNMALLOC(sizeof(struct gc_info)); gc_infoArray[gc_infoIndex] = gcInfo; @@ -59,14 +66,14 @@ INLINE static void gc_profileStart(void) { } } -INLINE static void gc_profileItem(void) { +INLINE static void gc_profileItem_master(void) { if(!gc_infoOverflow) { GCInfo* gcInfo = gc_infoArray[gc_infoIndex]; gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME(); } } -INLINE static void gc_profileEnd(void) { +INLINE static void gc_profileEnd_master(void) { if(!gc_infoOverflow) { GCInfo* gcInfo = gc_infoArray[gc_infoIndex]; gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME(); @@ -74,10 +81,11 @@ INLINE static void gc_profileEnd(void) { gcInfo->time[gcInfo->index++] = gc_num_freespace; gcInfo->time[gcInfo->index++] = gc_num_lobj; gcInfo->time[gcInfo->index++] = gc_num_lobjspace; - gcInfo->time[gcInfo->index++] = gc_num_obj; + gcInfo->time[gcInfo->index++] = gc_size_allocatedobj; gcInfo->time[gcInfo->index++] = gc_num_liveobj; gcInfo->time[gcInfo->index++] = gc_num_forwardobj; gc_infoIndex++; + gc_size_allocatedobj = 0; // reset the counter of allocated obj if(gc_infoIndex == GCINFOLENGTH) { gc_infoOverflow = true; } @@ -90,12 +98,18 @@ INLINE static void gc_profileEnd(void) { #define GCPROFILE_INFO_2_MASTER() \ { \ if(STARTUPCORE != BAMBOO_NUM_OF_CORE) { \ - send_msg_4(STARTUPCORE,GCPROFILES,gc_num_obj,gc_num_liveobj,gc_num_forwardobj); \ + send_msg_3(STARTUPCORE,GCPROFILES,gc_num_liveobj,gc_num_forwardobj); \ }\ - gc_num_obj = 0; \ } #ifdef MGC_SPEC +// record allocated obj info +#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) \ + { \ + if(gc_profile_flag) {\ + gc_size_allocatedobj += size; \ + } \ + } // record lobj info #define GCPROFILE_RECORD_LOBJ() \ { \ @@ -108,8 +122,23 @@ INLINE static void gc_profileEnd(void) { gc_num_lobjspace = sumsize; \ } \ } +#ifdef PMC_GC +// check the live/free space info +#define GCPROFILE_RECORD_SPACE_MASTER() \ + { \ + if(gc_profile_flag) { \ + gc_num_freespace = 0; \ + for(int i=0;iregions[i].lastptr; \ + void *finishptr=(i+1)regions[i+1].lastptr:pmc_heapptr->regions[i].endptr; \ + gc_num_freespace += finishptr-startptr; \ + } \ + gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \ + } \ + } +#else // check the live/free space info -#define GCPROFILE_RECORD_SPACE() \ +#define GCPROFILE_RECORD_SPACE_MASTER() \ { \ if(gc_profile_flag) { \ gc_num_freespace = 0; \ @@ -123,6 +152,7 @@ INLINE static void gc_profileEnd(void) { gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \ } \ } +#endif // record forward obj info #define GCPROFILE_RECORD_FORWARD_OBJ() \ { \ @@ -133,45 +163,69 @@ INLINE static void gc_profileEnd(void) { { \ gc_num_liveobj++; \ } -#define GCPROFILE_START() \ +#define GCPROFILE_START_MASTER() \ { \ if(gc_profile_flag) { \ - gc_profileStart(); \ + gc_profileStart_master(); \ } \ } -#define GCPROFILE_ITEM() \ +#define GCPROFILE_ITEM_MASTER() \ { \ if(gc_profile_flag) { \ - gc_profileItem(); \ + gc_profileItem_master(); \ } \ } -#define GCPROFILE_END() \ +#define GCPROFILE_END_MASTER() \ { \ if(gc_profile_flag) { \ - gc_profileEnd(); \ + gc_profileEnd_master(); \ } \ } #else // MGC_SPEC +// record allocated obj info +#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) \ + { \ + gc_size_allocatedobj += size; \ + } #define GCPROFILE_RECORD_LOBJ() (gc_num_lobj++) #define GCPROFILE_RECORD_LOBJSPACE() (gc_num_lobjspace = sumsize) -#define GCPROFILE_RECORD_SPACE() \ +#ifdef PMC_GC +// check the live/free space info +#define GCPROFILE_RECORD_SPACE_MASTER() \ { \ - gc_num_livespace = 0; \ - for(int tmpi = 0; tmpi < GCNUMBLOCK; tmpi++) { \ - gc_num_livespace += bamboo_smemtbl[tmpi]; \ + gc_num_freespace = 0; \ + for(int i=0;iregions[i].lastptr; \ + void *finishptr=(i+1)regions[i+1].lastptr:pmc_heapptr->regions[i].endptr; \ + gc_num_freespace += finishptr-startptr; \ } \ - gc_num_freespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_livespace; \ + gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \ } +#else +#define GCPROFILE_RECORD_SPACE_MASTER() \ + { \ + gc_num_freespace = 0; \ + block_t lowestblock=allocationinfo.lowestfreeblock; \ + for(block_t searchblock=lowestblock;searchblockstatus==BS_FREE) { \ + gc_num_freespace+=block->freespace&~BAMBOO_CACHE_LINE_MASK; \ + } \ + } \ + gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \ + } +#endif #define GCPROFILE_RECORD_FORWARD_OBJ() (gc_num_forwardobj++) #define GCPROFILE_RECORD_LIVE_OBJ() (gc_num_liveobj++) -#define GCPROFILE_START() gc_profileStart() -#define GCPROFILE_ITEM() gc_profileItem() -#define GCPROFILE_END() gc_profileEnd() +#define GCPROFILE_START_MASTER() gc_profileStart_master() +#define GCPROFILE_ITEM_MASTER() gc_profileItem_master() +#define GCPROFILE_END_MASTER() gc_profileEnd_master() #endif // MGC_SPEC #define GCPROFILE_INIT() gc_profileInit() #else // GC_PROFILE +#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) #define INIT_MULTICORE_GCPROFILE_DATA() #define GC_OUTPUT_PROFILE_DATA() #define GCPROFILE_INFO_2_MASTER() @@ -180,9 +234,9 @@ INLINE static void gc_profileEnd(void) { #define GCPROFILE_RECORD_SPACE() #define GCPROFILE_RECORD_FORWARD_OBJ() #define GCPROFILE_RECORD_LIVE_OBJ() -#define GCPROFILE_START() -#define GCPROFILE_ITEM() -#define GCPROFILE_END() +#define GCPROFILE_START_MASTER() +#define GCPROFILE_ITEM_MASTER() +#define GCPROFILE_END_MASTER() #define GCPROFILE_INIT() #endif // GC_PROFILE diff --git a/Robust/src/Runtime/bamboo/multicoremem.c b/Robust/src/Runtime/bamboo/multicoremem.c index 0b04b037..3b030daa 100644 --- a/Robust/src/Runtime/bamboo/multicoremem.c +++ b/Robust/src/Runtime/bamboo/multicoremem.c @@ -116,6 +116,7 @@ void * smemalloc(int coren, unsigned INTPTR isize, unsigned INTPTR * allocsize) BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT(); void *retval=smemalloc_I(coren, isize, allocsize); BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME(); + GCPROFILE_RECORD_ALLOCATED_OBJ(*allocsize); return retval; } diff --git a/Robust/src/Runtime/bamboo/multicoremsg.c b/Robust/src/Runtime/bamboo/multicoremsg.c index e30e96c4..a92d30e8 100644 --- a/Robust/src/Runtime/bamboo/multicoremsg.c +++ b/Robust/src/Runtime/bamboo/multicoremsg.c @@ -63,7 +63,7 @@ int msgsizearray[] = { 1, //GCGRANTBLOCK, -1, //GCLOBJINFO, // 0xF2 #ifdef GC_PROFILE - 4, //GCPROFILES, // 0xF3 + 3, //GCPROFILES, // 0xF3 #endif // GC_PROFILE #ifdef GC_CACHE_ADAPT 1, //GCSTARTCACHEPOLICY // 0xF4 @@ -695,14 +695,11 @@ void processmsg_gcprofiles_I() { MSG_INDEXINC_I(); int data2 = msgdata[msgdataindex]; MSG_INDEXINC_I(); - int data3 = msgdata[msgdataindex]; - MSG_INDEXINC_I(); #ifdef MGC_SPEC if(gc_profile_flag) { #endif - gc_num_obj += data1; - gc_num_liveobj += data2; - gc_num_forwardobj += data3; + gc_num_liveobj += data1; + gc_num_forwardobj += data2; #ifdef MGC_SPEC } #endif diff --git a/Robust/src/Runtime/bamboo/multicoreruntime.c b/Robust/src/Runtime/bamboo/multicoreruntime.c index defc9709..9b0db431 100644 --- a/Robust/src/Runtime/bamboo/multicoreruntime.c +++ b/Robust/src/Runtime/bamboo/multicoreruntime.c @@ -413,10 +413,6 @@ void * allocate_new(void * ptr, v->lockcount = 0; #endif initlock(v); -#ifdef GC_PROFILE - extern unsigned int gc_num_obj; - gc_num_obj++; -#endif return v; } @@ -438,10 +434,6 @@ struct ArrayObject * allocate_newarray(void * ptr, } v->___length___=length; initlock((struct ___Object___ *)v); -#ifdef GC_PROFILE - extern unsigned int gc_num_obj; - gc_num_obj++; -#endif return v; } diff --git a/Robust/src/Runtime/bamboo/pmc_garbage.c b/Robust/src/Runtime/bamboo/pmc_garbage.c index 8933bcda..334005f9 100644 --- a/Robust/src/Runtime/bamboo/pmc_garbage.c +++ b/Robust/src/Runtime/bamboo/pmc_garbage.c @@ -1,5 +1,6 @@ #include "multicoregc.h" #include "multicoreruntime.h" +#include "multicoregcprofile.h" #include "pmc_garbage.h" #include "runtime_arch.h" #include "pmc_mark.h" @@ -92,31 +93,49 @@ void gc(struct garbagelist *gl) { #ifdef PERFCOUNT profile_start(GC_REGION); #endif - if (BAMBOO_NUM_OF_CORE==STARTUPCORE) + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { tprintf("start GC\n"); + GCPROFILE_START_MASTER(); + } pmc_init(); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_ITEM_MASTER(); + } //mark live objects //tprintf("mark\n"); pmc_mark(gl); //count live objects per unit tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_ITEM_MASTER(); + } //tprintf("count\n"); pmc_count(); tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_ITEM_MASTER(); + } //divide up work //tprintf("divide\n"); if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { pmc_processunits(); + GCPROFILE_ITEM_MASTER(); } tmc_spin_barrier_wait(&pmc_heapptr->barrier); //set up forwarding pointers //tprintf("forward\n"); pmc_doforward(); tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_ITEM_MASTER(); + } //update pointers //tprintf("updaterefs\n"); pmc_doreferenceupdate(gl); tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_ITEM_MASTER(); + } //compact data //tprintf("compact\n"); pmc_docompact(); @@ -136,6 +155,10 @@ void gc(struct garbagelist *gl) { gcflag=false; tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_CORE==STARTUPCORE) { + GCPROFILE_RECORD_SPACE_MASTER(); + GCPROFILE_END_MASTER(); + } #ifdef PERFCOUNT profile_start(APP_REGION); -- 2.34.1