doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / RefineLB.C
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #include "elements.h"
7 #include "ckheap.h"
8 #include "RefineLB.h"
9
10 CreateLBFunc_Def(RefineLB, "Move objects away from overloaded processor to reach average")
11
12 RefineLB::RefineLB(const CkLBOptions &opt): CentralLB(opt)
13 {
14   lbname = (char *)"RefineLB";
15   if (CkMyPe() == 0)
16     CkPrintf("[%d] RefineLB created\n",CkMyPe());
17 }
18
19 void RefineLB::work(LDStats* stats)
20 {
21   int obj;
22   int n_pes = stats->nprocs();
23
24   //  CkPrintf("[%d] RefineLB strategy\n",CkMyPe());
25
26   // RemoveNonMigratable(stats, n_pes);
27
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];
32     from_procs[obj] = pe;
33   }
34
35   // Get a new buffer to refine into
36   int* to_procs = Refiner::AllocProcs(n_pes, stats);
37
38   Refiner refiner(1.003);  // overload tolerance=1.05
39
40   refiner.Refine(n_pes, stats, from_procs, to_procs);
41
42   // Save output
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]);
49         }
50         stats->to_proc[obj] = to_procs[obj];
51       }
52   }
53
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();
58
59     if (_lb_args.debug() > 0)
60       CkPrintf("RefineLB> Max load %lf Avg load %lf\n", stats->after_lb_max,
61           stats->after_lb_avg);
62   }
63
64   // Free the refine buffers
65   Refiner::FreeProcs(from_procs);
66   Refiner::FreeProcs(to_procs);
67 }
68
69 #include "RefineLB.def.h"
70
71 /*@}*/