00001
00007 #ifndef _BGL_TORUS_H_
00008 #define _BGL_TORUS_H_
00009
00010 #include <string.h>
00011 #include "converse.h"
00012
00013 #if CMK_BLUEGENEL
00014
00015 #include <bglpersonality.h>
00016
00017 extern "C" int rts_get_personality(struct BGLPersonality *dst, unsigned size);
00018 extern "C" int rts_coordinatesForRank(unsigned logicalRank, unsigned *x,
00019 unsigned *y, unsigned *z, unsigned *t);
00020
00021 class BGLTorusManager {
00022 private:
00023 BGLPersonality bgl_p;
00024 int dimX;
00025 int dimY;
00026 int dimZ;
00027 int dimNX;
00028 int dimNY;
00029 int dimNZ;
00030 int dimNT;
00031
00032 int torus[4];
00033 int procsPerNode;
00034 char *mapping;
00035
00036 public:
00037 BGLTorusManager() {
00038 int size = sizeof(BGLPersonality);
00039 int i = rts_get_personality(&bgl_p, size);
00040
00041 dimNX = bgl_p.xSize;
00042 dimNY = bgl_p.ySize;
00043 dimNZ = bgl_p.zSize;
00044
00045 if(bgl_p.opFlags & BGLPERSONALITY_OPFLAGS_VIRTUALNM)
00046 dimNT = 2;
00047 else
00048 dimNT = 1;
00049
00050
00051
00052
00053 int numPes = CmiNumPes();
00054 int numNodes = numPes;
00055 if(dimNT==2) numNodes = numPes / 2;
00056
00057 int max_t = 0;
00058 if(dimNX * dimNY * dimNZ != numNodes) {
00059 dimNX = dimNY = dimNZ = 0;
00060 int min_x, min_y, min_z;
00061 min_x = min_y = min_z = numPes;
00062 unsigned int tmp_t, tmp_x, tmp_y, tmp_z;
00063 for(int c = 0; c < numPes; c++) {
00064 rts_coordinatesForRank(c, &tmp_x, &tmp_y, &tmp_z, &tmp_t);
00065
00066 if(tmp_x > dimNX) dimNX = tmp_x;
00067 if(tmp_x < min_x) min_x = tmp_x;
00068 if(tmp_y > dimNY) dimNY = tmp_y;
00069 if(tmp_y < min_y) min_y = tmp_y;
00070 if(tmp_z > dimNZ) dimNZ = tmp_z;
00071 if(tmp_z < min_z) min_z = tmp_z;
00072
00073 if(tmp_t > max_t) max_t = tmp_t;
00074 }
00075
00076 dimNX = dimNX - min_x + 1;
00077 dimNY = dimNY - min_y + 1;
00078 dimNZ = dimNZ - min_z + 1;
00079 }
00080
00081 dimX = dimNX;
00082 dimY = dimNY;
00083 dimZ = dimNZ;
00084
00085 if(dimX * dimY * dimZ != numNodes) {
00086 dimX = dimX * (max_t + 1);
00087 procsPerNode = max_t;
00088 }
00089 else if(dimNT == 2) {
00090 dimX = dimX * dimNT;
00091 procsPerNode = dimNT;
00092 }
00093
00094 torus[0] = bgl_p.isTorusX();
00095 torus[1] = bgl_p.isTorusY();
00096 torus[2] = bgl_p.isTorusZ();
00097 torus[3] = 0;
00098
00099 mapping = getenv("BGLMPI_MAPPING");
00100 }
00101
00102 ~BGLTorusManager() {
00103 }
00104
00105 inline int getDimX() { return dimX; }
00106 inline int getDimY() { return dimY; }
00107 inline int getDimZ() { return dimZ; }
00108
00109 inline int getDimNX() { return dimNX; }
00110 inline int getDimNY() { return dimNY; }
00111 inline int getDimNZ() { return dimNZ; }
00112 inline int getDimNT() { return dimNT; }
00113
00114 inline int getProcsPerNode() { return procsPerNode; }
00115
00116 inline int* isTorus() { return torus; }
00117
00118 inline void rankToCoordinates(int pe, int &x, int &y, int &z) {
00119 x = pe % dimX;
00120 y = (pe % (dimX*dimY)) / dimX;
00121 z = pe / (dimX*dimY);
00122 }
00123
00124 inline void rankToCoordinates(int pe, int &x, int &y, int &z, int &t) {
00125 if(mapping==NULL || (mapping!=NULL && mapping[0]=='X')) {
00126 x = pe % dimNX;
00127 y = (pe % (dimNX*dimNY)) / dimNX;
00128 z = (pe % (dimNX*dimNY*dimNZ)) / (dimNX*dimNY);
00129 t = pe / (dimNX*dimNY*dimNZ);
00130 } else {
00131 t = pe % dimNT;
00132 x = (pe % (dimNT*dimNX)) / dimNT;
00133 y = (pe % (dimNT*dimNX*dimNY)) / (dimNT*dimNX);
00134 z = pe / (dimNT*dimNX*dimNY);
00135 }
00136 }
00137
00138 inline int coordinatesToRank(int x, int y, int z) {
00139 return x + (y + z*dimY) * dimX;
00140 }
00141
00142 inline int coordinatesToRank(int x, int y, int z, int t) {
00143 if(mapping==NULL || (mapping!=NULL && mapping[0]=='X'))
00144 return x + (y + (z + t*dimNZ) * dimNY) * dimNX;
00145 else
00146 return t + (x + (y + z*dimNY) * dimNX) * dimNT;
00147 }
00148
00149 inline int getNodeID(int pe) {
00150 int t, x, y, z;
00151 t = pe % dimNT;
00152 x = (pe % (dimNT*dimNX)) / dimNT;
00153 y = (pe % (dimNT*dimNX*dimNY)) / (dimNT*dimNX);
00154 z = pe / (dimNT*dimNX*dimNY);
00155 return x + y*dimNX + z*dimNX*dimNY;
00156 }
00157 };
00158
00159 #endif // CMK_BLUEGENEL
00160 #endif //_BGL_TORUS_H_