More changes to topomanager for cray, also adding +printTopo to print topo
authorNikhil Jain <nikhil@illinois.edu>
Thu, 29 Mar 2012 20:18:54 +0000 (15:18 -0500)
committerNikhil Jain <nikhil@illinois.edu>
Thu, 29 Mar 2012 20:18:54 +0000 (15:18 -0500)
information

src/ck-core/ck.h
src/ck-core/init.C
src/util/CrayNid.c
src/util/TopoManager.C
src/util/TopoManager.h
src/util/XT3Torus.h
src/util/XTTorus.h

index bebbc898c1426b307ffbdba22418ab8e1a3ce07f..39eb213241badb49ba5d5a53ff145d14eaa1b35e 100644 (file)
@@ -11,6 +11,7 @@
 #include "stats.h"
 #include "ckfutures.h"
 #include "charisma.h"
+#include "TopoManager.h"
 
 #if CMK_ERROR_CHECKING
 #define _CHECK_VALID(p, msg) do {if((p)==0){CkAbort(msg);}} while(0)
index d68368e213d63050106afee9aacb8d15214cb2c5..c2e5c3748bec6383f63f9aec3d21ddcdd6513de6 100644 (file)
@@ -938,6 +938,13 @@ void _initCharm(int unused_argc, char **argv)
 { 
        int inCommThread = (CmiMyRank() == CmiMyNodeSize());
 
+       if(CmiMyNode() == 0) {
+    if(CmiGetArgFlag(argv, "+printTopo")) {
+                       TopoManager tmgr;
+                       tmgr.printAllocation();
+               }
+       }
+
        DEBUGF(("[%d,%.6lf ] _initCharm started\n",CmiMyPe(),CmiWallTimer()));
 
        CkpvInitialize(size_t *, _offsets);
index 53b001f290bb9793a6b64013f45d7827c3a0dd01..266cced0fb5c1b410aef80030d4d1708c172ccd3 100644 (file)
@@ -14,8 +14,6 @@
 
 #if XT3_TOPOLOGY
 #include <catamount/cnos_mpi_os.h>
-#define MAXNID 2784
-#define TDIM 2
 
 #else  /* if it is a XT4/5 or XE */
 #include <pmi.h>
@@ -36,7 +34,7 @@ int getXTNodeID(int mpirank, int nummpiranks) {
 
   ierr = cnos_get_nidpid_map(&nidpid);
   nid = nidpid[mpirank].nid;
-  /* free(nidpid); */
+  free(nidpid); 
 
 #elif CMK_HAS_PMI_GET_NID      /* if it is a XT4/5 or XE */
   PMI_Get_nid(mpirank, &nid);
@@ -57,7 +55,12 @@ int getXTNodeID(int mpirank, int nummpiranks) {
 
 #include <rca_lib.h>
 
-  #if XT4_TOPOLOGY
+/*
+       #if XT3_TOPOLOGY
+       #define MAXNID 2784
+       #define TDIM 2
+
+  #elif XT4_TOPOLOGY
   #define MAXNID 14000
   #define TDIM 4
 
@@ -66,24 +69,28 @@ int getXTNodeID(int mpirank, int nummpiranks) {
   #define TDIM 12
 
   #elif XE6_TOPOLOGY
-    /* hopper */
+    // hopper 
   #define MAXNID 6384
   #define TDIM 24
 #if 0
-    /* titan */
+    // titan
   #define MAXNID 9600
 #define TDIM 16
-    /* ESS */
+    // ESS 
   #define MAXNID 4608
   #define TDIM 32
-    /* JYC */
+    // JYC
   #define MAXNID 97
   #define TDIM 32
 #endif
   #endif
+*/
 
 int *pid2nid = NULL;            /* rank to node ID */
-int nid2pid[MAXNID][TDIM];      /* node ID to rank */
+int maxX = -1;
+int maxY = -1;
+int maxZ = -1;
+int maxNID = -1;
 
 /** \function getMeshCoord
  *  wrapper function for rca_get_meshcoord
@@ -110,16 +117,23 @@ int getMeshCoord(int nid, int *x, int *y, int *z) {
  */
 void pidtonid(int numpes) {
   if (pid2nid != NULL) return;          /* did once already */
+
+       getDimension(&maxNID,&maxX,&maxY,&maxZ);
+       int numCores = CmiNumCores();
+  
+       pid2nid = (int *)malloc(sizeof(int) * numpes);
+
 #if XT3_TOPOLOGY
   cnos_nidpid_map_t *nidpid; 
-  int ierr, i, j, nid;
-  
+  int ierr, i, nid;
+       int *nid2pid;
+       
+       nid2pid = (int*)malloc(maxNID*2*sizeof(int));
   nidpid = (cnos_nidpid_map_t *)malloc(sizeof(cnos_nidpid_map_t) * numpes);
-  pid2nid = (int *)malloc(sizeof(int) * numpes);
 
-  for(i=0; i<MAXNID; i++) {
-    nid2pid[i][0] = -1;
-    nid2pid[i][1] = -1;
+  for(i=0; i<maxNID; i++) {
+    nid2pid[2*i+0] = -1;
+    nid2pid[2*i+1] = -1;
   }
       
   ierr = cnos_get_nidpid_map(&nidpid);
@@ -129,41 +143,32 @@ void pidtonid(int numpes) {
     
     /* if the first position on the node is not filled */
     /* put it there (0) else at (1) */
-    if (nid2pid[nid][0] == -1)
-      nid2pid[nid][0] = i;
+    if (nid2pid[2*nid+0] == -1)
+      nid2pid[2*nid+0] = i;
     else
-      nid2pid[nid][1] = i;
+      nid2pid[2*nid+1] = i;
   }
-  /* free(nidpid); */
 
   /* CORRECTION FOR MPICH_RANK_REORDER_METHOD */
 
   int k = -1;
-  for(i=0; i<MAXNID; i++) {
-    if(nid2pid[i][0] != -1) {
-      nid2pid[i][0] = k++;
+  for(i=0; i<maxNID; i++) {
+    if(nid2pid[2*i+0] != -1) {
+      nid2pid[2*i+0] = k++;
       pid2nid[k] = i;
-      nid2pid[i][1] = k++;
+      nid2pid[2*i+1] = k++;
       pid2nid[k] = i;
     }
   }
-  
-#elif XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
-  int i, l, nid;
-  pid2nid = (int *)malloc(sizeof(int) * numpes);
-
-  for(i=0; i<MAXNID; i++)
-    for(l=0; l<TDIM; l++)
-      nid2pid[i][l] = -1;
+       free(nidpid);
+       free(nid2pid);
 
+#elif XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
+  int i, nid;
   for (i=0; i<numpes; i++) {
     PMI_Get_nid(CmiNodeOf(i), &nid);
     pid2nid[i] = nid;
-    CmiAssert(nid < MAXNID);
-
-    l = 0;
-    while(nid2pid[nid][l] != -1) l++;
-    nid2pid[nid][l] = i;
+    CmiAssert(nid < maxNID);
   }
 #endif
 }
@@ -173,6 +178,14 @@ void getDimension(int *maxnid, int *xdim, int *ydim, int *zdim)
 {
   int i = 0, ret;
 
+       if(maxNID != -1) {
+               *xdim = maxX;
+               *ydim = maxY;
+               *zdim = maxZ;
+               *maxnid = maxNID;
+               return;
+       }
+
   *xdim = *ydim = *zdim = 0;
     /* loop until fails to find the max */ 
   do {
@@ -183,10 +196,10 @@ void getDimension(int *maxnid, int *xdim, int *ydim, int *zdim)
       if (z>*zdim) *zdim = z;
       i++;
   } while (ret == 0);
-  *maxnid = i;
-  *xdim = *xdim+1;
-  *ydim = *ydim+1;
-  *zdim = *zdim+1;
+  maxNID = *maxnid = i;
+  maxX = *xdim = *xdim+1;
+  maxY = *ydim = *ydim+1;
+  maxZ = *zdim = *zdim+1;
 }
 
-#endif /* XT3_TOPOLOGY || XT4_TOPOLOGY || XT5_TOPOLOGY */
+#endif /* XT3_TOPOLOGY || XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY */
index 502651d47336f07620a262586b68bb3c33f39e6e..26d93ecfa610601401f820e228e56c5ea2f52d62 100644 (file)
@@ -132,7 +132,7 @@ TopoManager::TopoManager() {
   torusT = false;
 #endif
 
-  numPes = dimNX * dimNY * dimNZ * dimNT;
+  numPes = CmiNumPes();
 }
 
 TopoManager::TopoManager(int NX, int NY, int NZ, int NT) : dimNX(NX), dimNY(NY), dimNZ(NZ), dimNT(NT) {
@@ -414,3 +414,14 @@ int TopoManager::partition(int pe, int *pes, int *idx, int left, int right) {
   }
 }
 
+void TopoManager::printAllocation() 
+{
+       int i,x,y,z,t;
+       printf("Printing topology Info-\n");
+       printf("NumPes -  %d\n",numPes);
+       printf("Rank - x y z t\n");
+       for(i=0; i<numPes; i++) {
+               rankToCoordinates(i,x,y,z,t);
+               printf("%d - %d %d %d %d\n",i,x,y,z,t);
+       }
+}
index bb320de2b755e7782b3b068868f24190b45735b6..27f3a62ecb853b3a4084bc118f4c5f8d67060d1d 100644 (file)
@@ -59,6 +59,7 @@ class TopoManager {
     void sortRanksByHops(int pe, int *pes, int *idx, int n);
     int pickClosestRank(int mype, int *pes, int n);
     int areNeighbors(int pe1, int pe2, int pe3, int distance);
+               void printAllocation();
 
     /** The next 5 functions are only there for backward compatibility
     and should not be used */
index 49fc55272b144afd4eeb7d342ea4584207cb0633..8b141b390d3a32066011b71595dd71cc5e2dcd47 100644 (file)
 
 #if XT3_TOPOLOGY
 
+#define CPU_FACTOR 1
+/*
 #define XDIM 11
 #define YDIM 12
 #define ZDIM 16
 #define TDIM 2
 #define MAXNID 2784
-
+*/
 extern "C" int *pid2nid;
-extern "C" int nid2pid[MAXNID][TDIM];
 extern "C" int pidtonid(int numpes);
 extern "C" int getMeshCoord(int nid, int *x, int *y, int *z);
+extern "C" void getDimension(int *,int *, int *, int *);
 
 struct loc {
   int x;
@@ -55,28 +57,43 @@ class XT3TorusManager {
     int procsPerNode;   // number of cores per node
     char mapping[10];
     
-    int coords2pid[XDIM][YDIM][ZDIM][TDIM];     // coordinates to rank
+    int ****coords2pid;     // coordinates to rank
     struct loc *pid2coords;                     // rank to coordinates
     struct loc origin;
 
   public:
     XT3TorusManager() {
       int nid = 0, oldnid = -1, lx, ly, lz;
-      int minX=XDIM, minY=YDIM, minZ=ZDIM, minT=0, maxX=0, maxY=0, maxZ=0;
+                       int xDIM, yDIM, zDIM, maxNID,numCores;
+      int minX, minY, minZ, minT=0, maxX=0, maxY=0, maxZ=0;
 
       int numPes = CmiNumPes();
       pid2coords = (struct loc*)malloc(sizeof(struct loc) * numPes);
 
       // first fill the nid2pid and pid2nid data structures
       pidtonid(numPes);
+                       getDimension(&maxNID,&xDIM,&yDIM,&zDIM);
+      minX=xDIM, minY=yDIM, minZ=zDIM;
+                       numCores = CmiNumCores()*CPU_FACTOR;
+                       
+                       coords2pid = (int ****)malloc(xDIM*sizeof(int***));
+                       for(i=0; i<xDIM; i++) {
+                               coords2pid[i] = (int ***)malloc(yDIM*sizeof(int**));
+                               for(j=0; j<yDIM; j++) {
+                                       coords2pid[i][j] = (int **)malloc(zDIM*sizeof(int*));
+                                       for(k=0; k<zDIM; k++) {
+                                               coords2pid[i][j][k] = (int *)malloc(numCores*sizeof(int*));
+                                       }
+                               }
+                       }
+
+      for(i=0; i<xDIM; i++)
+        for(j=0; j<yDIM; j++)
+          for(k=0; k<zDIM; k++)
+            for(l=0; l<numCores; l++)
+              coords2pid[i][j][k][l] = -1;
  
-      for(int i=0; i<XDIM; i++)
-       for(int j=0; j<YDIM; j++)
-         for(int k=0; k<ZDIM; k++)
-           for(int l=0; l<TDIM; l++)
-             coords2pid[i][j][k][l] = -1;
-
-      dimNT = 1;                       // assume SN mode first
+      dimNT = 1;       
       // now fill the coords2pid and pid2coords data structures
       for(int i=0; i<numPes; i++)
       {
index bd3840ef9b329bc1d395a6d3f8f129c81bf4640a..506495f618558dc60cd40278cf2e4b856f861c56 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 
+#if XE6_TOPOLOGY
+#define CPU_FACTOR 2
+#else
+#define CPU_FACTOR 1
+#endif
+
 #if XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
 
 // XDIM, YDIM, ZDIM and MAXNID depend on a specific Cray installation.
 // Please do NOT expect things to work if you use this code on a new
 // Cray machine.
 
+/*
 #if XT4_TOPOLOGY
 #define MAXNID 14000
 #define XDIM 21
 
 #elif XE6_TOPOLOGY
 #define CPU_FACTOR 2
-/* hopper */
+// hopper 
 #define MAXNID 6384
 #define XDIM 17
 #define YDIM 8
 #define ZDIM 24
 #define TDIM 24
 #if 0
-/* titan */
+// titan 
 #define MAXNID 9600
 #define XDIM 25
 #define YDIM 16
 #define ZDIM 24
 #define TDIM 16
-/* ESS */
+// ESS 
 #define MAXNID 4608
 #define XDIM 12
 #define YDIM 8
 #define ZDIM 24
 #define TDIM 32
-/* JYC */
+// JYC 
 #define MAXNID 97
 #define XDIM 1
 #define YDIM 6
 #define TDIM 32
 #endif
 #endif
-
+*/
 extern "C" int *pid2nid;
-extern "C" int nid2pid[MAXNID][TDIM];
 extern "C" int pidtonid(int numpes);
 extern "C" int getMeshCoord(int nid, int *x, int *y, int *z);
+extern "C" void getDimension(int *,int *, int *, int *);
 
 struct loc {
   int x;
@@ -89,7 +96,7 @@ class XTTorusManager {
     int torus[4];
     int procsPerNode;   // number of cores per node
 
-    int coords2pid[XDIM][YDIM][ZDIM][TDIM*CPU_FACTOR];     // coordinates to rank
+    int ****coords2pid;     // coordinates to rank
     struct loc *pid2coords;                     // rank to coordinates
     struct loc origin;
 
@@ -97,21 +104,36 @@ class XTTorusManager {
     XTTorusManager() {
       int nid = 0, oldnid = -1, lx, ly, lz;
       int i, j, k, l;
-      int minX=XDIM, minY=YDIM, minZ=ZDIM, minT=0, maxX=0, maxY=0, maxZ=0;
+                       int xDIM, yDIM, zDIM, maxNID,numCores;
+      int minX, minY, minZ, minT=0, maxX=0, maxY=0, maxZ=0;
 
       int numPes = CmiNumPes();
       pid2coords = (struct loc*)malloc(sizeof(struct loc) * numPes);
 
       // fill the nid2pid and pid2nid data structures
       pidtonid(numPes);
+                       getDimension(&maxNID,&xDIM,&yDIM,&zDIM);
+      minX=xDIM, minY=yDIM, minZ=zDIM;
+                       numCores = CmiNumCores()*CPU_FACTOR;
+
+                       coords2pid = (int ****)malloc(xDIM*sizeof(int***));
+                       for(i=0; i<xDIM; i++) {
+                               coords2pid[i] = (int ***)malloc(yDIM*sizeof(int**));
+                               for(j=0; j<yDIM; j++) {
+                                       coords2pid[i][j] = (int **)malloc(zDIM*sizeof(int*));
+                                       for(k=0; k<zDIM; k++) {
+                                               coords2pid[i][j][k] = (int *)malloc(numCores*sizeof(int*));
+                                       }
+                               }
+                       }
 
-      for(i=0; i<XDIM; i++)
-        for(j=0; j<YDIM; j++)
-          for(k=0; k<ZDIM; k++)
-            for(l=0; l<TDIM*CPU_FACTOR; l++)
+      for(i=0; i<xDIM; i++)
+        for(j=0; j<yDIM; j++)
+          for(k=0; k<zDIM; k++)
+            for(l=0; l<numCores; l++)
               coords2pid[i][j][k][l] = -1;
 
-      dimNT = 1;                       // assume SN mode first
+      dimNT = 1;       
       // now fill the coords2pid and pid2coords data structures
       for(i=0; i<numPes; i++)
       {
@@ -153,27 +175,26 @@ class XTTorusManager {
       dimY = dimNY;
       dimZ = dimNZ;
 
-                       /* Not needed now
-      // pick a random node (1) to find the number of cores per node being
-      // actually used - assumes same number of cores per node
-      lx = pid2coords[1].x;
-      ly = pid2coords[1].y;
-      lz = pid2coords[1].z;
-      for(l=0; l<TDIM*CPU_FACTOR; l++) {
-        if(coords2pid[lx][ly][lz][l] == -1)
-          break;
-      }
-      dimNT = l;
-                       */
-
       // we get a torus only if the size of the dimension is the biggest
-      torus[0] = 0;            // Jaguar is a mesh in X dimension always
+      torus[0] = 0;            
       torus[1] = (dimNY == YDIM) ? 1 : 0;
       torus[2] = (dimNZ == ZDIM) ? 1 : 0;
       torus[3] = 0;
     }
 
-    ~XTTorusManager() { free(pid2coords); }
+    ~XTTorusManager() { 
+                       int i,j,k;
+                       free(pid2coords); 
+                       for(i=0; i<xDIM; i++) {
+                               for(j=0; j<yDIM; j++) {
+                                       for(k=0; k<zDIM; k++) {
+                                               free(coords2pid[i][j][k]);
+                                       }
+                                       free(coords2pid[i][j]);
+                               }
+                               free(coords2pid[i]);
+                       }
+               }
 
     inline int getDimX() { return dimX; }
     inline int getDimY() { return dimY; }
@@ -204,7 +225,7 @@ class XTTorusManager {
 
     inline int coordinatesToRank(int x, int y, int z, int t) {
       if(coords2pid[x+origin.x][y+origin.y][z+origin.z][t+origin.t] == -1) {
-                               return coords2pid[x+origin.x][y+origin.y][z+origin.z][t+origin.t-TDIM]; 
+                               return coords2pid[x+origin.x][y+origin.y][z+origin.z][t+origin.t-CmiNumCores()]; 
                        } else {
                                return coords2pid[x+origin.x][y+origin.y][z+origin.z][t+origin.t];
                        }