ck-ldb: fix comm graph and leaks in ScotchLB
[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     inline int getProcId() { return id; }
25     inline double getTotalLoad() { return totalLoad; }
26     inline double getOverhead() { return overhead; }
27     inline void setTotalLoad(double _tload) { totalLoad = _tload; }
28     inline bool isAvailable() { return available; }
29
30   private:
31     int id;             // CkMyPe of the processor
32     double overhead;    // previously called background load (bg_walltime)
33     double totalLoad;   // includes object_load + overhead
34     bool available;     // if the processor is available
35 };
36
37 class ProcArray {
38   public:
39     ProcArray(BaseLB::LDStats *stats);
40     ~ProcArray() { }
41     inline double getAverageLoad() { return avgLoad; }
42     void resetTotalLoad();
43
44     // vector containing the list of processors
45     std::vector<ProcInfo> procs;
46
47   private:
48     double avgLoad;
49 };
50
51 class Edge {
52   friend class ObjGraph;
53
54   public:
55     Edge(int _id, int _msgs, int _bytes) : id(_id), msgs(_msgs),
56       bytes(_bytes) {
57     }
58     ~Edge() { }
59     inline int getNeighborId() { return id; }
60     inline int getNumMsgs() { return msgs; }
61     inline int getNumBytes() { return bytes; }
62     inline void setNumBytes(int _bytes) { bytes = _bytes; }
63
64   private:
65     int id;             // id of the neighbor = index of the neighbor vertex
66                         // in the vector 'vertices'
67     int msgs;           // number of messages exchanged
68     int bytes;          // total number of bytes exchanged
69 };
70
71
72 class Vertex {
73   friend class ObjGraph;
74
75   public:
76     inline int getVertexId() { return id; }
77     inline double getVertexLoad() { return compLoad; }
78     inline int getCurrentPe() { return currPe; }
79     inline int getNewPe() { return newPe; }
80     inline void setNewPe(int _newpe) { newPe = _newpe; }
81     inline bool isMigratable() { return migratable; }
82
83     // list of vertices this vertex sends messages to and receives from
84     std::vector<Edge> sendToList;
85     std::vector<Edge> recvFromList;
86
87   private:
88     int id;             // index in the LDStats array
89     double compLoad;    // computational load (walltime in LDStats)
90     bool migratable;    // migratable or non-migratable
91     int currPe;         // current processor assignment
92     int newPe;          // new processor assignment after load balancing
93 };
94
95
96 class ObjGraph {
97   public:
98     ObjGraph(BaseLB::LDStats *stats);
99     ~ObjGraph() { }
100     void convertDecisions(BaseLB::LDStats *stats);
101
102     // all vertices in the graph. Each vertex corresponds to a chare
103     std::vector<Vertex> vertices;
104 };
105
106 #endif // _CKGRAPH_H_
107
108 /*@}*/
109