doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / TempAwareGreedyLB.C
1 /** \file TempAwareGreedyLB.C
2  *
3  *  Written by Gengbin Zheng
4  *  Updated by Abhinav Bhatele, 2010-12-09 to use ckgraph
5  *
6  *  Status:
7  *    -- Does not support pe_speed's currently
8  *    -- Does not support nonmigratable attribute
9  */
10
11 /**
12  * \addtogroup CkLdb
13 */
14 /*@{*/
15
16 #include "TempAwareGreedyLB.h"
17 #include "ckgraph.h"
18 #include <algorithm>
19
20 CreateLBFunc_Def(TempAwareGreedyLB, "always assign the heaviest obj onto lightest loaded processor.")
21
22 TempAwareGreedyLB::TempAwareGreedyLB(const CkLBOptions &opt): CentralLB(opt)
23 {
24   lbname = "TempAwareGreedyLB";
25   if (CkMyPe()==0)
26     CkPrintf("[%d] TempAwareGreedyLB created\n",CkMyPe());
27 }
28
29 CmiBool TempAwareGreedyLB::QueryBalanceNow(int _step)
30 {
31   //  CkPrintf("[%d] Balancing on step %d\n",CkMyPe(),_step);
32   return CmiTrue;
33 }
34
35 class ProcLoadGreater {
36   public:
37     bool operator()(ProcInfo p1, ProcInfo p2) {
38       return (p1.getTotalLoad() > p2.getTotalLoad());
39     }
40 };
41
42 class ObjLoadGreater {
43   public:
44     bool operator()(Vertex v1, Vertex v2) {
45       return (v1.getVertexLoad() > v2.getVertexLoad());
46     }
47 };
48
49 void TempAwareGreedyLB::work(LDStats* stats)
50 {
51 CkPrintf("----------------- in TempAwareGreedyLB -----------\n");
52   /** ========================== INITIALIZATION ============================= */
53   ProcArray *parr = new ProcArray(stats);       // Processor Array
54   ObjGraph *ogr = new ObjGraph(stats);          // Object Graph
55
56   /** ============================= STRATEGY ================================ */
57   parr->resetTotalLoad();
58
59   if (_lb_args.debug()>1) 
60     CkPrintf("[%d] In TempAwareGreedyLB strategy\n",CkMyPe());
61
62   int vert;
63
64   // max heap of objects
65   std::sort(ogr->vertices.begin(), ogr->vertices.end(), ObjLoadGreater());
66   // min heap of processors
67   std::make_heap(parr->procs.begin(), parr->procs.end(), ProcLoadGreater());
68
69   for(vert = 0; vert < ogr->vertices.size(); vert++) {
70     // Pop the least loaded processor
71     ProcInfo p = parr->procs.front();
72     std::pop_heap(parr->procs.begin(), parr->procs.end(), ProcLoadGreater());
73     parr->procs.pop_back();
74
75     // Increment the load of the least loaded processor by the load of the
76     // 'heaviest' unmapped object
77     p.setTotalLoad(p.getTotalLoad() + ogr->vertices[vert].getVertexLoad());
78     ogr->vertices[vert].setNewPe(p.getProcId());
79
80     // Insert the least loaded processor with load updated back into the heap
81     parr->procs.push_back(p);
82     std::push_heap(parr->procs.begin(), parr->procs.end(), ProcLoadGreater());
83   }
84
85   /** ============================== CLEANUP ================================ */
86   ogr->convertDecisions(stats);         // Send decisions back to LDStats
87 }
88
89 #include "TempAwareGreedyLB.def.h"
90
91 /*@}*/
92