10 CreateLBFunc_Def(RefineLB, "Move objects away from overloaded processor to reach average")
12 RefineLB::RefineLB(const CkLBOptions &opt): CBase_RefineLB(opt)
14 lbname = (char *)"RefineLB";
16 CkPrintf("[%d] RefineLB created\n",CkMyPe());
19 void RefineLB::work(LDStats* stats)
22 int n_pes = stats->nprocs();
24 // CkPrintf("[%d] RefineLB strategy\n",CkMyPe());
26 // RemoveNonMigratable(stats, n_pes);
28 // get original object mapping
29 int* from_procs = Refiner::AllocProcs(n_pes, stats);
30 for(obj=0;obj<stats->n_objs;obj++) {
31 int pe = stats->from_proc[obj];
35 // Get a new buffer to refine into
36 int* to_procs = Refiner::AllocProcs(n_pes, stats);
38 Refiner refiner(1.05); // overload tolerance=1.05
40 refiner.Refine(n_pes, stats, from_procs, to_procs);
43 for(obj=0;obj<stats->n_objs;obj++) {
44 int pe = stats->from_proc[obj];
45 if (to_procs[obj] != pe) {
46 if (_lb_args.debug()>=2) {
47 CkPrintf("[%d] Obj %d migrating from %d to %d\n",
48 CkMyPe(),obj,pe,to_procs[obj]);
50 stats->to_proc[obj] = to_procs[obj];
54 if (_lb_args.metaLbOn()) {
55 stats->is_prev_lb_refine = 1;
56 stats->after_lb_avg = refiner.computeAverageLoad();
57 stats->after_lb_max = refiner.computeMax();
59 if (_lb_args.debug() > 0)
60 CkPrintf("RefineLB> Max load %lf Avg load %lf\n", stats->after_lb_max,
64 // Free the refine buffers
65 Refiner::FreeProcs(from_procs);
66 Refiner::FreeProcs(to_procs);
69 #include "RefineLB.def.h"