00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <algorithm>
00015
00016 #include "charm++.h"
00017
00018
00019 #include "ckgraph.h"
00020 #include "cklists.h"
00021 #include "GreedyLB.h"
00022
00023 using namespace std;
00024
00025 CreateLBFunc_Def(GreedyLB, "always assign the heaviest obj onto lightest loaded processor.")
00026
00027 GreedyLB::GreedyLB(const CkLBOptions &opt): CentralLB(opt)
00028 {
00029 lbname = "GreedyLB";
00030 if (CkMyPe()==0)
00031 CkPrintf("[%d] GreedyLB created\n",CkMyPe());
00032 }
00033
00034 CmiBool GreedyLB::QueryBalanceNow(int _step)
00035 {
00036
00037 return CmiTrue;
00038 }
00039
00040 class ProcLoadGreater {
00041 public:
00042 bool operator()(ProcInfo p1, ProcInfo p2) {
00043 return (p1.totalLoad() > p2.totalLoad());
00044 }
00045 };
00046
00047 class ObjLoadGreater {
00048 public:
00049 bool operator()(Vertex v1, Vertex v2) {
00050 return (v1.getVertexLoad() > v2.getVertexLoad());
00051 }
00052 };
00053
00054 void GreedyLB::work(LDStats* stats)
00055 {
00056 int obj, objCount, pe;
00057 int n_pes = stats->nprocs();
00058 int *map = new int[n_pes];
00059
00060 std::vector<ProcInfo> procs;
00061 for(pe = 0; pe < n_pes; pe++) {
00062 map[pe] = -1;
00063 if (stats->procs[pe].available) {
00064 map[pe] = procs.size();
00065 procs.push_back(ProcInfo(pe, stats->procs[pe].bg_walltime, 0.0, stats->procs[pe].pe_speed, true));
00066 }
00067 }
00068
00069
00070 for (obj = 0; obj < stats->n_objs; obj++)
00071 {
00072 LDObjData &oData = stats->objData[obj];
00073 if (!oData.migratable) {
00074 int pe = stats->from_proc[obj];
00075 pe = map[pe];
00076 if (pe==-1)
00077 CmiAbort("GreedyLB: nonmigratable object on an unavail processor!\n");
00078 procs[pe].totalLoad() += oData.wallTime;
00079 }
00080 }
00081 delete [] map;
00082
00083
00084 for (pe = 0; pe<procs.size(); pe++) {
00085 procs[pe].totalLoad() += procs[pe].overhead();
00086 procs[pe].totalLoad() *= procs[pe].pe_speed();
00087 }
00088
00089
00090 std::vector<Vertex> objs;
00091
00092 for(int obj = 0; obj < stats->n_objs; obj++) {
00093 LDObjData &oData = stats->objData[obj];
00094 int pe = stats->from_proc[obj];
00095 if (!oData.migratable) {
00096 if (!stats->procs[pe].available)
00097 CmiAbort("GreedyLB cannot handle nonmigratable object on an unavial processor!\n");
00098 continue;
00099 }
00100 double load = oData.wallTime * stats->procs[pe].pe_speed;
00101 objs.push_back(Vertex(obj, load, stats->objData[obj].migratable, stats->from_proc[obj]));
00102 }
00103
00104
00105 sort(objs.begin(), objs.end(), ObjLoadGreater());
00106
00107 make_heap(procs.begin(), procs.end(), ProcLoadGreater());
00108
00109 if (_lb_args.debug()>1)
00110 CkPrintf("[%d] In GreedyLB strategy\n",CkMyPe());
00111
00112
00113
00114 int nmoves = 0;
00115 for (obj=0; obj < objs.size(); obj++) {
00116 ProcInfo p = procs.front();
00117 pop_heap(procs.begin(), procs.end(), ProcLoadGreater());
00118 procs.pop_back();
00119
00120
00121
00122 p.totalLoad() += objs[obj].getVertexLoad();
00123
00124
00125 const int dest = p.getProcId();
00126 const int pe = objs[obj].getCurrentPe();
00127 const int id = objs[obj].getVertexId();
00128 if (dest != pe) {
00129 stats->to_proc[id] = dest;
00130 nmoves ++;
00131 if (_lb_args.debug()>2)
00132 CkPrintf("[%d] Obj %d migrating from %d to %d\n", CkMyPe(),objs[obj].getVertexId(),pe,dest);
00133 }
00134
00135
00136 procs.push_back(p);
00137 push_heap(procs.begin(), procs.end(), ProcLoadGreater());
00138 }
00139
00140 if (_lb_args.debug()>0)
00141 CkPrintf("[%d] %d objects migrating.\n", CkMyPe(), nmoves);
00142
00143 if (_lb_args.debug()>1) {
00144 CkPrintf("CharmLB> Min obj: %f Max obj: %f\n", objs[objs.size()-1].getVertexLoad(), objs[0].getVertexLoad());
00145 CkPrintf("CharmLB> PE speed:\n");
00146 for (pe = 0; pe<procs.size(); pe++)
00147 CkPrintf("%f ", procs[pe].pe_speed());
00148 CkPrintf("\n");
00149 CkPrintf("CharmLB> PE Load:\n");
00150 for (pe = 0; pe<procs.size(); pe++)
00151 CkPrintf("%f (%f) ", procs[pe].totalLoad(), procs[pe].overhead());
00152 CkPrintf("\n");
00153 }
00154
00155 }
00156
00157 #include "GreedyLB.def.h"
00158