bug fix in multicore code
authorjzhou <jzhou>
Sat, 7 May 2011 00:52:52 +0000 (00:52 +0000)
committerjzhou <jzhou>
Sat, 7 May 2011 00:52:52 +0000 (00:52 +0000)
Robust/src/Benchmarks/Scheduling/GC/tsp/TSPBench.java
Robust/src/Runtime/bamboo/multicoregarbage.c
Robust/src/Runtime/bamboo/multicoregarbage.h
Robust/src/Runtime/bamboo/multicoregcmark.c
Robust/src/Runtime/bamboo/multicoremem.c
Robust/src/Runtime/bamboo/multicoremem.h
Robust/src/Runtime/bamboo/multicoremsg.c
Robust/src/Runtime/bamboo/multicoreruntime.c

index 1d305a83243af4aed1e394df60187f4f1139ee50..d1f50674af7656b48b8e46d386285ac86bb6c673 100644 (file)
@@ -8,7 +8,7 @@ task t1(StartupObject s{initialstate}) {
   //System.printString("task t1\n");
 
   int threadnum = 62; // 56;
-  int ncities = 4080;
+  int ncities = 4080*2;
   for(int i = 0; i < threadnum; ++i) {
     TestRunner tr = newflag TestRunner(ncities){run};
   }
index f228ca76ac6c92426f0173b50a1578f1c374f707..5ae1dab9b6dd2d9a987e16515bb06912959ee74a 100644 (file)
@@ -203,22 +203,23 @@ INLINE void initGC() {
     gcheadindex=gctailindex=gctailindex2 = 0;
     gchead=gctail=gctail2=RUNMALLOC(sizeof(struct pointerblock));
   } else {
-    gctailindex = gctailindex2 = gcheadindex = 0;
-    gctail = gctail2 = gchead;
+    gctailindex=gctailindex2=gcheadindex=0;
+    gctail=gctail2=gchead;
   }
+  gchead->next=NULL;
 
   // initialize the large obj queues
   if (gclobjhead==NULL) {
     gclobjheadindex=0;
     gclobjtailindex=0;
-    gclobjtailindex2 = 0;
+    gclobjtailindex2=0;
     gclobjhead=gclobjtail=gclobjtail2=
-    RUNMALLOC(sizeof(struct lobjpointerblock));
+      RUNMALLOC(sizeof(struct lobjpointerblock));
   } else {
-    gclobjtailindex = gclobjtailindex2 = gclobjheadindex = 0;
-    gclobjtail = gclobjtail2 = gclobjhead;
+    gclobjtailindex=gclobjtailindex2=gclobjheadindex=0;
+    gclobjtail=gclobjtail2=gclobjhead;
   }
-  gclobjhead->next = gclobjhead->prev = NULL;
+  gclobjhead->next=gclobjhead->prev=NULL;
 
   freeMGCHash(gcforwardobjtbl);
   gcforwardobjtbl = allocateMGCHash(20, 3);
@@ -253,8 +254,7 @@ INLINE void checkMarkStatue() {
     gcnumsendobjs[entry_index][BAMBOO_NUM_OF_CORE] = gcself_numsendobjs;
     gcnumreceiveobjs[entry_index][BAMBOO_NUM_OF_CORE] = gcself_numreceiveobjs;
     // check the status of all cores
-    bool allStall = gc_checkAllCoreStatus_I();
-    if(allStall) {
+    if(gc_checkAllCoreStatus_I()) {
       // ask for confirm
       if(!waitconfirm) {
         // the first time found all cores stall
@@ -677,7 +677,6 @@ INLINE void moveLObjs() {
 
 INLINE void gc_collect(struct garbagelist * stackptr) {
   gcprocessing = true;
-  tprintf("gc \n");
   // inform the master that this core is at a gc safe point and is ready to 
   // do gc
   send_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, self_numsendobjs, 
@@ -735,7 +734,6 @@ INLINE void gc_collect(struct garbagelist * stackptr) {
 
 INLINE void gc_nocollect(struct garbagelist * stackptr) {
   gcprocessing = true;
-  tprintf("gc \n");
   // inform the master that this core is at a gc safe point and is ready to 
   // do gc
   send_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, self_numsendobjs, 
@@ -804,7 +802,7 @@ INLINE void gc_master(struct garbagelist * stackptr) {
   GCPROFILE_ITEM();
   CACHEADAPT_OUTPUT_CACHE_SAMPLING();
 
-  GC_PRINTF("(%x,%x) Start mark phase \n");
+  GC_PRINTF("Start mark phase \n");
   GC_SEND_MSG_1_TO_CLIENT(GCSTART);
   gcphase = MARKPHASE;
   // mark phase
@@ -814,7 +812,7 @@ INLINE void gc_master(struct garbagelist * stackptr) {
     if(isfirst) {
       isfirst = false;
     }
-
+    
     // check gcstatus
     checkMarkStatue();
   }
index 97ee59abc0c356420206f7cf7c5d9232be24bd6b..59f96c534d5f5440e885de33f25b49df9ecdbe8e 100644 (file)
@@ -217,14 +217,14 @@ unsigned int size_cachepolicytbl;
     } \
   }
 
-// send a 1-word msg to all client
+// send a 1-word msg to all clients
 #define GC_SEND_MSG_1_TO_CLIENT(m) \
   { \
     for(int i = 0; i < NUMCORESACTIVE; ++i) { \
+      gccorestatus[i] = 1; \
       if(BAMBOO_NUM_OF_CORE != i) { \
         send_msg_1(i, (m), false); \
       } \
-      gccorestatus[i] = 1; \
     } \
   }
 
index 9752f5f673b447700655103577cfd3331d27c02a..264186e7461e995fc1535b98bb7524cf49efe5ff 100644 (file)
@@ -73,7 +73,6 @@ INLINE unsigned int gc_dequeue_I() {
       gcspare->next = NULL;
     } 
   } 
-  int loopiter = 0;
   return gctail->ptrs[gctailindex++];
 } 
 
@@ -84,7 +83,6 @@ INLINE unsigned int gc_dequeue2_I() {
     gctail2=gctail2->next;
     gctailindex2=0;
   } 
-  int loopiter = 0;
   return gctail2->ptrs[gctailindex2++];
 }
 
@@ -411,7 +409,7 @@ INLINE void scanPtrsInObj(void * ptr,
     /* Array of primitives */
     pointer=pointerarray[OBJECTTYPE];
     //handle object class
-    unsigned int size=pointer[0];
+    int size=pointer[0];
     int i;
     for(i=1; i<=size; i++) {
       unsigned int offset=pointer[i];
@@ -434,7 +432,7 @@ INLINE void scanPtrsInObj(void * ptr,
     {
       pointer=pointerarray[OBJECTTYPE];
       //handle object class
-      unsigned int size=pointer[0];
+      int size=pointer[0];
       int i;
       for(i=1; i<=size; i++) {
         unsigned int offset=pointer[i];
@@ -445,7 +443,7 @@ INLINE void scanPtrsInObj(void * ptr,
      }
     }
   } else {
-    unsigned int size=pointer[0];
+    int size=pointer[0];
     int i;
     for(i=1; i<=size; i++) {
       unsigned int offset=pointer[i];
@@ -470,6 +468,7 @@ INLINE void mark(bool isfirst,
   bool sendStall = false;
   // mark phase
   while(MARKPHASE == gcphase) {
+    int counter = 0;
     while(true) {
       BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
       if(!gc_moreItems2_I()) {
index e55e9090b48af8e45d61c9e173f82a7b1d0a5a06..8befb79414a021b7cd9f6afcd70a3453c0d76998 100644 (file)
@@ -709,20 +709,20 @@ void * smemalloc_I(int coren,
   if(mem == NULL) {
     // no enough shared global memory
     *allocsize = 0;
-       if(!gcflag) {
-         gcflag = true;
-         if(!gcprocessing) {
-      // inform other cores to stop and wait for gc
-      gcprecheck = true;
-      for(int i = 0; i < NUMCORESACTIVE; i++) {
-        // reuse the gcnumsendobjs & gcnumreceiveobjs
-        gcnumsendobjs[0][i] = 0;
-        gcnumreceiveobjs[0][i] = 0;
+    if(!gcflag) {
+      gcflag = true;
+      if(!gcprocessing) {
+        // inform other cores to stop and wait for gc
+        gcprecheck = true;
+        for(int i = 0; i < NUMCORESACTIVE; i++) {
+          // reuse the gcnumsendobjs & gcnumreceiveobjs
+          gcnumsendobjs[0][i] = 0;
+          gcnumreceiveobjs[0][i] = 0;
+        }
+        GC_SEND_MSG_1_TO_CLIENT(GCSTARTPRE);
       }
-      GC_SEND_MSG_1_TO_CLIENT(GCSTARTPRE);
-         }
-       }
-       return NULL;
+    }
+    return NULL;
   }
   return mem;
 }
index 4bd0c80da8103d5d23ae9d1f3fc5fc7001b61996..0b29f7c92f6641967db530b3f7d2028dec180d9d 100644 (file)
@@ -82,7 +82,7 @@
 #define BAMBOO_PAGE_SIZE ((unsigned int)(256 * 1024))  // (4096)
 #define BAMBOO_SMEM_SIZE ((unsigned int)(BAMBOO_PAGE_SIZE))
 #elif defined GC_SMALLPAGESIZE2
-#define BAMBOO_PAGE_SIZE ((unsigned int)(64 * 1024))  // (4096)
+#define BAMBOO_PAGE_SIZE ((unsigned int)(256 * 1024))  // (4096) 64
 #define BAMBOO_SMEM_SIZE ((unsigned int)(BAMBOO_PAGE_SIZE))
 #else
 #define BAMBOO_PAGE_SIZE ((unsigned int)(1024 * 1024))  // (4096)
index 1e8d85a6b626d65db5ced0884ab16c720dc66a07..9876acc715550f9d5bf18990361eee82c49e5960 100644 (file)
@@ -521,8 +521,7 @@ INLINE void processmsg_memresponse_I() {
 
 #ifdef MULTICORE_GC
 INLINE void processmsg_gcstartpre_I() {
-       // the first time to be informed to start gc
-  tprintf("pre msg \n");
+  // the first time to be informed to start gc
        gcflag = true;
        if(!smemflag) {
     // Zero out the remaining memory here because for the GC_CACHE_ADAPT 
@@ -844,6 +843,10 @@ msg:
   if(receiveMsg(send_port_pending) == -1) {
     return -1;
   }
+  if(BAMBOO_CHECK_SEND_MODE()) {
+    // during send, don't process the msg now
+    return -3; 
+  }
 processmsg:
   // processing received msgs
   int size = 0;
index 6c4b5f01315b9d18066524b18d9255e541a00d76..de05e9ccf7ae98463b34f4c9affef158d8587f4d 100644 (file)
@@ -676,7 +676,6 @@ INLINE void getprofiledata() {
 }
 
 INLINE void checkCoreStatus() {
-  bool allStall = false;
   int i = 0;
   int sumsendobj = 0;
   if((!waitconfirm) ||
@@ -686,14 +685,12 @@ INLINE void checkCoreStatus() {
     numsendobjs[BAMBOO_NUM_OF_CORE] = self_numsendobjs;
     numreceiveobjs[BAMBOO_NUM_OF_CORE] = self_numreceiveobjs;
     // check the status of all cores
-    allStall = true;
     for(i = 0; i < NUMCORESACTIVE; ++i) {
       if(corestatus[i] != 0) {
-        allStall = false;
         break;
       }
     } 
-    if(allStall) {
+    if(i == NUMCORESACTIVE) {
       // check if the sum of send objs and receive obj are the same
       // yes->check if the info is the latest; no->go on executing
       sumsendobj = 0;
@@ -716,7 +713,7 @@ INLINE void checkCoreStatus() {
             corestatus[i] = 1;
             // send status confirm msg to core i
             send_msg_1(i, STATUSCONFIRM, false);
-          }   // for(i = 1; i < NUMCORESACTIVE; ++i)
+          }   
           return;
         } else {
           // all the core status info are the latest
@@ -729,20 +726,20 @@ INLINE void checkCoreStatus() {
           disruntimedata();
           BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
           terminate();  // All done.
-        }  // if(!waitconfirm)
+        }
       } else {         
         // still some objects on the fly on the network
         // reset the waitconfirm and numconfirm
         waitconfirm = false;
         numconfirm = 0;
-      }  //  if(0 == sumsendobj)
+      }  
     } else {
       // not all cores are stall, keep on waiting
       waitconfirm = false;
       numconfirm = 0;
-    }  //  if(allStall)
+    }  
     BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-  }  // if((!waitconfirm) ||
+  } 
 }
 
 // main function for each core
@@ -858,6 +855,6 @@ inline void run(int argc, char** argv) {
       }
     }
   }
-} // run()
+} 
 
 #endif // MULTICORE