Changes for out-of-core emulation in BigSim. Reasons could be referred to Chao Mei...
authorChao Mei <chaomei2@illinois.edu>
Tue, 30 Dec 2008 16:43:09 +0000 (16:43 +0000)
committerChao Mei <chaomei2@illinois.edu>
Tue, 30 Dec 2008 16:43:09 +0000 (16:43 +0000)
src/ck-ldb/LBDBManager.C
src/ck-ldb/LBDBManager.h

index 7637b1648c9c19ada51d2845f89a0d0cec265b14..567e8bd755195830eae8ec8c9b63fc1b7ab2f52e 100644 (file)
@@ -84,6 +84,10 @@ LDOMHandle LBDB::AddOM(LDOMid _userID, void* _userData,
   return newhandle;
 }
 
+#if CMK_BLUEGENE_CHARM
+#define LBOBJ_OOC_IDX 0x1
+#endif
+
 LDObjHandle LBDB::AddObj(LDOMHandle _omh, LDObjid _id,
                         void *_userData, CmiBool _migratable)
 {
@@ -94,9 +98,36 @@ LDObjHandle LBDB::AddObj(LDOMHandle _omh, LDObjid _id,
   newhandle.id = _id;
   
 #if 1
-  newhandle.handle = objs.length();
-  LBObj *obj = new LBObj(this, newhandle, _userData, _migratable);
-  objs.insertAtEnd(obj);
+#if CMK_BLUEGENE_CHARM
+  if(BgOutOfCoreFlag==2){ //taking object into memory
+    //first find the first (LBOBJ_OOC_IDX) in objs and insert the object at that position
+    int newpos = -1;
+    for(int i=0; i<objs.length(); i++){
+       if(objs[i]==(LBObj *)LBOBJ_OOC_IDX){
+           newpos = i;
+           break;
+       }
+    }
+    if(newpos==-1) newpos = objs.length();
+    newhandle.handle = newpos;
+    LBObj *obj = new LBObj(this, newhandle, _userData, _migratable);
+    objs.insert(newpos, obj);
+    //objCount is not increased since it's the original object which is pupped
+    //through out-of-core emulation. 
+    //objCount++;
+  }else
+#endif
+  {
+    //BIGSIM_OOC DEBUGGING
+    //CkPrintf("Proc[%d]: In AddObj for real migration\n", CkMyPe());
+    newhandle.handle = objs.length();
+    LBObj *obj = new LBObj(this, newhandle, _userData, _migratable);
+    objs.insertAtEnd(obj);
+    objCount++;
+  }
+  //BIGSIM_OOC DEBUGGING
+  //CkPrintf("LBDBManager.C: New handle: %d, LBObj=%p\n", newhandle.handle, objs[newhandle.handle]);
+
 #else
   LBObj *obj = new LBObj(this,_omh,_id,_userData,_migratable);
   if (obj != NULL) {
@@ -107,7 +138,6 @@ LDObjHandle LBDB::AddObj(LDOMHandle _omh, LDObjid _id,
   }
   obj->DepositHandle(newhandle);
 #endif
-  objCount++;
   return newhandle;
 }
 
@@ -117,7 +147,18 @@ void LBDB::UnregisterObj(LDObjHandle _h)
 // free the memory, it is a memory leak.
 // CmiPrintf("[%d] UnregisterObj: %d\n", CkMyPe(), _h.handle);
   delete objs[_h.handle];
-  objs[_h.handle] = NULL;
+
+#if CMK_BLUEGENE_CHARM
+  //hack for BigSim out-of-core emulation.
+  //we want the chare array object to keep at the same
+  //position even going through the pupping routine.
+  if(BgOutOfCoreFlag==1){ //in taking object out of memory
+    objs[_h.handle] = (LBObj *)(LBOBJ_OOC_IDX);
+  }else
+#endif
+  {
+    objs[_h.handle] = NULL;
+  }
 }
 
 void LBDB::RegisteringObjects(LDOMHandle _h)
@@ -201,7 +242,7 @@ void LBDB::ClearLoads(void)
 {
   int i;
   for(i=0; i < objCount; i++) {
-    LBObj *obj = objs[i];
+    LBObj *obj = objs[i]; 
     if (obj)
     {
       if (obj->data.cpuTime>.0) {
@@ -255,6 +296,9 @@ void LBDB::GetObjData(LDObjData *dp)
 
 int LBDB::Migrate(LDObjHandle h, int dest)
 {
+    //BIGSIM_OOC DEBUGGING
+    //CmiPrintf("[%d] LBDB::Migrate: incoming handle %d with handle range 0-%d\n", CkMyPe(), h.handle, objCount);
+
   if (h.handle > objCount)
     CmiPrintf("[%d] LBDB::Migrate: Handle %d out of range 0-%d\n",CkMyPe(),h.handle,objCount);
   else if (!objs[h.handle]) {
@@ -404,11 +448,30 @@ LDBarrierClient LocalBarrier::AddClient(LDResumeFn fn, void* data)
   new_client->refcount = cur_refcount;
 
   LDBarrierClient ret_val;
-  ret_val.serial = max_client;
-  clients.insertAtEnd(new_client);
-  max_client++;
+#if CMK_BLUEGENE_CHARM
+  ret_val.serial = first_free_client_slot;
+  clients.insert(ret_val.serial, new_client);
+
+  //looking for the next first free client slot
+  int nextfree=-1;
+  for(int i=first_free_client_slot+1; i<clients.size(); i++)
+    if(clients[i]==NULL) { nextfree = i; break; }
+  if(nextfree==-1) nextfree = clients.size();
+  first_free_client_slot = nextfree;
+
+  if(BgOutOfCoreFlag!=2){
+    //during out-of-core emualtion for BigSim, if taking procs from disk to mem,
+    //client_count should not be increased
+    client_count++;
+  }
 
+#else  
+  //ret_val.serial = max_client;
+  ret_val.serial = clients.size();
+  clients.insertAtEnd(new_client);
+  //max_client++;
   client_count++;
+#endif
 
   return ret_val;
 }
@@ -416,11 +479,27 @@ LDBarrierClient LocalBarrier::AddClient(LDResumeFn fn, void* data)
 void LocalBarrier::RemoveClient(LDBarrierClient c)
 {
   const int cnum = c.serial;
-  if (cnum < max_client && clients[cnum] != 0) {
+#if CMK_BLUEGENE_CHARM
+  if (cnum < clients.size() && clients[cnum] != 0) {
+    delete (clients[cnum]);
+    clients[cnum] = 0;
+
+    if(cnum<=first_free_client_slot) first_free_client_slot = cnum;
+
+    if(BgOutOfCoreFlag!=1){
+       //during out-of-core emulation for BigSim, if taking procs from mem to disk,
+       //client_count should not be increased
+       client_count--;
+    }
+  }
+#else
+  //if (cnum < max_client && clients[cnum] != 0) {
+  if (cnum < clients.size() && clients[cnum] != 0) {
     delete (clients[cnum]);
     clients[cnum] = 0;
     client_count--;
   }
+#endif
 }
 
 LDBarrierReceiver LocalBarrier::AddReceiver(LDBarrierFn fn, void* data)
@@ -431,9 +510,10 @@ LDBarrierReceiver LocalBarrier::AddReceiver(LDBarrierFn fn, void* data)
   new_receiver->on = 1;
 
   LDBarrierReceiver ret_val;
-  ret_val.serial = max_receiver;
+//  ret_val.serial = max_receiver;
+  ret_val.serial = receivers.size();
   receivers.insertAtEnd(new_receiver);
-  max_receiver++;
+//  max_receiver++;
 
   return ret_val;
 }
@@ -441,7 +521,8 @@ LDBarrierReceiver LocalBarrier::AddReceiver(LDBarrierFn fn, void* data)
 void LocalBarrier::RemoveReceiver(LDBarrierReceiver c)
 {
   const int cnum = c.serial;
-  if (cnum < max_receiver && receivers[cnum] != 0) {
+  //if (cnum < max_receiver && receivers[cnum] != 0) {
+  if (cnum < receivers.size() && receivers[cnum] != 0) {
     delete (receivers[cnum]);
     receivers[cnum] = 0;
   }
@@ -450,7 +531,8 @@ void LocalBarrier::RemoveReceiver(LDBarrierReceiver c)
 void LocalBarrier::TurnOnReceiver(LDBarrierReceiver c)
 {
   const int cnum = c.serial;
-  if (cnum < max_receiver && receivers[cnum] != 0) {
+  //if (cnum < max_receiver && receivers[cnum] != 0) {
+  if (cnum < receivers.size() && receivers[cnum] != 0) {
     receivers[cnum]->on = 1;
   }
 }
@@ -458,7 +540,8 @@ void LocalBarrier::TurnOnReceiver(LDBarrierReceiver c)
 void LocalBarrier::TurnOffReceiver(LDBarrierReceiver c)
 {
   const int cnum = c.serial;
-  if (cnum < max_receiver && receivers[cnum] != 0) {
+  //if (cnum < max_receiver && receivers[cnum] != 0) {
+  if (cnum < receivers.size() && receivers[cnum] != 0) {
     receivers[cnum]->on = 0;
   }
 }
@@ -483,7 +566,8 @@ void LocalBarrier::CheckBarrier()
   if (at_count >= client_count) {
     CmiBool at_barrier = CmiFalse;
 
-    for(int i=0; i < max_client; i++)
+//    for(int i=0; i < max_client; i++)
+    for(int i=0; i < clients.size(); i++)
       if (clients[i] != 0 && ((client*)clients[i])->refcount >= cur_refcount)
        at_barrier = CmiTrue;
                
@@ -500,7 +584,8 @@ void LocalBarrier::CallReceivers(void)
   CmiBool called_receiver=CmiFalse;
 
 //  for(int i=0; i < max_receiver; i++)
-   for (int i=max_receiver-1; i>=0; i--) {
+//   for (int i=max_receiver-1; i>=0; i--) {
+   for (int i=receivers.size()-1; i>=0; i--) {
       receiver *recv = receivers[i];
       if (recv != 0 && recv->on) {
         recv->fn(recv->data);
@@ -515,7 +600,8 @@ void LocalBarrier::CallReceivers(void)
 
 void LocalBarrier::ResumeClients(void)
 {
-  for(int i=0; i < max_client; i++)
+//  for(int i=0; i < max_client; i++)
+  for(int i=0; i < clients.size(); i++)
     if (clients[i] != 0) {
       ((client*)clients[i])->fn(((client*)clients[i])->data);
     }  
index 69b9eb86fd342ca5e21969b74d01ff5286c25cb9..26e24336295a092f534847ffd91a614ce9db6b35 100644 (file)
@@ -26,7 +26,11 @@ class LocalBarrier {
 friend class LBDB;
 public:
   LocalBarrier() { cur_refcount = 1; client_count = 0; max_client = 0;
-                   max_receiver= 0; at_count = 0; on = CmiFalse; };
+                   max_receiver= 0; at_count = 0; on = CmiFalse; 
+       #if CMK_BLUEGENE_CHARM
+       first_free_client_slot = 0;
+       #endif
+    };
   ~LocalBarrier() { };
 
   LDBarrierClient AddClient(LDResumeFn fn, void* data);
@@ -64,6 +68,10 @@ private:
   int max_receiver;
   int at_count;
   CmiBool on;
+
+  #if CMK_BLUEGENE_CHARM
+  int first_free_client_slot;
+  #endif
 };
 
 class LBDB {