9eb6bf61e7d151c03810be51ea7658a203a12f49
[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
63   private:
64     int id;             // id of the neighbor = index of the neighbor vertex
65                         // in the vector 'vertices'
66     int msgs;           // number of messages exchanged
67     int bytes;          // total number of bytes exchanged
68 };
69
70
71 class Vertex {
72   friend class ObjGraph;
73
74   public:
75     inline int getVertexId() { return id; }
76     inline double getVertexLoad() { return compLoad; }
77     inline int getCurrentPe() { return currPe; }
78     inline int getNewPe() { return newPe; }
79     inline void setNewPe(int _newpe) { newPe = _newpe; }
80     inline bool isMigratable() { return migratable; }
81
82     // list of vertices this vertex sends messages to and receives from
83     std::vector<Edge> sendToList;
84     std::vector<Edge> recvFromList;
85
86   private:
87     int id;             // index in the LDStats array
88     double compLoad;    // computational load (walltime in LDStats)
89     bool migratable;    // migratable or non-migratable
90     int currPe;         // current processor assignment
91     int newPe;          // new processor assignment after load balancing
92 };
93
94
95 class ObjGraph {
96   public:
97     ObjGraph(BaseLB::LDStats *stats);
98     ~ObjGraph() { }
99     void convertDecisions(BaseLB::LDStats *stats);
100
101     // all vertices in the graph. Each vertex corresponds to a chare
102     std::vector<Vertex> vertices;
103 };
104
105 #endif // _CKGRAPH_H_
106
107 /*@}*/
108