00001
00005
00006 #include "PhasebyArrayLB.h"
00007
00008 extern LBAllocFn getLBAllocFn(char *lbname);
00009
00010 CreateLBFunc_Def(PhasebyArrayLB, "Load balancer which balances many arrays together, specifically for CPAIMD")
00011
00012 #include "PhasebyArrayLB.def.h"
00013
00014 PhasebyArrayLB::PhasebyArrayLB(const CkLBOptions &opt): CentralLB(opt)
00015 {
00016 lbname = (char*)"PhasebyArrayLB";
00017 if (CkMyPe() == 0)
00018 CkPrintf("[%d] PhasebyArrayLB created\n",CkMyPe());
00019
00020 const char *lbs = theLbdb->loadbalancer(opt.getSeqNo());
00021
00022 char *lbcopy = strdup(lbs);
00023 char *p = strchr(lbcopy, ':');
00024 if (p==NULL) return;
00025 p++;
00026 LBAllocFn fn = getLBAllocFn(p);
00027 if (fn == NULL) {
00028 CkPrintf("LB> Invalid load balancer: %s.\n", p);
00029 CmiAbort("");
00030 }
00031 lb = (CentralLB *)fn();
00032 }
00033
00034 CmiBool PhasebyArrayLB::QueryBalanceNow(int _step)
00035 {
00036 return CmiTrue;
00037 }
00038
00039 void PhasebyArrayLB::copyStats(BaseLB::LDStats *stats,BaseLB::LDStats *tempStats){
00040 int i;
00041 tempStats->nprocs() = stats->nprocs();
00042 tempStats->n_objs = stats->n_objs;
00043 tempStats->n_comm = stats->n_comm;
00044 tempStats->n_migrateobjs = stats->n_migrateobjs;
00045 tempStats->hashSize = stats->hashSize;
00046 if(tempStats->hashSize && stats->objHash!=NULL){
00047 tempStats->objHash = new int[tempStats->hashSize];
00048 for(int i=0;i<tempStats->hashSize;i++)
00049 tempStats->objHash[i]=stats->objHash[i];
00050 }
00051 else
00052 tempStats->objHash=NULL;
00053 tempStats->objData.resize(tempStats->n_objs);
00054 tempStats->from_proc.resize(tempStats->n_objs);
00055 tempStats->to_proc.resize(tempStats->n_objs);
00056 tempStats->commData.resize(tempStats->n_comm);
00057 for(i=0;i<tempStats->n_objs;i++){
00058 tempStats->objData[i]=stats->objData[i];
00059 tempStats->from_proc[i]=stats->from_proc[i];
00060 tempStats->to_proc[i]=stats->to_proc[i];
00061 }
00062 for(i=0;i<tempStats->n_comm;i++)
00063 tempStats->commData[i]=stats->commData[i];
00064
00065 tempStats->procs = new BaseLB::ProcStats[tempStats->nprocs()];
00066 for(i=0; i<tempStats->nprocs(); i++)
00067 tempStats->procs[i]=stats->procs[i];
00068 }
00069
00070 void PhasebyArrayLB::updateStats(BaseLB::LDStats *stats,BaseLB::LDStats *tempStats){
00071 tempStats->hashSize = stats->hashSize;
00072 if(tempStats->hashSize && stats->objHash!=NULL){
00073 tempStats->objHash = new int[tempStats->hashSize];
00074 for(int i=0;i<tempStats->hashSize;i++)
00075 tempStats->objHash[i]=stats->objHash[i];
00076 }
00077 else
00078 tempStats->objHash=NULL;
00079
00080 for(int i=0;i<tempStats->n_objs;i++)
00081 tempStats->objData[i]=stats->objData[i];
00082
00083 }
00084
00085 void PhasebyArrayLB::work(LDStats *stats){
00086
00087 tempStats = new BaseLB::LDStats;
00088
00089 copyStats(stats,tempStats);
00090 int obj, i;
00091 int flag=0;
00092 LDObjData *odata;
00093
00094
00095 odata = &(tempStats->objData[0]);
00096 omids.push_back(odata->omID());
00097 if(odata->migratable)
00098 migratableOMs.push_back(CmiTrue);
00099 else
00100 migratableOMs.push_back(CmiFalse);
00101
00102 for(i=0;i<tempStats->n_objs; i++){
00103 odata = &(tempStats->objData[i]);
00104 for(int j=0;j<omids.size();j++)
00105 if(odata->omID()==omids[j]){
00106 flag=1;
00107 break;
00108 }
00109
00110 if(flag==1){
00111 flag=0;
00112 }
00113 else{
00114 omids.push_back(odata->omID());
00115 if(odata->migratable)
00116 migratableOMs.push_back(CmiTrue);
00117 else
00118 migratableOMs.push_back(CmiFalse);
00119 }
00120 }
00121
00122 for(i=0;i<omids.size();i++){
00123
00124 LDOMid omid = omids[i];
00125
00126 if(migratableOMs[i]){
00127 for (obj = 0; obj < tempStats->n_objs; obj++) {
00128 odata = &(tempStats->objData[obj]);
00129 if (odata->omID() != omid)
00130 odata->migratable=CmiFalse;
00131 }
00132
00133 lb->work(tempStats);
00134 if(i!=omids.size()-1){
00135 for(obj = 0; obj < tempStats->n_objs; obj++)
00136 tempStats->from_proc[obj]=tempStats->to_proc[obj];
00137 updateStats(stats,tempStats);
00138 }
00139 }
00140 }
00141
00142 for(obj = 0; obj < tempStats->n_objs; obj++)
00143 stats->to_proc[obj]=tempStats->to_proc[obj];
00144 tempStats->clear();
00145 omids.free();
00146 migratableOMs.free();
00147 }
00148