avoid charm.h in converse code, use converse.h instead
[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 XT3_TOPOLOGY
22 #include "XT3Torus.h"
23 #elif XT4_TOPOLOGY || XT5_TOPOLOGY
24 #include "XTTorus.h"
25 #endif
26
27 #if CMK_BLUEGENE_CHARM
28 #include "blue.h"
29 #endif
30
31 class TopoManager {
32   public:
33     TopoManager();
34     TopoManager(int NX, int NY, int NZ, int NT);
35     ~TopoManager() { }
36
37     inline int getDimNX() const { return dimNX; }
38     inline int getDimNY() const { return dimNY; }
39     inline int getDimNZ() const { return dimNZ; }
40     inline int getDimNT() const { return dimNT; }
41
42     inline int getProcsPerNode() const { return procsPerNode; }
43
44     int hasMultipleProcsPerNode() const;
45     void rankToCoordinates(int pe, int &x, int &y, int &z, int &t);
46     int coordinatesToRank(int x, int y, int z, int t);
47     int getHopsBetweenRanks(int pe1, int pe2);
48     void sortRanksByHops(int pe, int *pes, int *idx, int n);
49     int pickClosestRank(int mype, int *pes, int n);
50     int areNeighbors(int pe1, int pe2, int pe3, int distance);
51
52     /** The next 5 functions are only there for backward compatibility
53     and should not be used */
54     inline int getDimX() { return dimX; }
55     inline int getDimY() { return dimY; }
56     inline int getDimZ() { return dimZ; }
57     void rankToCoordinates(int pe, int &x, int &y, int &z);
58     int coordinatesToRank(int x, int y, int z);
59
60     inline int absX(int x) {
61       int px = abs(x);
62       int sx = dimNX - px;
63       CmiAssert(sx>=0);
64       if(torusX)
65         return ((px>sx) ? sx : px);
66       else
67         return px;
68     }
69     
70     inline int absY(int y) {
71       int py = abs(y);
72       int sy = dimNY - py;
73       CmiAssert(sy>=0);
74       if(torusY)
75         return ((py>sy) ? sy : py);
76       else
77         return py;
78     }
79
80     inline int absZ(int z) {
81       int pz = abs(z);
82       int sz = dimNZ - pz;
83       CmiAssert(sz>=0);
84       if(torusZ)
85         return ((pz>sz) ? sz : pz);
86       else
87         return pz;
88     }
89
90   private:
91     int dimX;   // dimension of the allocation in X (no. of processors)
92     int dimY;   // dimension of the allocation in Y (no. of processors)
93     int dimZ;   // dimension of the allocation in Z (no. of processors)
94     int dimNX;  // dimension of the allocation in X (no. of nodes)
95     int dimNY;  // dimension of the allocation in Y (no. of nodes)
96     int dimNZ;  // dimension of the allocation in Z (no. of nodes)
97     int dimNT;  // dimension of the allocation in T (no. of processors per node)
98     int numPes;
99     int torusX, torusY, torusZ, torusT;
100     int procsPerNode;
101
102 #if CMK_BLUEGENEL
103     BGLTorusManager bgltm;
104 #elif CMK_BLUEGENEP
105     BGPTorusManager bgptm;
106 #elif XT3_TOPOLOGY
107     XT3TorusManager xt3tm;
108 #elif XT4_TOPOLOGY || XT5_TOPOLOGY
109     XTTorusManager xttm;
110 #endif
111
112     void quicksort(int pe, int *pes, int *arr, int left, int right);
113     int partition(int pe, int *pes, int *idx, int left, int right);
114 };
115
116 #endif //_TOPO_MANAGER_H_