doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / ckgraph.C
1 /** \file ckgraph.C
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 #include "ckgraph.h"
15
16 ProcArray::ProcArray(BaseLB::LDStats *stats) {
17   int numPes = stats->nprocs();
18
19   // fill the processor array
20   procs.resize(numPes);
21
22   // Loop through the LDStats structure, copying data into this array and calculating
23   //   the average 'totalLoad' of all the PEs
24   avgLoad = 0.0;
25   for(int pe = 0; pe < numPes; pe++) {
26     procs[pe].id        = stats->procs[pe].pe;
27     procs[pe].overhead()  = stats->procs[pe].bg_walltime;
28     procs[pe].totalLoad() = stats->procs[pe].total_walltime - stats->procs[pe].idletime;
29     procs[pe].available = stats->procs[pe].available;
30     avgLoad += procs[pe].totalLoad();
31   }
32   avgLoad /= numPes;
33 }
34
35 void ProcArray::resetTotalLoad() {
36   for(int pe = 0; pe < procs.size(); pe++)
37     procs[pe].totalLoad() = procs[pe].overhead();
38 }
39
40 ObjGraph::ObjGraph(BaseLB::LDStats *stats) {
41   // fill the vertex list
42   vertices.resize(stats->n_objs);
43
44   for(int vert = 0; vert < stats->n_objs; vert++) {
45     vertices[vert].id         = vert;
46     vertices[vert].compLoad   = stats->objData[vert].wallTime;
47     vertices[vert].migratable = stats->objData[vert].migratable;
48     vertices[vert].currPe     = stats->from_proc[vert];
49     vertices[vert].newPe      = -1;
50   } // end for
51
52   // fill the edge list for each vertex
53   stats->makeCommHash();
54
55   int from, to;
56
57   for(int edge = 0; edge < stats->n_comm; edge++) {
58     LDCommData &commData = stats->commData[edge];
59
60     // ensure that the message is not from a processor but from an object
61     // and that the type is an object to object message
62     if( (!commData.from_proc()) && (commData.recv_type()==LD_OBJ_MSG) ) {
63       from = stats->getHash(commData.sender);
64       to = stats->getHash(commData.receiver.get_destObj());
65
66       vertices[from].sendToList.push_back(Edge(to, commData.messages, commData.bytes));
67       vertices[to].recvFromList.push_back(Edge(from, commData.messages, commData.bytes));
68     } //else if a multicast list
69     else if((!commData.from_proc()) && (commData.recv_type() == LD_OBJLIST_MSG)) {
70       int nobjs, offset;
71       LDObjKey *objs = commData.receiver.get_destObjs(nobjs);
72       McastSrc sender(nobjs, commData.messages, commData.bytes);
73
74       from = stats->getHash(commData.sender);
75       offset = vertices[from].mcastToList.size();
76
77       for(int i = 0; i < nobjs; i++) {
78         int idx = stats->getHash(objs[i]);
79         CmiAssert(idx != -1);
80         vertices[idx].mcastFromList.push_back(McastDest(from, offset,
81         commData.messages, commData.bytes));
82         sender.destList.push_back(idx);
83       }
84       vertices[from].mcastToList.push_back(sender);
85     }
86   } // end for
87 }
88
89 void ObjGraph::convertDecisions(BaseLB::LDStats *stats) {
90   for(int vert = 0; vert < stats->n_objs; vert++) {
91     if(vertices[vert].newPe != -1) {
92       stats->to_proc[vertices[vert].id] = vertices[vert].newPe;
93     }
94   }
95 }
96
97 /*@}*/
98