optimize HybridBaseLB::ReceiveVectorMigration to send aggregated message instead...
authorGengbin Zheng <gzheng@justice.(none)>
Wed, 10 Feb 2010 06:05:46 +0000 (00:05 -0600)
committerGengbin Zheng <gzheng@justice.(none)>
Wed, 10 Feb 2010 06:05:46 +0000 (00:05 -0600)
src/ck-ldb/CentralLB.C
src/ck-ldb/HybridBaseLB.C
src/ck-ldb/HybridBaseLB.ci
src/ck-ldb/HybridBaseLB.h
src/ck-ldb/LButil.C

index e60bd8afd9b01c36e13a4e77ef8d923c3b94dfa7..6e6ee4100047f3bfcffacf1a90dca797e62760bb 100644 (file)
@@ -951,6 +951,11 @@ void CentralLB::CheckMigrationComplete()
 #if CMK_LBDB_ON
   lbdone ++;
   if (lbdone == 2) {
+    if (_lb_args.debug() && CkMyPe()==0) {
+      double end_lb_time = CkWallTimer();
+      CkPrintf("[%s] Load balancing step %d finished at %f duration %f\n",
+                lbName(), step()-1,end_lb_time,end_lb_time - start_lb_time);
+    }
     lbdone = 0;
     future_migrates_expected = -1;
     future_migrates_completed = 0;
index 8e82fa05fa12f56f16342c6295dc379418aa80e6..15d99ea346a9047fb087ad6334e3622eb5e13ff4 100644 (file)
@@ -449,7 +449,7 @@ void HybridBaseLB::Loadbalancing(int atlevel)
 
   if (atlevel == tree->numLevels()-1) {
     if (_lb_args.debug()>0){
-        CkPrintf("[%d] Level %d Strat elapsed time %f\n", CkMyPe(), atlevel, strat_end_time-start_lb_time);
+        CkPrintf("[%d] Level %d Strat finished at: %f elapsed time %f\n", CkMyPe(), atlevel, strat_end_time, strat_end_time-start_lb_time);
        CkPrintf("[%d] %s memUsage: %.2fKB\n", CkMyPe(), lbName(), (1.0*useMem())/1024);
     }
   }
@@ -504,6 +504,7 @@ void HybridBaseLB::ReceiveMigration(LBMigrateMsg *msg)
   // do LDStats migration
   const int me = CkMyPe();
   lData->migrates_expected = 0;
+
   for(int i=0; i < msg->n_moves; i++) {
     MigrateInfo& move = msg->moves[i];
     // incoming
@@ -592,6 +593,8 @@ void HybridBaseLB::ReceiveVectorMigration(LBVectorMigrateMsg *msg)
   lData->vector_expected  = 0;
   for (int i=0; i<msg->n_moves; i++)  {
     VectorMigrateInfo &move = msg->moves[i];
+    CkVec<LDObjData> objs;
+    CkVec<LDCommData> comms;
     if (move.from_pe == CkMyPe()) {
       int toPe = move.to_pe;
       double load = move.load;
@@ -601,10 +604,9 @@ void HybridBaseLB::ReceiveVectorMigration(LBVectorMigrateMsg *msg)
         if (objData.wallTime <= load) {
           if (_lb_args.debug()>2)
             CkPrintf("[%d] send obj: %d to %d.\n", CkMyPe(), obj, toPe);
+          objs.push_back(objData);
          // send comm data
-          CkVec<LDCommData> comms;
           collectCommData(obj, comms, atlevel);
-          thisProxy[toPe].ObjMigrated(objData, comms.getVec(), comms.size(), atlevel);
           lData->outObjs.push_back(MigrationRecord(objData.handle, lData->children[statsData->from_proc[obj]], -1));
           statsData->removeObject(obj);
           load -= objData.wallTime; 
@@ -614,6 +616,8 @@ void HybridBaseLB::ReceiveVectorMigration(LBVectorMigrateMsg *msg)
       }
       if (_lb_args.debug()>1)
         CkPrintf("[%d] sending %d objects to %d.\n", CkMyPe(), count, toPe);
+      if (objs.size() > 0)
+        thisProxy[toPe].ObjsMigrated(objs.getVec(), objs.size(), comms.getVec(), comms.size(), atlevel);
       thisProxy[toPe].TotalObjMigrated(count, atlevel);
     }
     else if (move.to_pe == CkMyPe()) {
@@ -732,6 +736,54 @@ void HybridBaseLB::ObjMigrated(LDObjData data, LDCommData *cdata, int n, int atl
   }
 }
 
+// objects arrives with only objdata
+void HybridBaseLB::ObjsMigrated(LDObjData *datas, int m, LDCommData *cdata, int n, int atlevel)
+{
+  int i;
+  LevelData *lData = levelData[atlevel];
+  LDStats *statsData = lData->statsData;
+
+  if (statsData != NULL) {
+    CkVec<LDObjData> &oData = statsData->objData;
+
+    for (i=0; i<m; i++)
+    {
+      // copy into LDStats
+      LDObjData &data = datas[i];
+      oData.push_back(data);
+      statsData->n_objs++;
+      if (data.migratable) statsData->n_migrateobjs++;
+      // an incoming object to the root
+      // pretend this object belongs to it
+      statsData->from_proc.push_back(lData->nChildren);
+      statsData->to_proc.push_back(lData->nChildren);
+    }
+
+    // copy into comm data
+    if (n) {
+      CkVec<LDCommData> &cData = statsData->commData;
+      for (int i=0; i<n; i++) 
+        cData.push_back(cdata[i]);
+      statsData->n_comm += n;
+      statsData->deleteCommHash();
+    }
+  }
+  else {       // leaf node, from which proc is unknown at this time
+    for (i=0; i<m; i++) {
+      LDObjData &data = datas[i];
+      LDObjKey key;
+      key.omID() = data.omID();
+      key.objID() = data.objID();
+      newObjs.push_back(Location(key, -1));
+    }
+  }
+
+  lData->obj_completed+=m;
+  if (lData->migrationDone()) {
+    StatsDone(atlevel);
+  }
+}
+
 
 void HybridBaseLB::StatsDone(int atlevel)
 {
index f252ea951e10a38de34a91a20f7e6366d46e2756..a3a727f2143154792bc017b1f89e35e65628926a 100644 (file)
@@ -19,6 +19,7 @@ group [migratable] HybridBaseLB: BaseLB {
   entry void ReceiveVectorMigration(LBVectorMigrateMsg*);      
   entry void TotalObjMigrated(int count, int level);
   entry void ObjMigrated(LDObjData data, LDCommData cdata[n], int n, int level);
+  entry void ObjsMigrated(LDObjData data[m], int m, LDCommData cdata[n], int n, int level);
   entry void Loadbalancing(int level); 
   entry void NotifyObjectMigrationDone(int);   
   entry void StartCollectInfo();
index cb94c21e244b9d4a8db2e9a4e85107d7be4e4dbd..467ea5b9e40f26ccec3644d3846f3294a0a87844 100644 (file)
@@ -206,6 +206,7 @@ public:
   void Migrated(LDObjHandle h, int waitBarrier);
 
   void ObjMigrated(LDObjData data, LDCommData *cdata, int n, int level);
+  void ObjsMigrated(LDObjData *data, int m, LDCommData *cdata, int n, int level);
   void VectorDone(int atlevel);
   void MigrationDone(int balancing);  // Call when migration is complete
   void StatsDone(int level);  // Call when LDStats migration is complete
index 4169e46207342547bf1b91bf02f7d8d9a7a71419..2761456a23293f6cd08a616aadd85d9c9de18420 100644 (file)
@@ -86,7 +86,7 @@ LBVectorMigrateMsg * VectorStrategy(BaseLB::LDStats *stats, int count)
   }
 
   if (_lb_args.debug()>1) {
-    CkPrintf("After migration: (%d)", count);
+    CkPrintf("After migration: (%d) ", count);
     for (i=0; i<count; i++) CkPrintf("%f ", processors[i].load);
     CkPrintf("\n");
   }