doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / BlockLB.C
1
2 #include "BlockLB.decl.h"
3 #include "BlockLB.h"
4
5
6 CreateLBFunc_Def (BlockLB, "Allocate objects in blocks to the remaining valid PE")
7
8 /**************************************************************************
9 **
10 */
11 BlockLB::BlockLB (const CkLBOptions &opt) : CentralLB (opt)
12 {
13   lbname = "BlockLB";
14
15   if (CkMyPe () == 0) {
16     CkPrintf ("[%d] BlockLB created\n", CkMyPe ());
17   }
18 }
19
20
21 /**************************************************************************
22 **
23 */
24 CmiBool BlockLB::QueryBalanceNow (int _step)
25 {
26   return CmiTrue;
27 }
28
29
30 /**************************************************************************
31 **
32 */
33 void BlockLB::work (LDStats *stats)
34 {
35   int proc;
36   int obj;
37   int dest;
38   LDObjData *odata;
39
40
41   // Make sure that there is at least one available processor.
42   int validProcs=0;
43   int *mapValidToAbsolute = new int[stats->nprocs()];
44   for (proc = 0; proc < stats->nprocs(); proc++) {
45     if (stats->procs[proc].available) {
46                         mapValidToAbsolute[validProcs] = proc;
47                         validProcs++;
48     }
49   }
50   if (validProcs == 0) {
51     CmiAbort ("BlockLB: no available processors!");
52   }
53
54         int objsPerProcessor = stats->n_objs/validProcs;
55   // Rotate each object to the next higher processor.
56   for (obj = 0; obj < stats->n_objs; obj++) {
57     odata = &(stats->objData[obj]);
58                 const LDObjid& objID = odata->objID();
59     if (odata->migratable) {
60                         int idx = objID.id[0];
61                         int validDest = idx/objsPerProcessor;
62                         validDest = validDest % validProcs;
63                         dest = mapValidToAbsolute[validDest];
64                         stats->to_proc[obj] = dest;
65         //              printf("Index %d object shows up in BlockLB moved to %d\n",objID.id[0],stats->to_proc[obj]);
66     }
67   }
68
69         delete [] mapValidToAbsolute;
70 }
71
72
73 #include "BlockLB.def.h"