important changes:
authorGengbin Zheng <gzheng@illinois.edu>
Tue, 8 Jul 2003 23:25:13 +0000 (23:25 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Tue, 8 Jul 2003 23:25:13 +0000 (23:25 +0000)
completely rewrote database structure for saving communicaiton data, allowing description for multicast;

16 files changed:
src/ck-ldb/CentralLB.C
src/ck-ldb/CentralLB.h
src/ck-ldb/Comm1LB.C
src/ck-ldb/Comm1LB.h
src/ck-ldb/CommLB.C
src/ck-ldb/CommLB.h
src/ck-ldb/LBComm.C
src/ck-ldb/LBComm.h
src/ck-ldb/MetisLB.C
src/ck-ldb/ObjGraph.C
src/ck-ldb/ObjGraph.h
src/ck-ldb/OrbLB.C
src/ck-ldb/RecBisectBfLB.C
src/ck-ldb/Refiner.C
src/ck-ldb/graph.c
src/ck-ldb/lbdb.h

index 6eff90b84a5887777087f8e3e634e9a7592f3e09..8fcf8c184951bb6affe745809b3a7978c39dc577 100644 (file)
@@ -47,21 +47,18 @@ void set_avail_vector(char * bitmap){
 void CentralLB::staticStartLB(void* data)
 {
   CentralLB *me = (CentralLB*)(data);
-
   me->StartLB();
 }
 
 void CentralLB::staticMigrated(void* data, LDObjHandle h)
 {
   CentralLB *me = (CentralLB*)(data);
-
   me->Migrated(h);
 }
 
 void CentralLB::staticAtSync(void* data)
 {
   CentralLB *me = (CentralLB*)(data);
-
   me->AtSync();
 }
 
@@ -189,7 +186,7 @@ void CentralLB::buildStats()
     statsData->commData = new LDCommData[statsData->n_comm];
     int nobj = 0;
     int ncom = 0;
-    // copy all data in individule message to this bug structure
+    // copy all data in individule message to this big structure
     for (int pe=0; pe<stats_msg_count; pe++) {
        int i;
        CLBStatsMsg *msg = statsMsgsList[pe];
@@ -228,18 +225,19 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
             pe);
   } else {
     statsMsgsList[pe] = m;
+    // store per processor data right away
     struct ProcStats &procStat = statsData->procs[pe];
     procStat.total_walltime = m->total_walltime;
     procStat.total_cputime = m->total_cputime;
     if (lb_ignoreBgLoad) {
-    procStat.idletime = 0.0;
-    procStat.bg_walltime = 0.0;
-    procStat.bg_cputime = 0.0;
+      procStat.idletime = 0.0;
+      procStat.bg_walltime = 0.0;
+      procStat.bg_cputime = 0.0;
     }
     else {
-    procStat.idletime = m->idletime;
-    procStat.bg_walltime = m->bg_walltime;
-    procStat.bg_cputime = m->bg_cputime;
+      procStat.idletime = m->idletime;
+      procStat.bg_walltime = m->bg_walltime;
+      procStat.bg_cputime = m->bg_cputime;
     }
     procStat.pe_speed = m->pe_speed;
     procStat.utilization = 1.0;
@@ -255,7 +253,6 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
   if (stats_msg_count == clients) {
 //    double strat_start_time = CmiWallTimer();
 
-//    CkPrintf("Before setting bitmap\n");
     // build data
     buildStats();
 
@@ -266,7 +263,6 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
       statsData->procs[proc].available = (CmiBool)avail_vector[proc];
 
 //    CkPrintf("Before Calling Strategy\n");
-
     LBMigrateMsg* migrateMsg = Strategy(statsData, clients);
 
 //    CkPrintf("returned successfully\n");
@@ -277,10 +273,7 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
     migrateMsg->next_lb = new_ld_balancer;
 
 //  very time consuming, only needed for step load balancing
-#if 0
-    getPredictedLoad(statsDataList, clients, migrateMsg, migrateMsg->expectedLoad);
-#endif
-
+//    getPredictedLoad(statsDataList, clients, migrateMsg, migrateMsg->expectedLoad);
 
 //  CkPrintf("calling recv migration\n");
     thisProxy.ReceiveMigration(migrateMsg);
@@ -290,8 +283,8 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
     statsData->clear();
     stats_msg_count=0;
 
-    double strat_end_time = CmiWallTimer();
-    //     CkPrintf("Strat elapsed time %f\n",strat_end_time-strat_start_time);
+//    double strat_end_time = CmiWallTimer();
+//    CkPrintf("Strat elapsed time %f\n",strat_end_time-strat_start_time);
   }
 
 }
@@ -302,8 +295,9 @@ static int isMigratable(LDObjData **objData, int *len, int count, const LDCommDa
   for (int pe=0 ; pe<count; pe++)
   {
     for (int i=0; i<len[pe]; i++)
-      if (LDObjIDEqual(objData[pe][i].id(), commData.sender) ||
-          LDObjIDEqual(objData[pe][i].id(), commData.receiver)) return 0;
+      if (LDObjIDEqual(objData[pe][i].objID(), commData.sender.objID()) ||
+          LDObjIDEqual(objData[pe][i].objID(), commData.receiver.get_destObj().objID())) 
+      return 0;
   }
   return 1;
 }
@@ -452,7 +446,7 @@ void CentralLB::work(LDStats* stats,int count)
     for(i=0; i < osz; i++) {
       LDObjData &odata = stats->objData[i];
       CkPrintf("Object %d\n",i);
-      CkPrintf("     id = %d\n",odata.id().id[0]);
+      CkPrintf("     id = %d\n",odata.objID().id[0]);
       CkPrintf("  OM id = %d\n",odata.omID().id);
       CkPrintf("   Mig. = %d\n",odata.migratable);
       CkPrintf("    CPU = %f\n",odata.cpuTime);
@@ -471,13 +465,13 @@ void CentralLB::work(LDStats* stats,int count)
        CkPrintf("    sender PE = %d\n",cdata[i].src_proc);
       else
        CkPrintf("    sender id = %d:%d\n",
-                cdata[i].senderOM.id,cdata[i].sender.id[0]);
+                cdata[i].sender.omID().id,cdata[i].sender.objID().id[0]);
 
-      if (cdata[i].to_proc())
-       CkPrintf("  receiver PE = %d\n",cdata[i].dest_proc);
+      if (cdata[i].recv_type() == LD_PROC_MSG)
+       CkPrintf("  receiver PE = %d\n",cdata[i].receiver.proc());
       else     
        CkPrintf("  receiver id = %d:%d\n",
-                cdata[i].receiverOM.id,cdata[i].receiver.id[0]);
+                cdata[i].receiver.get_destObj().omID().id,cdata[i].receiver.get_destObj().objID().id[0]);
       
       CkPrintf("     messages = %d\n",cdata[i].messages);
       CkPrintf("        bytes = %d\n",cdata[i].bytes);
@@ -565,19 +559,9 @@ void CentralLB::writeStatsMsgs(const char* filename) {
     CmiAbort("writeStatsMsgs failed to open the output file!\n");
 
   PUP::toDisk p(f);
-  p|stats_msg_count;
 
-#if LB_DUMP_MSG
-  for (i = 0; i < stats_msg_count; i++) {
-    CLBStatsMsg *m = statsMsgsList[i];
-    envelope *env=UsrToEnv(m);
-    CkPackMessage(&env); //Pack it
-    m = (CLBStatsMsg *)EnvToUsr(env);
-    CkPupMessage(p, (void **)&m, 2);
-  }
-#else
+  p|stats_msg_count;
   statsData->pup(p);
-#endif
 
   fclose(f);
 
@@ -629,15 +613,15 @@ static void getPredictedLoad(CentralLB::LDStats* stats, int count,
          if(cdata.from_proc())
            senderPE = cdata.src_proc;
          else {
-           int idx = stats->getHash(cdata.sender, cdata.senderOM);
+           int idx = stats->getHash(cdata.sender);
            CmiAssert(idx != -1);
            senderPE = stats->to_proc[idx];
            CmiAssert(senderPE != -1);
          }
-         if(cdata.to_proc())
-           receiverPE = cdata.dest_proc;
+         if(cdata.receiver.get_type() == LD_PROC_MSG)
+           receiverPE = cdata.receiver.proc();
          else {
-           int idx = stats->getHash(cdata.receiver, cdata.receiverOM);
+           int idx = stats->getHash(cdata.receiver.get_destObj());
            CmiAssert(idx != -1);
            receiverPE = stats->to_proc[idx];
            CmiAssert(receiverPE != -1);
@@ -692,15 +676,8 @@ inline static int ObjKey(const LDObjid &oid, const int hashSize) {
 }
 
 void CentralLB::LDStats::makeCommHash() {
-  if (transTable) return;
-
-  transTable = new LDOId[n_objs];
-  for (int obj=0; obj < n_objs; obj++){
-      LDObjData &oData = objData[obj];
-      transTable[obj].mid.id = oData.omID().id;
-      transTable[obj].oid = oData.id();
-  }
   int i;
+  if (objHash) return;
    
   hashSize = n_objs*2;
   objHash = new int[hashSize];
@@ -708,7 +685,7 @@ void CentralLB::LDStats::makeCommHash() {
         objHash[i] = -1;
    
   for(i=0;i<n_objs;i++){
-        LDObjid &oid = transTable[i].oid;
+        const LDObjid &oid = objData[i].objID();
         int hash = ObjKey(oid, hashSize);
         while(objHash[hash] != -1)
             hash = (hash+1)%hashSize;
@@ -719,8 +696,6 @@ void CentralLB::LDStats::makeCommHash() {
 void CentralLB::LDStats::deleteCommHash() {
   if (objHash) delete [] objHash;
   objHash = NULL;
-  if (transTable) delete [] transTable;
-  transTable = NULL;
 }
 
 int CentralLB::LDStats::getHash(const LDObjid &oid, const LDOMid &mid)
@@ -729,14 +704,20 @@ int CentralLB::LDStats::getHash(const LDObjid &oid, const LDOMid &mid)
 
     for(int id=0;id<hashSize;id++){
         int index = (id+hash)%hashSize;
-        if (LDObjIDEqual(transTable[objHash[index]].oid, oid) &&
-            LDOMidEqual(transTable[objHash[index]].mid, mid))
+        if (LDObjIDEqual(objData[objHash[index]].objID(), oid) &&
+            LDOMidEqual(objData[objHash[index]].omID(), mid))
             return objHash[index];
     }
     //  CkPrintf("not found \n");
     return -1;
 }
 
+int CentralLB::LDStats::getHash(const LDObjKey &objKey)
+{
+  const LDObjid &oid = objKey.objID();
+  const LDOMid  &mid = objKey.omID();
+  return getHash(oid, mid);
+}
 
 void CentralLB::LDStats::pup(PUP::er &p)
 {
@@ -752,7 +733,6 @@ void CentralLB::LDStats::pup(PUP::er &p)
     commData = new LDCommData[n_comm];
     from_proc = new int[n_objs];
     to_proc = new int[n_objs];
-    transTable = NULL;
     objHash = NULL;
   }
   // ignore the background load when unpacking
@@ -772,7 +752,7 @@ void CentralLB::LDStats::pup(PUP::er &p)
 
 int CentralLB::LDStats::useMem() { 
   // calculate the memory usage of this LB (superclass).
-  return sizeof(LDStats) + sizeof(ProcStats)*count + 
+  return sizeof(CentralLB) + sizeof(LDStats) + sizeof(ProcStats)*count + 
         (sizeof(LDObjData) + 2*sizeof(int)) * n_objs +
         sizeof(LDCommData) * n_comm;
 }
index 44b9f8f35058191de21fa7894ceffb810d2bac2b..9fa49c8254a31420a592dac564b3eb9dfe0afa27 100644 (file)
@@ -64,11 +64,6 @@ public:
 
   void set_avail_vector(char *new_vector);
 
-   struct LDOId {
-     LDObjid oid;
-     LDOMid mid;
-   };
-
   struct ProcStats {  // per processor data
     double total_walltime;
     double total_cputime;
@@ -94,16 +89,15 @@ public:
     int n_comm;
     LDCommData* commData;
 
-    LDOId *transTable;
     int *objHash; 
     int  hashSize;
 
     LDStats(): n_objs(0), n_comm(0) { objData = NULL; commData = NULL; 
-               from_proc = NULL; to_proc = NULL;
-               transTable = NULL; objHash = NULL; }
+               from_proc = NULL; to_proc = NULL; objHash = NULL; }
       // build hash table
     void makeCommHash();
     void deleteCommHash();
+    int getHash(const LDObjKey &);
     int getHash(const LDObjid &oid, const LDOMid &mid);
     void assign(int oid, int pe) { to_proc[oid] = pe; }
     void clear() {
index 16b45675dc337d6d3bc2ef4bf5c9764158f7c4b4..3bf5d156a5410548ac4f9e4f3de25192b33d7c32 100644 (file)
@@ -51,13 +51,16 @@ CmiBool Comm1LB::QueryBalanceNow(int _step)
   return CmiTrue;
 }
 
-int Comm1LB::search(LDObjid oid, LDOMid mid){
-  int id,hash;
+int Comm1LB::search(const LDObjKey &objKey) {
+  const LDObjid &oid = objKey.objID();
+  const LDOMid &mid = objKey.omID();
+  int id, hash;
   
   hash = (oid.id[0] | oid.id[1]) % nobj;
 
   for(id=0;id<nobj;id++){
-    if((translate[htable[(id+hash)%nobj]].oid.id[0] == oid.id[0])&&(translate[htable[(id+hash)%nobj]].oid.id[1] == oid.id[1])&&(translate[htable[(id+hash)%nobj]].oid.id[2] == oid.id[2])&&(translate[htable[(id+hash)%nobj]].oid.id[3] == oid.id[3])&&(translate[htable[(id+hash)%nobj]].mid.id == mid.id))
+    if((translate[htable[(id+hash)%nobj]].objID() == oid)
+       &&(translate[htable[(id+hash)%nobj]].omID().id == mid.id))
       return htable[(id + hash)%nobj];
   }
   //  CkPrintf("not found \n");
@@ -147,7 +150,7 @@ void Comm1LB::make_hash(){
     htable[i] = -1;
   
   for(i=0;i<nobj;i++){
-    oid = translate[i].oid;
+    oid = translate[i].objID();
     hash = ((oid.id[0])|(oid.id[1])) % nobj;
     while(htable[hash] != -1)
       hash = (hash+1)%nobj;
@@ -221,16 +224,13 @@ LBMigrateMsg* Comm1LB::Strategy(CentralLB::LDStats* stats, int count)
 */
 
   npe = count;
-  translate = new obj_id[nobj];
+  translate = new LDObjKey[nobj];
   int objno=0;
 
   for(obj=0; obj < stats->n_objs; obj++){ 
       LDObjData &oData = stats->objData[obj];
-      translate[objno].mid.id = oData.omID().id;
-      translate[objno].oid.id[0] = oData.id().id[0];
-      translate[objno].oid.id[1] = oData.id().id[1];
-      translate[objno].oid.id[2] = oData.id().id[2];
-      translate[objno].oid.id[3] = oData.id().id[3];
+      translate[objno].omID() = oData.omID();
+      translate[objno].objID() = oData.objID();
       objno++;
   }
 
@@ -247,9 +247,9 @@ LBMigrateMsg* Comm1LB::Strategy(CentralLB::LDStats* stats, int count)
 
   for(com =0; com< stats->n_comm;com++) {
       LDCommData &commData = stats->commData[com];
-      if((!commData.from_proc())&&(!commData.to_proc())){
-       xcoord = search(commData.sender, commData.senderOM); 
-       ycoord = search(commData.receiver, commData.receiverOM);
+      if((!commData.from_proc())&&(commData.recv_type()==LD_OBJ_MSG)){
+       xcoord = search(commData.sender); 
+       ycoord = search(commData.receiver.get_destObj());
        if((xcoord == -1)||(ycoord == -1))
          if (lb_ignoreBgLoad) continue;
          else CkAbort("Error in search\n");
index def7ee8990c42882e544e99d8a4711618667fba2..138d5e2cb9eaad0f32b0bf27d5f262fda39b4e1d 100644 (file)
@@ -34,7 +34,7 @@ public:
   int nobj,npe;
   alloc_struct ** alloc_array;
   graph * object_graph;
-  obj_id * translate;
+  LDObjKey * translate;
   int * htable;
   Comm1LB();
   Comm1LB(CkMigrateMessage *m):CentralLB(m) {}
@@ -43,7 +43,7 @@ private:
   LBMigrateMsg* Strategy(CentralLB::LDStats* stats, int count);
   void alloc(int pe, int id, double load, int nmsg, int nbyte);
   double compute_cost(int id, int pe, int n_alloc, int &out_msg, int &out_byte); 
-  int search(LDObjid oid, LDOMid mid);
+  int search(const LDObjKey &key);
   void add_graph(int x, int y, int data, int nmsg);
   void make_hash();
 };
index c8e93e11a77efc077ad6a74adca6075c67364c77..7ef37244c00da2d41f1a8f403d6554ae321f2af4 100644 (file)
@@ -182,9 +182,10 @@ LBMigrateMsg* CommLB::Strategy(CentralLB::LDStats* _stats, int count)
 
     for(com =0; com< stats->n_comm;com++) {
         LDCommData &commData = stats->commData[com];
-        if((!commData.from_proc())&&(!commData.to_proc())){
-               xcoord = stats->getHash(commData.sender, commData.senderOM);
-               ycoord = stats->getHash(commData.receiver, commData.receiverOM);
+        if((!commData.from_proc())&&(commData.recv_type()==LD_OBJ_MSG))
+        {
+               xcoord = stats->getHash(commData.sender);
+               ycoord = stats->getHash(commData.receiver.get_destObj());
                if((xcoord == -1)||(ycoord == -1))
                    if (lb_ignoreBgLoad) continue;
                    else CkAbort("Error in search\n");
index 28378d32022089f89d304c10f189c1d179d0d6ef..f128c1645e936ee04f16e381e40efb46d6d87136 100644 (file)
 #include "CommLBHeap.h"
 #define CUT_OFF_FACTOR 1.200
 
-struct obj_id{
-  LDObjid oid;
-  LDOMid mid;
-};
-
 struct graph{
   int id;
   int data;
index d26bf04498872d7fc2270b49a8c4b86542783f27..0be6111f343e4568e108e7ab9da0fbc3eed14ade 100644 (file)
@@ -30,7 +30,7 @@
 //      && i1.id[3] == i2.id[3]);
 // };
 
-LBCommData* LBCommTable::HashInsert(const LBCommData data)
+LBCommData* LBCommTable::HashInsert(const LBCommData &data)
 {
   if (in_use > cur_sz/2)
     Resize();
@@ -53,7 +53,7 @@ LBCommData* LBCommTable::HashInsert(const LBCommData data)
   return 0;
 }
 
-LBCommData* LBCommTable::HashSearch(const LBCommData data)
+LBCommData* LBCommTable::HashSearch(const LBCommData &data)
 {
   int i=0;
   int j;
@@ -67,7 +67,7 @@ LBCommData* LBCommTable::HashSearch(const LBCommData data)
   return 0;
 }
 
-LBCommData* LBCommTable::HashInsertUnique(const LBCommData data)
+LBCommData* LBCommTable::HashInsertUnique(const LBCommData &data)
 {
   LBCommData* item = HashSearch(data);
   if (!item) {
@@ -101,10 +101,7 @@ CmiBool LBCommData::equal(const LBCommData d2) const
        || !LDObjIDEqual(srcObj.objID(),d2.srcObj.objID()) )
       return CmiFalse;
   }
-  if (!LDOMidEqual(destOM,d2.destOM)
-      || !LDObjIDEqual(destObj,d2.destObj))
-    return CmiFalse;
-  else return CmiTrue;
+  return (CmiBool)(destObj == d2.destObj);
 }
 
 int LBCommData::compute_key()
@@ -122,10 +119,31 @@ int LBCommData::compute_key()
                     srcObj.id.id[2],srcObj.id.id[3]);
     kptr += pcount;
   }
-  pcount += sprintf(kptr,"%d%d%d%d%dXXXXXXXX",destOM.id.idx,
-                   destObj.id[0],destObj.id[1],
-                   destObj.id[2],destObj.id[3]);
-  pcount -= 8;  /* The 'X's insure that the next few bytes are fixed */
+
+  CmiAssert(destObj.get_type() == LD_OBJ_MSG);
+  switch (destObj.get_type()) {
+  case LD_PROC_MSG:
+       pcount += sprintf(kptr,"%d", destObj.proc());
+       break;
+  case LD_OBJ_MSG: {
+       LDObjKey &destKey = destObj.get_destObj();
+       pcount += sprintf(kptr,"%d%d%d%d%dXXXXXXXX",destKey.omID().id.idx,
+                   destKey.objID().id[0],destKey.objID().id[1],
+                   destKey.objID().id[2],destKey.objID().id[3]);
+       pcount -= 8;  /* The 'X's insure that the next few bytes are fixed */
+       break;
+       }
+  case LD_OBJLIST_MSG: {
+       int len;
+       LDObjKey *destKeys = destObj.get_destObjs(len);
+       CmiAssert(len>0);
+       pcount += sprintf(kptr,"%d%d%d%d%dXXXXXXXX",destKeys[0].omID().id.idx,
+                   destKeys[0].objID().id[0],destKeys[0].objID().id[1],
+                   destKeys[0].objID().id[2],destKeys[0].objID().id[3]);
+       pcount -= 8;  /* The 'X's insure that the next few bytes are fixed */
+       break;
+       }
+  }
 
   int k=-1;
   for(int i=0; i < (pcount+3)/4; i++)
@@ -163,11 +181,10 @@ void LBCommTable::GetCommData(LDCommData* data)
        out->src_proc = curtable->src_proc;
       } else {
        out->src_proc = -1;
-       out->senderOM = curtable->srcObj.omID();
-       out->sender = curtable->srcObj.objID();
+        out->sender.omID() = curtable->srcObj.omID();
+        out->sender.objID() = curtable->srcObj.objID();
       }
-      out->dest_proc = -1;
-      out->receiverOM = curtable->destOM;
+      CmiAssert(curtable->destObj.get_type() == LD_OBJ_MSG);
       out->receiver = curtable->destObj;
       out->messages = curtable->n_messages;
       out->bytes = curtable->n_bytes;
index 4d359ebad7a9f746d5e913e6de9d1778d88ca348..0a8f1581add8fddc9a31af0ce06f8d91f375238f 100644 (file)
@@ -16,6 +16,7 @@
 #include "converse.h"
 #include "lbdb.h"
 
+// point to point communication data
 class LBCommData {
 
 friend class LBCommTable;
@@ -23,8 +24,7 @@ friend class LBCommTable;
 public:
   LBCommData(int _src_proc, LDOMid _destOM, LDObjid _destObj) {
     src_proc = _src_proc;
-    destOM = _destOM;
-    destObj = _destObj;
+    destObj.init_objmsg(_destOM, _destObj);
     n_messages = 0;
     n_bytes = 0;
     mykey = compute_key();
@@ -32,13 +32,8 @@ public:
 
   LBCommData(LDObjHandle _srcObj, LDOMid _destOM, LDObjid _destObj) {
     src_proc = -1;
-/*
-    srcObj = _srcObj.id;
-    srcOM = _srcObj.omhandle.id;
-*/
     srcObj = _srcObj;
-    destOM = _destOM;
-    destObj = _destObj;
+    destObj.init_objmsg(_destOM, _destObj);
     n_messages = 0;
     n_bytes = 0;
     mykey = compute_key();
@@ -50,7 +45,6 @@ public:
       srcObj = d.srcObj;
 //      srcOM = d.srcOM;
     }
-    destOM = d.destOM;
     destObj = d.destObj;
     n_messages = d.n_messages;
     n_bytes = d.n_messages;
@@ -65,7 +59,6 @@ public:
       srcObj = d.srcObj;
 //      srcOM = d.srcOM;
     }
-    destOM = d.destOM;
     destObj = d.destObj;
     n_messages = d.n_messages;
     n_bytes = d.n_messages;
@@ -91,10 +84,7 @@ private:
   int mykey;
   int src_proc;
   LDObjHandle srcObj;
-//  LDOMid srcOM;
-//  LDObjid srcObj;
-  LDOMid destOM;
-  LDObjid destObj;
+  LDCommDesc   destObj;
   int n_messages;
   int n_bytes;
 };
@@ -111,9 +101,9 @@ public:
     delete [] state;
   };
 
-  LBCommData* HashInsert(const LBCommData data);
-  LBCommData* HashInsertUnique(const LBCommData data);
-  LBCommData* HashSearch(const LBCommData data);
+  LBCommData* HashInsert(const LBCommData &data);
+  LBCommData* HashInsertUnique(const LBCommData &data);
+  LBCommData* HashSearch(const LBCommData &data);
   int CommCount() { return in_use; };
   void GetCommData(LDCommData* data);
        
index 5060d6124eb74a32259edfc6cabaa654eb50f186..64672df3d90f78fb97f9f0b06e4c995aaa3aab6f 100644 (file)
@@ -165,12 +165,12 @@ LBMigrateMsg* MetisLB::Strategy(CentralLB::LDStats* stats, int count)
   const int csz = stats->n_comm;
   for(i=0; i<csz; i++) {
       LDCommData &cdata = stats->commData[i];
-      if(cdata.from_proc() || cdata.to_proc())
+      if(cdata.from_proc() || cdata.receiver.get_type() != LD_OBJ_MSG)
         continue;
       // FIXME!
       // senderID and recverID is not correct !!!
-      int senderID = cdata.sender.id[0];
-      int recverID = cdata.receiver.id[0];
+      int senderID = cdata.sender.objID().id[0];
+      int recverID = cdata.receiver.get_destObj().objID().id[0];
       CmiAssert(senderID < numobjs);
       CmiAssert(recverID < numobjs);
       comm[senderID][recverID] += cdata.messages;
index 43e19c6ab27b2f6e1497e355c3c39aedf63527db..62c1af5fcae1289fce05de68451f8c6879f075f2 100644 (file)
@@ -37,7 +37,7 @@ ObjGraph::ObjGraph(int count, CentralLB::LDStats* _stats)
       const LDCommData newedgedata = stats->commData[index];
 
       // If this isn't an object-to-object message, ignore it
-      if (!newedgedata.from_proc() && !newedgedata.to_proc())
+      if (!newedgedata.from_proc() && newedgedata.recv_type() == LD_OBJ_MSG)
        n_edges++;
     }
   nodelist = new Node[n_objs];
@@ -61,7 +61,7 @@ ObjGraph::ObjGraph(int count, CentralLB::LDStats* _stats)
       thisnode->inEdge = 0;
       cur_node++;
       const int hashval = calc_hashval(odata.omID(),
-                                      odata.id());
+                                      odata.objID());
       thisnode->nxt_hash = node_table[hashval];
       node_table[hashval] = thisnode;
   }
@@ -71,7 +71,7 @@ ObjGraph::ObjGraph(int count, CentralLB::LDStats* _stats)
       LDCommData &newedgedata = stats->commData[index];
 
       // If this isn't an object-to-object message, ignore it
-      if (newedgedata.from_proc() || newedgedata.to_proc())
+      if (newedgedata.from_proc() || newedgedata.recv_type()!=LD_OBJ_MSG)
        continue;
 
       if(cur_edge >= n_edges)
@@ -98,14 +98,14 @@ ObjGraph::ObjGraph(int count, CentralLB::LDStats* _stats)
     int index = newedge->index;
     const LDCommData newedgedata = stats->commData[index];
 
-    Node* from_node = find_node(newedgedata.senderOM,newedgedata.sender);
+    Node* from_node = find_node(newedgedata.sender);
     if (from_node == 0) {
       if (!lb_ignoreBgLoad) 
        CkPrintf("ObjGraph::find_node: Didn't locate from node match!\n");
       continue;
     }
 
-    Node* to_node = find_node(newedgedata.receiverOM,newedgedata.receiver);
+    Node* to_node = find_node(newedgedata.receiver.get_destObj());
     if (to_node == 0) {
       if (!lb_ignoreBgLoad) 
         CkPrintf("ObjGraph::find_node: Didn't locate to node match!\n");
@@ -144,8 +144,10 @@ int ObjGraph::calc_hashval(LDOMid omid, LDObjid id)
   return hashval;
 }
 
-ObjGraph::Node* ObjGraph::find_node(LDOMid edge_omid, LDObjid edge_id)
+ObjGraph::Node* ObjGraph::find_node(const LDObjKey &edge_key)
 {
+  const LDOMid &edge_omid = edge_key.omID();
+  const LDObjid &edge_id = edge_key.objID();
   const int from_hashval = calc_hashval(edge_omid,edge_id);
   //  CkPrintf("From = %d\n",from_hashval);
   Node* from_node = node_table[from_hashval];
@@ -154,7 +156,7 @@ ObjGraph::Node* ObjGraph::find_node(LDOMid edge_omid, LDObjid edge_id)
     const LDOMid omid =
       stats->objData[from_node->index].omID();
     const LDObjid objid =
-      stats->objData[from_node->index].id();
+      stats->objData[from_node->index].objID();
     //    CkPrintf("Comparing %d to %d\n",objid.id[0],edge_id.id[0]);
     if (LDOMidEqual(omid,edge_omid) && LDObjIDEqual(objid,edge_id) )
       break;
index a7f3fe63ec56d41d0de2cbcafd1cab754097cfe4..37f7d48819063c95eb104afaf61f75e7c15dbb3d 100644 (file)
@@ -70,7 +70,7 @@ private:
   enum { hash_max = 256 };
 
   int calc_hashval(LDOMid, LDObjid);
-  Node* find_node(LDOMid, LDObjid);
+  Node* find_node(const LDObjKey &);
 
   Edge* edgelist;
   Node* node_table[hash_max];
index d7581d2f0989152427a50facace0084b1aa0e520..e47c7c6048d826338016c7ce663c9c36df3423e4 100644 (file)
@@ -282,9 +282,9 @@ LBMigrateMsg* OrbLB::Strategy(CentralLB::LDStats* stats, int count)
   for (i=0; i<nObjs; i++) {
     LDObjData &odata = stats->objData[i];
     computeLoad[objIdx].id = objIdx;
-    computeLoad[objIdx].v[XDIR] = odata.id().id[0];
-    computeLoad[objIdx].v[YDIR] = odata.id().id[1];
-    computeLoad[objIdx].v[ZDIR] = odata.id().id[2];
+    computeLoad[objIdx].v[XDIR] = odata.objID().id[0];
+    computeLoad[objIdx].v[YDIR] = odata.objID().id[1];
+    computeLoad[objIdx].v[ZDIR] = odata.objID().id[2];
     computeLoad[objIdx].load = odata.wallTime;
     computeLoad[objIdx].refno = 0;
     computeLoad[objIdx].partition = NULL;
index 18a926098749ef543c69db896b2229b7411e0ef1..d4e837359c34743bd61781eec4f1985633b68296 100644 (file)
 */
 /*@{*/
 
+/**
+  FIXME:  need to remove outlier object load. Outlier object can cause
+  failure of partitioning and often causes: "too few objects to paritition"
+  error.
+*/
+
 #include <charm++.h>
 
 #if CMK_LBDB_ON
@@ -71,14 +77,13 @@ LBMigrateMsg* RecBisectBfLB::Strategy(CentralLB::LDStats* stats,
   int i;
   PartitionList *partitions;
 
-  
   CkPrintf("[%d] RecBisectBfLB strategy\n",CkMyPe());
   ObjGraph og(numPartitions, stats);
 
   Graph *g =  convertGraph( &og);
   CkPrintf("[%d] RecBisectBfLB: graph converted\n",CkMyPe());
     
-  //  printGraph(g);
+  //  g_printGraph(g);
   int* nodes = (int *) malloc(sizeof(int)*g->V);
 
   for (i=0; i<g->V; i++) 
@@ -194,7 +199,13 @@ void RecBisectBfLB::partitionInTwo(Graph *g, int nodes[], int numNodes,
   IntQueue * q1, *q2;
   int * p1, *p2;
 
-  if (numNodes <2) CkPrintf("error: too few objects to paritition\n");
+  /*
+  CkPrintf("partitionInTwo:\n");
+  for (i=0; i<numNodes; i++) 
+    CkPrintf("%d: %f\n", i, graph_weightof(g, nodes[i])); 
+  */
+
+  if (numNodes <2) CkAbort("error: too few objects to paritition\n");
   r1 = nodes[0];
 /*  r2 = nodes[numNodes-1];*/
   r2 = nodes[1]; 
index 63fff74a10ce0c2437e80be859115985f89c56f4..7204a540064be8a38ceebca14d677e3f8ab37906 100644 (file)
@@ -56,7 +56,7 @@ void Refiner::create(int count, CentralLB::LDStats* stats, int* procs)
   LDObjData *odata = stats->objData;
   for (i=0; i<stats->n_objs; i++)
   {
-        computes[index].id = odata[i].id();
+        computes[index].id = odata[i].objID();
         computes[index].handle = odata[i].handle;
         computes[index].load = odata[i].cpuTime;
         computes[index].originalPE = stats->from_proc[i];
index 27c88124a9e8bd9bbb17275c2a95446721b8f874..589346ca150164891f380edff9ab8b47bb14e271 100644 (file)
@@ -66,7 +66,7 @@ void g_nextVertex(Graph *g, int v, float weight)
   g->vertices[current].weight = weight;
   g->vertices[current].firstEdge = g->currentEdge;
   g->vertices[current].numEdges = 0;
-/*  printf("next vertex is: %d \n", current);*/
+/*  printf("next vertex is: %d weight:%f\n", current, weight); */
 
 }
 
index 2221e8bf4d567db8d1564e1ee74f8ddab821ee69..77ac86d8efd8b5ac223d69e42248307e1f726df5 100644 (file)
@@ -34,8 +34,13 @@ typedef struct {
 typedef int LDHandle;
 #endif
 
-typedef struct {
+typedef struct _LDOMid {
   CkGroupID id;
+#ifdef __cplusplus
+  CmiBool operator==(const struct _LDOMid& omId) const {
+    return (CmiBool)(id == omId.id);
+  }
+#endif
 } LDOMid;
 
 typedef struct {
@@ -55,6 +60,22 @@ typedef struct _LDObjid {
 #endif
 } LDObjid;
 
+/* LDObjKey uniquely identify one object */
+typedef struct _LDObjKey {
+  LDOMid omId;
+  LDObjid objId;
+public:
+#ifdef __cplusplus
+  CmiBool operator==(const _LDObjKey& obj) const {
+    return omId == obj.omId && objId == obj.objId;
+  }
+  inline LDOMid &omID() { return omId; }
+  inline LDObjid &objID() { return objId; }
+  inline const LDOMid &omID() const { return omId; }
+  inline const LDObjid &objID() const { return objId; }
+#endif
+} LDObjKey;
+
 typedef int LDObjIndex;
 typedef int LDOMIndex;
 
@@ -76,7 +97,7 @@ typedef struct {
 #ifdef __cplusplus
   inline const LDOMHandle &omHandle() const { return handle.omhandle; }
   inline const LDOMid &omID() const { return handle.omhandle.id; }
-  inline const LDObjid &id() const { return handle.id; }
+  inline const LDObjid &objID() const { return handle.id; }
 #endif
 } LDObjData;
 
@@ -88,18 +109,58 @@ typedef struct {
   int to_proc;
 } LDObjStats;
 
+#define LD_PROC_MSG      1
+#define LD_OBJ_MSG       2
+#define LD_OBJLIST_MSG   3
+
+typedef struct _LDCommDesc {
+  char type;
+  union {
+    int destProc;              /* 1:   processor level message */
+    LDObjKey  destObj;         /* 2:   object based message    */
+    struct {
+      LDObjKey  *objs;
+      int len;
+    } destObjs;                        /* 3:   one to many message     */
+  } dest;
+#ifdef __cplusplus
+  char &get_type() { return type; }
+  char const get_type() const { return type; }
+  int proc() const { return type==1?dest.destProc:-1; }
+  LDObjKey &get_destObj() 
+       { CmiAssert(type==LD_OBJ_MSG); return dest.destObj; }
+  LDObjKey const &get_destObj() const 
+       { CmiAssert(type==LD_OBJ_MSG); return dest.destObj; }
+  LDObjKey * get_destObjs(int &len) 
+       { CmiAssert(type==LD_OBJLIST_MSG); len=dest.destObjs.len; return dest.destObjs.objs; }
+  void init_objmsg(LDOMid &omid, LDObjid &objid) { 
+       type=LD_OBJ_MSG; 
+       dest.destObj.omID()=omid;
+       dest.destObj.objID()=objid;
+  }
+  inline CmiBool operator==(const _LDCommDesc &obj) const {
+    if (type != obj.type) return CmiFalse;
+    switch (type) {
+    case LD_PROC_MSG: return dest.destProc == obj.dest.destProc;
+    case LD_OBJ_MSG:  return dest.destObj == obj.dest.destObj;
+    case LD_OBJLIST_MSG: return 0;             // fixme
+    }
+    return 0;
+  }
+  inline void pup(PUP::er &p);
+#endif
+} LDCommDesc;
+
 typedef struct {
   int src_proc;
-  LDOMid senderOM;
-  LDObjid sender;
-  int dest_proc;
-  LDOMid receiverOM;
-  LDObjid receiver;
+  LDObjKey  sender;
+  LDCommDesc   receiver;
   int messages;
   int bytes;
 #ifdef __cplusplus
   inline int from_proc() const { return (src_proc != -1); }
-  inline int to_proc() const { return (dest_proc != -1); }
+  inline int recv_type() const { return receiver.get_type(); }
+  inline void pup(PUP::er &p);
 #endif
 } LDCommData;
 
@@ -231,9 +292,28 @@ int LDMemusage(LDHandle _db);
 
 #ifdef __cplusplus
 /* put outside of __cplusplus */
+PUPbytes(LDOMid)
+PUPbytes(LDObjid)
+PUPbytes(LDObjKey)
 PUPbytes(LDObjData)
 PUPbytes(LDObjStats)
-PUPbytes(LDCommData)
+inline void LDCommDesc::pup(PUP::er &p) {
+  p|type;
+  switch (type) {
+  case 1:  p|dest.destProc; break;
+  case 2:  p|dest.destObj; break;
+  case 3:  break;              // fixme
+  }
+}
+PUPmarshall(LDCommDesc)
+inline void LDCommData::pup(PUP::er &p) {
+    p|src_proc;
+    p|sender;
+    p|receiver;
+    p|messages;
+    p|bytes;
+}
+PUPmarshall(LDCommData)
 #endif
 
 #endif /* LBDBH_H */