Add gcprofile to PMC garbage collector and compute the size of allocated obj instead...
authorjzhou <jzhou>
Sat, 16 Jul 2011 17:26:01 +0000 (17:26 +0000)
committerjzhou <jzhou>
Sat, 16 Jul 2011 17:26:01 +0000 (17:26 +0000)
Robust/src/Runtime/bamboo/multicoregarbage.c
Robust/src/Runtime/bamboo/multicoregccompact.c
Robust/src/Runtime/bamboo/multicoregcprofile.c
Robust/src/Runtime/bamboo/multicoregcprofile.h
Robust/src/Runtime/bamboo/multicoremem.c
Robust/src/Runtime/bamboo/multicoremsg.c
Robust/src/Runtime/bamboo/multicoreruntime.c
Robust/src/Runtime/bamboo/pmc_garbage.c

index 058c92b8ad4d3a2fd9549c401901e99c75053d7e..4518fed89c10057533a9a19906e331d67af6d4b0 100644 (file)
@@ -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);
index 75b0b3fc7d95e42cac9fa4d97759509befb3226d..adb3be116bdb255e4e713f55a57f81732527ae93 100644 (file)
@@ -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");
 }
 
index bf9da3edb14ebfdfedbe4a1d6cc6a5c5f80828f7..9f3b1af800fb6ba7f127ebb5f9cb872f416cf886 100644 (file)
@@ -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]);
   }
index 9ddbf86aaa83a82c227646a23153a165326cd95b..899c7b70f8ffa7900969ed201c5c19e8a157e50e 100644 (file)
@@ -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;i<NUMCORES4GC;i+=2) { \
+        void *startptr=pmc_heapptr->regions[i].lastptr; \
+        void *finishptr=(i+1)<NUMCORES4GC?pmc_heapptr->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;i<NUMCORES4GC;i+=2) { \
+      void *startptr=pmc_heapptr->regions[i].lastptr; \
+      void *finishptr=(i+1)<NUMCORES4GC?pmc_heapptr->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;searchblock<GCNUMBLOCK;searchblock++) { \
+      struct blockrecord * block=&allocationinfo.blocktable[searchblock]; \
+      if (block->status==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
 
index 0b04b03771541d71481caa663e99134d04018692..3b030daa66f25f7a148c8401a9daa75ea407e141 100644 (file)
@@ -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;
 }
 
index e30e96c4109b68818cdaa665ba1aaf8c122a7b31..a92d30e8703a7c5dcfba4ef5cc6fab5e1aa4e9a8 100644 (file)
@@ -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
index defc97092dec9e0e4a7f94168091fa5a17840875..9b0db4319972004809d8fc0281c5b131989cba80 100644 (file)
@@ -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;
 }
 
index 8933bcda0d970577a79db79180180bc642b12e3b..334005f9ff333d30afb7d90e054357bac86e1e95 100644 (file)
@@ -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);