build: fix travis MPI/SMP build
[charm.git] / src / ck-ldb / ckgraph.h
1 /** \file ckgraph.h
2  *  Author: Abhinav S Bhatele
3  *  Date Created: October 29th, 2010
4  *  E-mail: bhatele@illinois.edu
5  *
6  */
7
8 /**
9  *  \addtogroup CkLdb
10  */
11
12 /*@{*/
13
14 #ifndef _CKGRAPH_H_
15 #define _CKGRAPH_H_
16
17 #include <vector>
18 #include "BaseLB.h"
19
20 class ProcInfo {
21   friend class ProcArray;
22
23   public:
24     ProcInfo() {}
25     ProcInfo(int i, double ov, double tl, double sp, bool avail): id(i), _overhead(ov), _totalLoad(tl), _pe_speed(sp), available(avail) {}
26     inline int getProcId() { return id; }
27     inline void setProcId(int _id) { id = _id; }
28     inline double getTotalLoad() const { return _totalLoad; }
29 //    inline void setTotalLoad(double load) { totalLoad = load; }
30 //    inline double getOverhead() { return overhead; }
31 //    inline void setOverhead(double oh) { overhead = oh; }
32     inline double &overhead() { return _overhead; }
33     inline double &totalLoad() { return _totalLoad; }
34     inline double &pe_speed() { return _pe_speed; }
35     inline bool isAvailable() { return available; }
36
37   protected:
38     int id;             // CkMyPe of the processor
39     double _overhead;   // previously called background load (bg_walltime)
40     double _totalLoad;  // includes object_load + overhead
41     double _pe_speed;   // CPU speed
42     bool available;     // if the processor is available
43 };
44
45 class ProcArray {
46   public:
47     ProcArray(BaseLB::LDStats *stats);
48     ~ProcArray() { }
49     inline double getAverageLoad() { return avgLoad; }
50     void resetTotalLoad();
51
52     // vector containing the list of processors
53     std::vector<ProcInfo> procs;
54
55   protected:
56     double avgLoad;
57 };
58
59 class Edge {
60   friend class ObjGraph;
61
62   public:
63     Edge(int _id, int _msgs, int _bytes) : id(_id), msgs(_msgs),
64       bytes(_bytes) {
65     }
66     ~Edge() { }
67     inline int getNeighborId() { return id; }
68     inline int getNumMsgs() { return msgs; }
69     inline int getNumBytes() { return bytes; }
70     inline void setNumBytes(int _bytes) { bytes = _bytes; }
71
72   private:
73     int id;             // id of the neighbor = index of the neighbor vertex
74                         // in the vector 'vertices'
75     int msgs;           // number of messages exchanged
76     int bytes;          // total number of bytes exchanged
77 };
78
79 class McastSrc {
80   friend class ObjGraph;
81
82   public:
83     McastSrc(int _numDest, int _msgs, int _bytes) : numDest(_numDest), msgs(_msgs),
84     bytes(_bytes) {
85     }
86
87     ~McastSrc() { }
88
89     inline int getNumMsgs() { return msgs; }
90     inline int getNumBytes() { return bytes; }
91     inline void setNumBytes(int _bytes) { bytes = _bytes; }
92
93     std::vector<int> destList;
94
95   private:
96     int numDest; //number of destination for this multicast
97     int msgs; // number of messages exchanged
98     int bytes; // total number of bytes exchanged
99 };
100
101 class McastDest {
102   friend class ObjGraph;
103
104   public:
105     McastDest(int _src, int _offset, int _msgs, int _bytes) : src(_src),
106     offset(_offset), msgs(_msgs), bytes(_bytes) {
107     }
108
109     ~McastDest() { }
110
111     inline int getSrc() { return src; }
112     inline int getOffset() { return offset; }
113     inline int getNumMsgs() { return msgs; }
114     inline int getNumBytes() { return bytes; }
115     inline void setNumBytes(int _bytes) { bytes = _bytes; }
116
117   private:
118     int src; // src of multicast being received
119     int offset; //multicast list which this message belongs to
120     int msgs; // number of messages exchanged
121     int bytes; // total number of bytes exchanged
122 };
123
124 class Vertex {
125   friend class ObjGraph;
126
127   public:
128     Vertex() {}
129     Vertex(int i, double cl, bool mig, int curpe, int newpe=-1, size_t pupsize=0):
130         id(i), compLoad(cl), migratable(mig), currPe(curpe), newPe(newpe),
131         pupSize(pupsize)  {}
132     inline int getVertexId() { return id; }
133     inline double getVertexLoad() const { return compLoad; }
134     inline int getCurrentPe() { return currPe; }
135     inline int getNewPe() { return newPe; }
136     inline void setNewPe(int _newpe) { newPe = _newpe; }
137     inline bool isMigratable() { return migratable; }
138
139     // list of vertices this vertex sends messages to and receives from
140     std::vector<Edge> sendToList;
141     std::vector<Edge> recvFromList;
142     std::vector<McastSrc> mcastToList;
143     std::vector<McastDest> mcastFromList;
144                 double getCompLoad() {return compLoad;}
145                 void setCompLoad(double s) {compLoad = s;}
146     int getCurrPe() {return currPe;}
147     void setCurrPe(int s) {currPe = s;}
148
149
150   private:
151     int id;             // index in the LDStats array
152     double compLoad;    // computational load (walltime in LDStats)
153     bool migratable;    // migratable or non-migratable
154     int currPe;         // current processor assignment
155     int newPe;          // new processor assignment after load balancing
156     size_t pupSize;
157 };
158
159
160 class ObjGraph {
161   public:
162     ObjGraph(BaseLB::LDStats *stats);
163     ~ObjGraph() { }
164     void convertDecisions(BaseLB::LDStats *stats);
165
166     // all vertices in the graph. Each vertex corresponds to a chare
167     std::vector<Vertex> vertices;
168 };
169
170 #endif // _CKGRAPH_H_
171
172 /*@}*/
173