added support for avail_vector, so it can be used with FT.
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 26 Mar 2010 05:11:36 +0000 (00:11 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 26 Mar 2010 05:11:36 +0000 (00:11 -0500)
Won't assign work to the failed processors.

src/ck-ldb/OrbLB.C

index c247c6d750e35fec52d2bdb8436b820c0740d692..6537de09c617b2bc796e6219be5c0341b81a857d 100644 (file)
@@ -1,9 +1,3 @@
-/*****************************************************************************
- * $Source$
- * $Author$
- * $Date$
- * $Revision$
- *****************************************************************************/
 
 /**
  * \addtogroup CkLdb
@@ -11,7 +5,10 @@
    objects and map to processors. In OrbLB, objects are treated to be enclosed 
    by a rectangular box using their LDObjid as coordinates.
 
+   Written by Gengbin Zheng
+
    ORB now takes background load into account
+   3/26/2010:        added support for avail_vector
 */
 /*@{*/
 
@@ -233,7 +230,11 @@ void OrbLB::mapPartitionsToNodes()
     for (i=0; i<npartition; i++) partitions[i].node = partitions[i].bkpes[0];
   }
   else {
-    for (i=0; i<P; i++) partitions[i].node = i;
+    int n = 0;
+    for (i=0; i<P; i++) { 
+      if (!statsData->procs[i].available) continue;
+      partitions[n++].node = i;
+    }
   }
 #else
   PatchMap *patchMap = PatchMap::Object();
@@ -355,7 +356,9 @@ void OrbLB::work(BaseLB::LDStats* stats, int count)
   CmiPrintf("qsort time: %f\n", CkWallTimer() - t);
 #endif
 
-  npartition = P;
+  npartition = 0;
+  for (i=0; i<P; i++)
+    if (stats->procs[i].available == CmiTrue) npartition++;
   partitions = new Partition[npartition];
 
   double totalLoad = 0.0;
@@ -389,11 +392,13 @@ void OrbLB::work(BaseLB::LDStats* stats, int count)
     top_partition.bkpes.resize(0);
     double total = totalLoad;
     for (i=0; i<P; i++) {
+      if (!stats->procs[i].available) continue;
       double bkload = stats->procs[i].bg_walltime;
       total += bkload;
     }
-    double averageLoad = total / P;
+    double averageLoad = total / npartition;
     for (i=0; i<P; i++) {
+      if (!stats->procs[i].available) continue;
       double bkload = stats->procs[i].bg_walltime;
       if (bkload < averageLoad) top_partition.bkpes.push_back(i);
       else CkPrintf("OrbLB Info> PE %d with %f background load will have 0 object.\n", i, bkload);