27f3a62ecb853b3a4084bc118f4c5f8d67060d1d
[charm.git] / src / util / TopoManager.h
1 /** \file TopoManager.h
2  *  Author: Abhinav S Bhatele
3  *  Date Created: March 19th, 2007
4  *
5  *  This would be the top level interface for all topology managers we
6  *  will write for different machines (Cray, IBM ... for tori, meshes ...)
7  *  Current we have functionality for Blue Gene, Cray XT, BigSim and 
8  *  non-topo machines.
9  *
10  */
11
12 #ifndef _TOPO_MANAGER_H_
13 #define _TOPO_MANAGER_H_
14
15 #include "converse.h"
16
17 #if CMK_BLUEGENEL
18 #include "BGLTorus.h"
19 #elif CMK_BLUEGENEP
20 #include "BGPTorus.h"
21 #elif CMK_BLUEGENEQ
22 #include "BGQTorus.h"
23 #elif XT3_TOPOLOGY
24 #include "XT3Torus.h"
25 #elif XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
26 #include "XTTorus.h"
27 #endif
28
29 #if CMK_BIGSIM_CHARM
30 #include "blue.h"
31 #endif
32
33 class TopoManager {
34   public:
35     TopoManager();
36     TopoManager(int NX, int NY, int NZ, int NT);
37     ~TopoManager() { }
38
39     inline int getDimNX() const { return dimNX; }
40     inline int getDimNY() const { return dimNY; }
41     inline int getDimNZ() const { return dimNZ; }
42 #if CMK_BLUEGENEQ
43     inline int getDimNA() const { return dimNA; }
44     inline int getDimNB() const { return dimNB; }
45     inline int getDimNC() const { return dimNC; }
46     inline int getDimND() const { return dimND; }
47     inline int getDimNE() const { return dimNE; }
48 #endif
49     inline int getDimNT() const { return dimNT; }
50
51     inline int getProcsPerNode() const { return procsPerNode; }
52
53     int hasMultipleProcsPerNode() const;
54     void rankToCoordinates(int pe, int &x, int &y, int &z, int &t);
55     void rankToCoordinates(int pe, int &a, int &b, int &c, int &d, int &e, int &t);
56     int coordinatesToRank(int x, int y, int z, int t);
57     int coordinatesToRank(int a, int b, int c, int d, int e, int t);
58     int getHopsBetweenRanks(int pe1, int pe2);
59     void sortRanksByHops(int pe, int *pes, int *idx, int n);
60     int pickClosestRank(int mype, int *pes, int n);
61     int areNeighbors(int pe1, int pe2, int pe3, int distance);
62                 void printAllocation();
63
64     /** The next 5 functions are only there for backward compatibility
65     and should not be used */
66     inline int getDimX() { return dimX; }
67     inline int getDimY() { return dimY; }
68     inline int getDimZ() { return dimZ; }
69     void rankToCoordinates(int pe, int &x, int &y, int &z);
70     int coordinatesToRank(int x, int y, int z);
71
72     inline int absX(int x) {
73       int px = abs(x);
74       int sx = dimNX - px;
75       CmiAssert(sx>=0);
76       if(torusX)
77         return ((px>sx) ? sx : px);
78       else
79         return px;
80     }
81     
82     inline int absY(int y) {
83       int py = abs(y);
84       int sy = dimNY - py;
85       CmiAssert(sy>=0);
86       if(torusY)
87         return ((py>sy) ? sy : py);
88       else
89         return py;
90     }
91
92     inline int absZ(int z) {
93       int pz = abs(z);
94       int sz = dimNZ - pz;
95       CmiAssert(sz>=0);
96       if(torusZ)
97         return ((pz>sz) ? sz : pz);
98       else
99         return pz;
100     }
101 #if CMK_BLUEGENEQ
102     inline int absA(int a) {
103       int pa = abs(a);
104       int sa = dimNA - pa;
105       CmiAssert(sa>=0);
106       if(torusA)
107         return ((pa>sa) ? sa : pa);
108       else
109         return pa;
110     }
111
112     inline int absB(int b) {
113       int pb = abs(b);
114       int sb = dimNB - pb;
115       CmiAssert(sb>=0);
116       if(torusB)
117         return ((pb>sb) ? sb : pb);
118       else
119         return pb;
120     }
121
122     inline int absC(int c) {
123       int pc = abs(c);
124       int sc = dimNC - pc;
125       CmiAssert(sc>=0);
126       if(torusC)
127         return ((pc>sc) ? sc : pc);
128       else
129         return pc;
130     }
131
132     inline int absD(int d) {
133       int pd = abs(d);
134       int sd = dimND - pd;
135       CmiAssert(sd>=0);
136       if(torusD)
137         return ((pd>sd) ? sd : pd);
138       else
139         return pd;
140     }
141
142     inline int absE(int e) {
143       int pe = abs(e);
144       int se = dimNE - pe;
145       CmiAssert(se>=0);
146         return ((pe>se) ? se : pe);
147     }
148 #endif
149   private:
150     int dimX;   // dimension of the allocation in X (no. of processors)
151     int dimY;   // dimension of the allocation in Y (no. of processors)
152     int dimZ;   // dimension of the allocation in Z (no. of processors)
153     int dimNX;  // dimension of the allocation in X (no. of nodes)
154     int dimNY;  // dimension of the allocation in Y (no. of nodes)
155     int dimNZ;  // dimension of the allocation in Z (no. of nodes)
156     int dimNT;  // dimension of the allocation in T (no. of processors per node)
157     int numPes;
158     int torusX, torusY, torusZ, torusT;
159 #if CMK_BLUEGENEQ
160     int dimNA, dimNB, dimNC, dimND, dimNE;
161     int torusA, torusB, torusC, torusD, torusE;
162 #endif
163     int procsPerNode;
164 #if CMK_BLUEGENEL
165     BGLTorusManager bgltm;
166 #elif CMK_BLUEGENEP
167     BGPTorusManager bgptm;
168 #elif CMK_BLUEGENEQ
169     BGQTorusManager bgqtm;
170 #elif XT3_TOPOLOGY
171     XT3TorusManager xt3tm;
172 #elif XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
173     XTTorusManager xttm;
174 #endif
175
176     void quicksort(int pe, int *pes, int *arr, int left, int right);
177     int partition(int pe, int *pes, int *idx, int left, int right);
178 };
179
180 #endif //_TOPO_MANAGER_H_