void Refiner::Refine(int count, BaseLB::LDStats* stats, int* cur_p, int* new_p) { // CkPrintf("[%d] Refiner strategy\n",CkMyPe()); P = count; numComputes = stats->n_objs; computes = new computeInfo[numComputes]; processors = new processorInfo[count]; create(count, stats, cur_p); int i; for (i=0; i<numComputes; i++) assign((computeInfo *) &(computes[i]), (processorInfo *) &(processors[computes[i].oldProcessor])); removeComputes(); computeAverage(); if (_lb_args.debug()>2) { CkPrintf("Old PE load (bg load): "); for (i=0; i<count; i++) CkPrintf("%d:%f(%f) ", i, processors[i].load, processors[i].backgroundLoad); CkPrintf("\n"); } // Perform multi refine but reset it to the original state before changing the // refinement load balancing threshold. multirefine(true); int nmoves = 0; for (int pe=0; pe < P; pe++) { Iterator nextCompute; nextCompute.id = 0; computeInfo *c = (computeInfo *) processors[pe].computeSet->iterator((Iterator *)&nextCompute); while(c) { new_p[c->Id] = c->processor; if (new_p[c->Id] != cur_p[c->Id]) nmoves++; // if (c->oldProcessor != c->processor) // CkPrintf("Refiner::Refine: from %d to %d\n", c->oldProcessor, c->processor); nextCompute.id++; c = (computeInfo *) processors[pe].computeSet-> next((Iterator *)&nextCompute); } } if (_lb_args.debug()>2) { CkPrintf("New PE load: "); for (i=0; i<count; i++) CkPrintf("%f ", processors[i].load); CkPrintf("\n"); } if (_lb_args.debug()>1) CkPrintf("Refiner: moving %d obejcts. \n", nmoves); delete [] computes; delete [] processors; }
void RefinerTemp::Refine(int count, BaseLB::LDStats* stats, int* cur_p, int* new_p) { #ifdef TEMP_LDB // CkPrintf("[%d] RefinerTemp strategy\n",CkMyPe()); P = count; numComputes = stats->n_objs; computes = new computeInfo[numComputes]; processors = new processorInfo[count]; create(count, stats, cur_p); int i; for (i=0; i<numComputes; i++) { int ind1 = computes[i].id.getID()[0]; int ind2 = computes[i].id.getID()[1]; if(ind1==0 && ind2==48) CkPrintf("----- assigning oldproc%d load:%f\n",computes[i].oldProcessor,computes[i].load); assign((computeInfo *) &(computes[i]), (processorInfo *) &(processors[computes[i].oldProcessor])); } removeComputes(); computeAverage(); if (_lb_args.debug()>2) { CkPrintf("Old PE load (bg load): "); for (i=0; i<count; i++) CkPrintf("%d:%f(%f) ", i, processors[i].load, processors[i].backgroundLoad); CkPrintf("\n"); } multirefine(); int nmoves = 0; for (int pe=0; pe < P; pe++) { Iterator nextCompute; nextCompute.id = 0; computeInfo *c = (computeInfo *) processors[pe].computeSet->iterator((Iterator *)&nextCompute); while(c) { new_p[c->Id] = c->processor; if (new_p[c->Id] != cur_p[c->Id]) nmoves++; // if (c->oldProcessor != c->processor) // CkPrintf("RefinerTemp::Refine: from %d to %d\n", c->oldProcessor, c->processor); nextCompute.id++; c = (computeInfo *) processors[pe].computeSet-> next((Iterator *)&nextCompute); } } if (_lb_args.debug()>2) { CkPrintf("New PE load: "); for (i=0; i<count; i++) CkPrintf("%f ", processors[i].load); CkPrintf("\n"); } if (_lb_args.debug()>1) CkPrintf("RefinerTemp: moving %d obejcts. \n", nmoves); delete [] computes; delete [] processors; #endif }