doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / RotateLB.C
1 /**************************************************************************
2 ** Greg Koenig (koenig@uiuc.edu)
3 ** November 4, 2004
4 **
5 ** This is an example Charm++ load balancer called RotateLB.  It simply
6 ** takes each object and rotates it to the next PE in the computation.
7 ** In addition to being a simple example load balancer, this load balancer
8 ** is useful because it enables checking of all PUP routines throughout a
9 ** Charm++ program.
10 */
11
12 #include "RotateLB.decl.h"
13 #include "RotateLB.h"
14
15
16 CreateLBFunc_Def (RotateLB, "Rotate each object to the next higher PE")
17
18 /**************************************************************************
19 **
20 */
21 RotateLB::RotateLB (const CkLBOptions &opt) : CentralLB (opt)
22 {
23   lbname = "RotateLB";
24
25   if (CkMyPe () == 0) {
26     CkPrintf ("[%d] RotateLB created\n", CkMyPe ());
27   }
28 }
29
30
31 /**************************************************************************
32 **
33 */
34 CmiBool RotateLB::QueryBalanceNow (int _step)
35 {
36   return CmiTrue;
37 }
38
39
40 /**************************************************************************
41 **
42 */
43 void RotateLB::work(LDStats *stats)
44 {
45   int proc;
46   int obj;
47   int dest;
48   LDObjData *odata;
49   int n_pes = stats->nprocs();
50
51   // Make sure that there is at least one available processor.
52   for (proc = 0; proc < n_pes; proc++) {
53     if (stats->procs[proc].available) {
54       break;
55     }
56   }
57   if (proc == n_pes) {
58     CmiAbort ("RotateLB: no available processors!");
59   }
60
61   // Rotate each object to the next higher processor.
62   for (obj = 0; obj < stats->n_objs; obj++) {
63     odata = &(stats->objData[obj]);
64     if (odata->migratable) {
65       dest = ((stats->from_proc[obj] + 1) % n_pes);
66       while ((!stats->procs[dest].available) &&
67              (dest != stats->from_proc[obj])) {
68         dest = ((dest + 1) % n_pes);
69       }
70       if (dest != stats->from_proc[obj]) {
71         stats->to_proc[obj] = dest;
72    //     CkPrintf ("[%d] Object %d is migrating from PE %d to PE %d\n",CkMyPe (), obj, stats->from_proc[obj], dest);
73       }
74     }
75   }
76 }
77
78
79 #include "RotateLB.def.h"