Add support for Charm++'s change to use 64 bit ID for load balancing 45/4245/9
authorRonak Buch <rabuch2@illinois.edu>
Wed, 6 Jun 2018 23:19:18 +0000 (18:19 -0500)
committerDavid Hardy <dhardy@ks.uiuc.edu>
Mon, 18 Jun 2018 21:08:11 +0000 (16:08 -0500)
Based on the value of the CMK_LBID_64BIT compile-time variable,
select either the new 64 bit ID or old 4 int LDObjid to use as
the ID for load balancing, and provide accessor to abstract
access to both types.

This is necessary to support the new 64 bit LB ID interface in Charm++
6.9.0. Once NAMD no longer cares about supporting versions of Charm++
older than 6.9.0, this can be removed and the new interface can be used
unconditionally.

Change-Id: Ice18a9537b694e8e6174cd8118cbc60d59800fe9

src/Compute.C
src/LdbCoordinator.C
src/LdbCoordinator.h
src/NamdCentLB.C
src/NamdHybridLB.C
src/NamdNborLB.C

index 786743f..6826410 100644 (file)
@@ -24,6 +24,8 @@
 #include "Compute.h"
 #include "Priorities.h"
 
+#include "LdbCoordinator.h"
+
 #define MIN_DEBUG_LEVEL 4
 // #define DEBUGM
 #include "Debug.h"
@@ -35,7 +37,7 @@ Compute::Compute(ComputeID c) : gbisPhase(1),basePriority(0), cid(c),
   gbisPhasePriority[2] = 0;
   doAtomUpdate = false;
   computeType = ComputeMap::Object()->type(c);
-  ldObjHandle.id.id[0] = -1;
+  LdbIdField(ldObjHandle.id, 0) = 0;
 }
 
 Compute::~Compute() {
index bae7c8c..874dde7 100644 (file)
@@ -346,9 +346,10 @@ void LdbCoordinator::initialize(PatchMap *pMap, ComputeMap *cMap, int reinit)
     int i;
     for(i=0;i<nPatches;i++)
       if (patchMap->node(i) == Node::Object()->myid()) {
-       LDObjid elemID;
-       elemID.id[0] = i;
-       elemID.id[1] = -2;
+
+       LdbId elemID;
+       LdbIdField(elemID, 0) = i;
+       LdbIdField(elemID, 1) = PATCH_TYPE;
 
        if (patch_count >= nLocalPatches) {
     NAMD_bug("LdbCoordinator found too many local patches!");
@@ -401,12 +402,12 @@ void LdbCoordinator::initialize(PatchMap *pMap, ComputeMap *cMap, int reinit)
                )  {
          // Register the object with the load balancer
          // Store the depended patch IDs in the rest of the element ID
-         LDObjid elemID;
-         elemID.id[0] = i;
+         LdbId elemID;
+         LdbIdField(elemID, 0) = i;
 
          if (computeMap->numPids(i) > 0)
-           elemID.id[1] =  computeMap->pid(i,0);
-         else elemID.id[1] = -1;
+           LdbIdField(elemID, 1) =  computeMap->pid(i,0);
+         else LdbIdField(elemID, 1) = NONBONDED_OR_SELF_TYPE;
 
           Compute *c = computeMap->compute(i);
           if ( ! c ) NAMD_bug("LdbCoordinator::initialize() null compute pointer");
@@ -437,10 +438,10 @@ void LdbCoordinator::initialize(PatchMap *pMap, ComputeMap *cMap, int reinit)
                ) {
          // Register the object with the load balancer
          // Store the depended patch IDs in the rest of the element ID
-         LDObjid elemID;
-         elemID.id[0] = i;
+         LdbId elemID;
+         LdbIdField(elemID, 0) = i;
        
-         elemID.id[1] = -3;
+         LdbIdField(elemID, 1) = BONDED_TYPE;
 
           Compute *c = computeMap->compute(i);
           if ( ! c ) NAMD_bug("LdbCoordinator::initialize() null compute pointer");
@@ -457,7 +458,7 @@ void LdbCoordinator::initialize(PatchMap *pMap, ComputeMap *cMap, int reinit)
   while ( migrateMsgs ) {
     LdbMigrateMsg *m = migrateMsgs;
     migrateMsgs = m->next;
-    Compute *c = computeMap->compute(m->handle.id.id[0]);
+    Compute *c = computeMap->compute(LdbIdField(m->handle.id, 0));
     if ( ! c ) NAMD_bug("LdbCoordinator::initialize() null compute pointer 2");
     c->ldObjHandle = m->handle;
     delete m;
index e25bed3..7ecddff 100644 (file)
 #include "BOCgroup.h"
 #include "LdbCoordinator.decl.h"
 
+/// In the new 64-bit id case defining LdbId as CmiUInt8,
+/// the first 32 bits store the object's index and
+/// the second 32 bits store the type.
+///
+/// In the old int[4] id case defining LdbId as LDObjid,
+/// element 0 stores the object's index, element 1 stores the type,
+/// and elements 2 and 3 are unused.
+#if CMK_LBID_64BIT
+typedef CmiUInt8 LdbId;
+#else
+typedef LDObjid LdbId;
+#endif
+
+inline const int& LdbIdField(const LdbId& id, const int index) {
+#if CMK_LBID_64BIT
+  return *(((int*)&id) + index);
+#else
+  return id.id[index];
+#endif
+}
+
+inline int& LdbIdField(LdbId& id, const int index) {
+#if CMK_LBID_64BIT
+  return *(((int*)&id) + index);
+#else
+  return id.id[index];
+#endif
+}
+
+/// Define the types encoded into the load balancing id.
+/// Use negative numbers because the nonbonded/self types
+/// are represented with the leading patch ID for that compute,
+/// when available.
+enum {
+  NONBONDED_OR_SELF_TYPE = -1,  ///< represents nonbonded or self compute
+  PATCH_TYPE = -2,              ///< represents a patch
+  BONDED_TYPE = -3              ///< represents bonded compute
+};
+
 class PatchMap;
 class ComputeMap;
 class Controller;
index 6339df1..29cb65c 100644 (file)
@@ -141,7 +141,7 @@ CLBMigrateMsg* NamdCentLB::Strategy(LDStats* stats)
 
    averageLoad = total/numPesAvailable;
    CkPrintf("LDB: Largest compute %d load %f is %.1f%% of average load %f\n",
-            computeArray[maxi].handle.id.id[0],
+            LdbIdField(computeArray[maxi].handle.id, 0),
             maxCompute, 100. * maxCompute / averageLoad, averageLoad);
    CkPrintf("LDB: Average compute %f is %.1f%% of average load %f\n",
             avgCompute, 100. * avgCompute / averageLoad, averageLoad);
@@ -168,7 +168,7 @@ CLBMigrateMsg* NamdCentLB::Strategy(LDStats* stats)
     double maxUnsplit = 0.;
     for (int i=0; i<nMoveableComputes; i++) {
       computeArray[i].processor = computeArray[i].oldProcessor;
-      const int cid = computeArray[i].handle.id.id[0];
+      const int cid = LdbIdField(computeArray[i].handle.id, 0);
       const double load = computeArray[i].load;
       if ( computeMap->numPartitions(cid) == 0 ) {
         if ( load > maxUnsplit ) maxUnsplit = load;
@@ -274,7 +274,7 @@ CLBMigrateMsg* NamdCentLB::Strategy(LDStats* stats)
       migrateInfo.insertAtEnd(migrateMe);
 
       // sneak in updates to ComputeMap
-      computeMap->setNewNode(computeArray[i].handle.id.id[0],
+      computeMap->setNewNode(LdbIdField(computeArray[i].handle.id, 0),
                                computeArray[i].processor);
     }
   }
@@ -605,8 +605,8 @@ int NamdCentLB::buildData(LDStats* stats)
         continue;
       }
 
-      if (this_obj.id().id[1] == -2) { // Its a patch
-       const int pid = this_obj.id().id[0];
+      if (LdbIdField(this_obj.id(), 1) == PATCH_TYPE) { // Its a patch
+       const int pid = LdbIdField(this_obj.id(), 0);
        int neighborNodes[PatchMap::MaxOneAway + PatchMap::MaxTwoAway];
 
        patchArray[pid].Id = pid;
@@ -626,13 +626,13 @@ int NamdCentLB::buildData(LDStats* stats)
          patchArray[pid].proxiesOn.unchecked_insert(&processorArray[neighborNodes[k]]);
        }
        processorArray[stats->from_proc[j]].backgroundLoad += this_obj.wallTime;
-      } else if (this_obj.id().id[1] == -3) { // Its a bonded compute
+      } else if (LdbIdField(this_obj.id(), 1) == BONDED_TYPE) { // Its a bonded compute
        processorArray[stats->from_proc[j]].backgroundLoad += this_obj.wallTime;
       } else if (this_obj.migratable) { // Its a compute
        if ( this_obj.wallTime == 0. ) { // don't migrate idle computes
          ++nIdleComputes;
        } else {
-       const int cid = this_obj.id().id[0];
+       const int cid = LdbIdField(this_obj.id(), 0);
        const int p0 = computeMap->pid(cid,0);
 
        // For self-interactions, just return the same pid twice
index 16cf5d4..76c75e8 100644 (file)
@@ -188,7 +188,7 @@ void NamdHybridLB::UpdateLocalLBInfo(LocalLBInfoMsg *msg){
        // traversing the set of moves in msg
        for(i=0; i<msg->n_moves; i++){
            if (msg->moves[i].to_pe != -1)
-               computeMap->setNewNode(msg->moves[i].obj.id.id[0],msg->moves[i].to_pe); 
+               computeMap->setNewNode(LdbIdField(msg->moves[i].obj.id, 0),msg->moves[i].to_pe);
        }
 
        // CODING
@@ -350,7 +350,7 @@ CLBMigrateMsg* NamdHybridLB::GrpLevelStrategy(LDStats* stats) {
       if ( load > maxCompute ) { maxCompute = load;  maxi = i; }
    }
    avgCompute = total / nMoveableComputes;
-   maxComputeId = computeArray[maxi].handle.id.id[0];
+   maxComputeId = LdbIdField(computeArray[maxi].handle.id, 0);
 
     int P = stats->nprocs();
    numPesAvailable = 0;
@@ -371,7 +371,7 @@ CLBMigrateMsg* NamdHybridLB::GrpLevelStrategy(LDStats* stats) {
 
   if ( step() == 1 ) {
     for (int i=0; i<nMoveableComputes; i++) {
-      const int cid = computeArray[i].handle.id.id[0];
+      const int cid = LdbIdField(computeArray[i].handle.id, 0);
       if ( computeMap->numPartitions(cid) == 0 ) {
         const double load = computeArray[i].load;
         if ( load > maxUnsplit ) maxUnsplit = load;
@@ -396,7 +396,7 @@ CLBMigrateMsg* NamdHybridLB::GrpLevelStrategy(LDStats* stats) {
       i_split = 0;
       for (int i=0; i<nMoveableComputes; i++) {
         computeArray[i].processor = computeArray[i].oldProcessor;
-        const int cid = computeArray[i].handle.id.id[0];
+        const int cid = LdbIdField(computeArray[i].handle.id, 0);
         if ( computeMap->numPartitions(cid) == 0 ) {
           continue;
         }
@@ -513,7 +513,7 @@ CLBMigrateMsg* NamdHybridLB::GrpLevelStrategy(LDStats* stats) {
 
       // sneak in updates to ComputeMap
       //ERASE CkPrintf("%d setting %d to processor %d\n",CkMyPe(),computeArray[i].handle.id.id[0],computeArray[i].processor);
-      computeMap->setNewNode(computeArray[i].handle.id.id[0],
+      computeMap->setNewNode(LdbIdField(computeArray[i].handle.id, 0),
                                computeArray[i].processor);
     }
   }
@@ -750,14 +750,14 @@ int NamdHybridLB::buildData(LDStats* stats) {
                continue;
        }
 
-       if (this_obj.id().id[1] == -2) { // Its a patch
+       if (LdbIdField(this_obj.id(), 1) == PATCH_TYPE) { // Its a patch
                // handled above to get required proxies from all patches
                processorArray[frompe].backgroundLoad += this_obj.wallTime;
-       } else if (this_obj.id().id[1] == -3) { // Its a bonded compute
+       } else if (LdbIdField(this_obj.id(), 1) == BONDED_TYPE) { // Its a bonded compute
                processorArray[frompe].backgroundLoad += this_obj.wallTime;
        } else if (this_obj.migratable && this_obj.wallTime != 0.) { // Its a compute
 
-               const int cid = this_obj.id().id[0];
+               const int cid = LdbIdField(this_obj.id(), 0);
                const int p0 = computeMap->pid(cid,0);
 
                // For self-interactions, just return the same pid twice
index a50f94d..36935d3 100644 (file)
@@ -156,7 +156,7 @@ NLBMigrateMsg* NamdNborLB::Strategy(NborBaseLB::LDStats* stats, int count)
     for (j=0; j < thisLDStats.n_objs; j++) {
       const LDObjData &this_obj = thisLDStats.objData[j];
       if (this_obj.omID().id.idx != 1) continue;
-      if (this_obj.id().id[1] == -2) continue;
+      if (LdbIdField(this_obj.id(), 1) == PATCH_TYPE) continue;
       if (this_obj.migratable)  nMoveableComputes++;
     }
   }
@@ -270,7 +270,7 @@ int NamdNborLB::buildData(NborBaseLB::LDStats* stats, int count)
       const LDObjData &this_obj = thisLDStats.objData[j];
       // filter out non-NAMD managed objects (like PME array)
       if (this_obj.omID().id.idx != 1) continue;
-      if (this_obj.id().id[1] == -2) { // Its a patch
+      if (LdbIdField(this_obj.id(), 1) == PATCH_TYPE) { // Its a patch
 /*
        const int pid = this_obj.id.id[0];
        int neighborNodes[PatchMap::MaxOneAway + PatchMap::MaxTwoAway];
@@ -287,7 +287,7 @@ int NamdNborLB::buildData(NborBaseLB::LDStats* stats, int count)
        }
 */
       } else if (this_obj.migratable) { // Its a compute
-       const int cid = this_obj.id().id[0];
+       const int cid = LdbIdField(this_obj.id(), 0);
        const int p0 = computeMap->pid(cid,0);
 
        // For self-interactions, just return the same pid twice