doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / PhasebyArrayLB.C
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #include "PhasebyArrayLB.h"
7
8 extern LBAllocFn getLBAllocFn(char *lbname);
9
10 CreateLBFunc_Def(PhasebyArrayLB, "Load balancer which balances many arrays together, specifically for CPAIMD")
11
12 #include "PhasebyArrayLB.def.h"
13
14 PhasebyArrayLB::PhasebyArrayLB(const CkLBOptions &opt): CentralLB(opt)
15 {
16   lbname = (char*)"PhasebyArrayLB";
17   if (CkMyPe() == 0)
18     CkPrintf("[%d] PhasebyArrayLB created\n",CkMyPe());
19
20   const char *lbs = theLbdb->loadbalancer(opt.getSeqNo());
21   
22   char *lbcopy = strdup(lbs);
23   char *p = strchr(lbcopy, ':');
24   if (p==NULL) return;
25   p++;
26   LBAllocFn fn = getLBAllocFn(p);
27   if (fn == NULL) {
28         CkPrintf("LB> Invalid load balancer: %s.\n", p);
29         CmiAbort("");
30   }
31   lb = (CentralLB *)fn();
32 }
33
34 CmiBool PhasebyArrayLB::QueryBalanceNow(int _step)
35 {
36   return CmiTrue;
37 }
38
39 void PhasebyArrayLB::copyStats(BaseLB::LDStats *stats,BaseLB::LDStats *tempStats){
40         int i;
41         tempStats->nprocs() = stats->nprocs();
42         tempStats->n_objs = stats->n_objs;
43         tempStats->n_comm = stats->n_comm;
44         tempStats->n_migrateobjs = stats->n_migrateobjs;
45         tempStats->hashSize = stats->hashSize;
46         if(tempStats->hashSize && stats->objHash!=NULL){
47                 tempStats->objHash = new int[tempStats->hashSize];
48                 for(int i=0;i<tempStats->hashSize;i++)
49                         tempStats->objHash[i]=stats->objHash[i];
50         }
51         else
52                 tempStats->objHash=NULL;
53         tempStats->objData.resize(tempStats->n_objs);
54         tempStats->from_proc.resize(tempStats->n_objs);
55         tempStats->to_proc.resize(tempStats->n_objs);
56         tempStats->commData.resize(tempStats->n_comm);
57         for(i=0;i<tempStats->n_objs;i++){
58                 tempStats->objData[i]=stats->objData[i];
59                 tempStats->from_proc[i]=stats->from_proc[i];
60                 tempStats->to_proc[i]=stats->to_proc[i];
61         }
62         for(i=0;i<tempStats->n_comm;i++)
63                 tempStats->commData[i]=stats->commData[i];
64         
65         tempStats->procs = new BaseLB::ProcStats[tempStats->nprocs()];
66         for(i=0; i<tempStats->nprocs(); i++)
67                 tempStats->procs[i]=stats->procs[i];
68 }
69
70 void PhasebyArrayLB::updateStats(BaseLB::LDStats *stats,BaseLB::LDStats *tempStats){
71         tempStats->hashSize = stats->hashSize;
72         if(tempStats->hashSize && stats->objHash!=NULL){
73                 tempStats->objHash = new int[tempStats->hashSize];
74                 for(int i=0;i<tempStats->hashSize;i++)
75                         tempStats->objHash[i]=stats->objHash[i];
76         }
77         else
78                 tempStats->objHash=NULL;
79
80         for(int i=0;i<tempStats->n_objs;i++)
81                 tempStats->objData[i]=stats->objData[i];
82         
83 }
84
85 void PhasebyArrayLB::work(LDStats *stats){
86         //It is assumed that statically placed arrays are set non-migratable in the application
87         tempStats = new BaseLB::LDStats;
88
89         copyStats(stats,tempStats);
90         int obj, i;
91         int flag=0;
92         LDObjData *odata;
93         
94         
95         odata = &(tempStats->objData[0]);
96         omids.push_back(odata->omID());
97         if(odata->migratable)
98                 migratableOMs.push_back(CmiTrue);
99         else
100                 migratableOMs.push_back(CmiFalse);
101
102         for(i=0;i<tempStats->n_objs; i++){
103                 odata = &(tempStats->objData[i]);
104                 for(int j=0;j<omids.size();j++)
105                         if(odata->omID()==omids[j]){
106                                 flag=1;
107                                 break;
108                         }
109                 
110                 if(flag==1){
111                         flag=0;
112                 }
113                 else{
114                         omids.push_back(odata->omID());
115                         if(odata->migratable)
116                                 migratableOMs.push_back(CmiTrue);
117                         else
118                                 migratableOMs.push_back(CmiFalse);
119                 }
120         }
121         
122         for(i=0;i<omids.size();i++){
123                 //copy to_proc from previous iteration to from_proc for this iteration
124                 LDOMid  omid = omids[i];
125                 //Set other objects as background load
126                 if(migratableOMs[i]){
127                         for (obj = 0; obj < tempStats->n_objs; obj++) {
128                         odata = &(tempStats->objData[obj]);
129                         if (odata->omID() != omid)
130                                         odata->migratable=CmiFalse;
131                         }
132                         //Call a strategy here
133                         lb->work(tempStats);
134                         if(i!=omids.size()-1){
135                                 for(obj = 0; obj < tempStats->n_objs; obj++)
136                                         tempStats->from_proc[obj]=tempStats->to_proc[obj];
137                                 updateStats(stats,tempStats);
138                         }
139                 }
140         }
141         //Copy to stats array
142         for(obj = 0; obj < tempStats->n_objs; obj++)
143                 stats->to_proc[obj]=tempStats->to_proc[obj];
144         tempStats->clear();
145         omids.free();
146         migratableOMs.free();
147 }
148
149 /*@}*/