87b9c890dd6faead770e1fa86d3078173fc6cdc9
[charm.git] / src / ck-ldb / RandCentLB.C
1 #include <charm++.h>
2
3 #if CMK_LBDB_ON
4
5 #if CMK_STL_USE_DOT_H
6 #include <deque.h>
7 #include <queue.h>
8 #else
9 #include <deque>
10 #include <queue>
11 #endif
12
13 #include "RandCentLB.h"
14 #include "RandCentLB.def.h"
15
16 #if CMK_STL_USE_DOT_H
17 template class deque<CentralLB::MigrateInfo>;
18 #else
19 template class std::deque<CentralLB::MigrateInfo>;
20 #endif
21
22 void CreateRandCentLB()
23 {
24   CkPrintf("[%d] creating RandCentLB %d\n",CkMyPe(),loadbalancer);
25   loadbalancer = CProxy_RandCentLB::ckNew();
26   CkPrintf("[%d] created RandCentLB %d\n",CkMyPe(),loadbalancer);
27 }
28
29 RandCentLB::RandCentLB()
30 {
31   CkPrintf("[%d] RandCentLB created\n",CkMyPe());
32 }
33
34 CmiBool RandCentLB::QueryBalanceNow(int _step)
35 {
36   CkPrintf("[%d] Balancing on step %d\n",CkMyPe(),_step);
37   return CmiTrue;
38 }
39
40 CLBMigrateMsg* RandCentLB::Strategy(CentralLB::LDStats* stats, int count)
41 {
42   CkPrintf("[%d] RandCentLB strategy\n",CkMyPe());
43
44 #if CMK_STL_USE_DOT_H
45   queue<MigrateInfo> migrateInfo;
46 #else
47   std::queue<MigrateInfo> migrateInfo;
48 #endif
49
50   for(int pe=0; pe < count; pe++) {
51     CkPrintf("[%d] PE %d : %d Objects : %d Communication\n",
52              CkMyPe(),pe,stats[pe].n_objs,stats[pe].n_comm);
53     for(int obj=0; obj < stats[pe].n_objs; obj++) {
54       const int dest = static_cast<int>(drand48()*(CmiNumPes()-1) + 0.5);
55       if (dest != pe) {
56         CkPrintf("[%d] Obj %d migrating from %d to %d\n",
57                  CkMyPe(),obj,pe,dest);
58         MigrateInfo migrateMe;
59         migrateMe.obj = stats[pe].objData[obj].handle;
60         migrateMe.from_pe = pe;
61         migrateMe.to_pe = dest;
62         migrateInfo.push(migrateMe);
63       }
64     }
65   }
66
67   int migrate_count=migrateInfo.size();
68   CLBMigrateMsg* msg = new(&migrate_count,1) CLBMigrateMsg;
69   msg->n_moves = migrate_count;
70   for(int i=0; i < migrate_count; i++) {
71     msg->moves[i] = migrateInfo.front();
72     migrateInfo.pop();
73   }
74
75   return msg;
76 };
77
78 #endif