void loba_bulk::load_balance()
{
- float myLoad = get_load();
+ float myLoad = get_load();
- unsigned NbNwMinLoad = 0;
- unsigned NbNwLowerLoad = 0;
- unsigned NbNeighbours = pneigh.size();
+ unsigned NbNwMinLoad = 0;
+ unsigned NbNwLowerLoad = 0;
+ unsigned NbNeighbours = pneigh.size();
- double *S = new double[NbNeighbours];
- for (unsigned i = 0; i < NbNeighbours; i++)
- S[i] = 0.0;
- //What is the minimum and maximum load under myLoad?
- float minLoad = myLoad;
- for (unsigned i = 0; i < NbNeighbours; i++) {
- if (pneigh[i]->get_load() < minLoad) {
- minLoad = pneigh[i]->get_load();
- }
- if (pneigh[i]->get_load() < myLoad) {
- NbNwLowerLoad++;
- }
- }
- for (unsigned i = 0; i < NbNeighbours; i++)
- if (pneigh[i]->get_load() == minLoad)
- NbNwMinLoad++;
+ double *S = new double[NbNeighbours];
+ for (unsigned i = 0; i < NbNeighbours; i++)
+ S[i] = 0.0;
- float maxLoad = minLoad;
- for (unsigned i = 0; i < NbNeighbours; i++) {
- if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad)
- if (maxLoad < pneigh[i]->get_load())
- maxLoad = pneigh[i]->get_load();
- }
+ // What is the minimum and maximum load under myLoad?
+ float minLoad = myLoad;
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ if (pneigh[i]->get_load() < minLoad) {
+ minLoad = pneigh[i]->get_load();
+ }
+ if (pneigh[i]->get_load() < myLoad) {
+ NbNwLowerLoad++;
+ }
+ }
+ for (unsigned i = 0; i < NbNeighbours; i++)
+ if (pneigh[i]->get_load() == minLoad)
+ NbNwMinLoad++;
+
+ float maxLoad = minLoad;
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad)
+ if (maxLoad < pneigh[i]->get_load())
+ maxLoad = pneigh[i]->get_load();
+ }
- double alpha = 0.0;
+ double alpha = 0.0;
- if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) //There is one or many neighbors with minimum load but not all neighbors have minimum load
- alpha = (1. / ((double) NbNwMinLoad + 2));
- if (NbNwMinLoad == NbNwLowerLoad) //All neighbors have minimum load
- alpha = (1. / ((double) NbNwMinLoad + 1));
- float myS = 0.;
- //There exist underloaded neighbors
- if (NbNwMinLoad && myLoad != 0.0) {
- for (unsigned i = 0; i < NbNeighbours; i++) {
- if (pneigh[i]->get_load() == minLoad) {
- S[i] = floor(alpha * (myLoad - minLoad));
- myS += S[i];
- } else {
- if (pneigh[i]->get_load() < myLoad) {
- S[i] = floor(alpha * (myLoad - pneigh[i]->get_load()));
- myS += S[i];
- }
- }
- }
- //Check assumption 4.2 (b) page 520
- bool HaveToCorrectS = false;
- for (unsigned i = 0; i < NbNeighbours; i++) {
- if (pneigh[i]->get_load() < myLoad) { //
- //Condition 4.6
- if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) {
- HaveToCorrectS = true;
- }
- }
- }
- if (HaveToCorrectS) {
- for (unsigned i = 0; i < NbNeighbours; i++) {
- while (((myLoad - myS) < pneigh[i]->get_load() + S[i]) && (S[i] > 0)) {
- myS -= 1.0;
- S[i] -= 1.0;
- }
- }
- }
- }//End there are underloaded neighbors;
- for (unsigned i = 0 ; i < NbNeighbours ; i++) {
- send(pneigh[i], S[i]);
- XBT_DEBUG("sent to %s", pneigh[i]->get_name());
+ if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) {
+ // There is one or many neighbors with minimum load but not
+ // all neighbors have minimum load
+ alpha = (1. / ((double) NbNwMinLoad + 2));
+ }
+ if (NbNwMinLoad == NbNwLowerLoad) {
+ // All neighbors have minimum load
+ alpha = (1. / ((double) NbNwMinLoad + 1));
+ }
+ float myS = 0.;
+ // There exist underloaded neighbors
+ if (NbNwMinLoad && myLoad != 0.0) {
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ if (pneigh[i]->get_load() == minLoad) {
+ S[i] = floor(alpha * (myLoad - minLoad));
+ myS += S[i];
+ } else {
+ if (pneigh[i]->get_load() < myLoad) {
+ S[i] = floor(alpha * (myLoad - pneigh[i]->get_load()));
+ myS += S[i];
+ }
+ }
+ }
+ // Check assumption 4.2 (b) page 520
+ bool HaveToCorrectS = false;
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ if (pneigh[i]->get_load() < myLoad) {
+ // Condition 4.6
+ if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) {
+ HaveToCorrectS = true;
+ }
+ }
+ }
+ if (HaveToCorrectS) {
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ while (((myLoad - myS) < pneigh[i]->get_load() + S[i])
+ && (S[i] > 0)) {
+ myS -= 1.0;
+ S[i] -= 1.0;
+ }
+ }
}
+ } // End there are underloaded neighbors;
+ for (unsigned i = 0; i < NbNeighbours; i++) {
+ send(pneigh[i], S[i]);
+ XBT_DEBUG("sent to %s", pneigh[i]->get_name());
+ }
- delete[] S;
+ delete[] S;
}
// Local variables:
void loba_lln::load_balance()
{
- std::vector<int> listLessLoadedNeighbors;
- unsigned i;
- double myLoad = get_load();
- unsigned size = pneigh.size();
- double *S = new double[size];
- double lessLoad = get_load();
+ std::vector<int> listLessLoadedNeighbors;
+ unsigned i;
+ double myLoad = get_load();
+ unsigned size = pneigh.size();
+ double *S = new double[size];
+ double lessLoad = get_load();
- listLessLoadedNeighbors.clear();
- for(i=0;i<size;++i) {
- S[i]=0.0;
- if( pneigh[i]->get_load()< lessLoad )
- listLessLoadedNeighbors.push_back(i);
- }
- int nbLessLoadedNeighbors=listLessLoadedNeighbors.size();
- for( i=0; i<listLessLoadedNeighbors.size(); ++i) {
- double delta = (myLoad-pneigh[listLessLoadedNeighbors[i]]->get_load())/(nbLessLoadedNeighbors+1);
- if(myLoad-delta > pneigh[listLessLoadedNeighbors[i]]->get_load()) {
- S[i]=delta;
- myLoad-=delta;
- }
- }
- for(i=0; i<size; ++i) {
- send(pneigh[i], S[i]);
- XBT_DEBUG("sent to %s", pneigh[i]->get_name());
- }
- delete[] S;
+ listLessLoadedNeighbors.clear();
+ for (i = 0; i < size; ++i) {
+ S[i] = 0.0;
+ if (pneigh[i]->get_load() < lessLoad)
+ listLessLoadedNeighbors.push_back(i);
+ }
+ int nbLessLoadedNeighbors = listLessLoadedNeighbors.size();
+ for (i = 0; i < listLessLoadedNeighbors.size(); ++i) {
+ double delta =
+ (myLoad - pneigh[listLessLoadedNeighbors[i]]->get_load()) /
+ (nbLessLoadedNeighbors + 1);
+ if (myLoad - delta > pneigh[listLessLoadedNeighbors[i]]->get_load()) {
+ S[i] = delta;
+ myLoad -= delta;
+ }
+ }
+ for (i = 0; i < size; ++i) {
+ send(pneigh[i], S[i]);
+ XBT_DEBUG("sent to %s", pneigh[i]->get_name());
+ }
+ delete[] S;
}
// Local variables: