From: couturie Date: Thu, 8 Sep 2011 20:47:46 +0000 (+0200) Subject: Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/loba X-Git-Tag: v0.1~13 X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/6d4c5d60667c9b096a969e8a438c6fd4d8484cd1?hp=cb0554d856608cef6bf4c6d92f9b26f203cc97a8 Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/loba --- diff --git a/deployment.cpp b/deployment.cpp index 264224c..f34c3a9 100644 --- a/deployment.cpp +++ b/deployment.cpp @@ -70,16 +70,17 @@ void deployment_generator::distribute_load() unsigned i; for (i = 0 ; i < hosts.size() - 1; ++i) { if (residue < 0.0) - iload = floor(loads[i]); + iload = std::floor(loads[i]); else if (residue > 0.0) - iload = ceil(loads[i]); + iload = std::ceil(loads[i]); else // residue == 0.0 - iload = round(loads[i]); + iload = std::round(loads[i]); residue += (loads[i] - iload); loads[i] = iload; } // abs(round(...)) to avoid rounding errors, or a value of -0 - iload = abs(round(loads[i] + residue)); // i == hosts.size() - 1 + // Note: i == hosts.size() - 1 + iload = std::abs(std::round(loads[i] + residue)); loads[i] = iload; // final sanity check xbt_assert(opt::auto_depl::load == @@ -181,7 +182,7 @@ void deployment_torus::generate() b = c; } unsigned width = b; - // here width == ceil(sqrt(size)) + // here width == std::ceil(std::sqrt(size)) unsigned first_on_last_line = (size() - 1) - (size() - 1) % width; XBT_DEBUG("torus size = %zu ; width = %u ; height = %zu ; foll = %u", diff --git a/loba_bulk.cpp b/loba_bulk.cpp index 0821eda..de9c099 100644 --- a/loba_bulk.cpp +++ b/loba_bulk.cpp @@ -7,81 +7,88 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); 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] = std::floor(alpha * (myLoad - minLoad)); + myS += S[i]; + } else { + if (pneigh[i]->get_load() < myLoad) { + S[i] = std::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: diff --git a/loba_lln.cpp b/loba_lln.cpp index 35acb26..0422b38 100644 --- a/loba_lln.cpp +++ b/loba_lln.cpp @@ -7,32 +7,34 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); void loba_lln::load_balance() { - std::vector listLessLoadedNeighbors; - unsigned i; - double myLoad = get_load(); - unsigned size = pneigh.size(); - double *S = new double[size]; - double lessLoad = get_load(); + std::vector 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;iget_load()< lessLoad ) - listLessLoadedNeighbors.push_back(i); - } - int nbLessLoadedNeighbors=listLessLoadedNeighbors.size(); - for( i=0; iget_load())/(nbLessLoadedNeighbors+1); - if(myLoad-delta > pneigh[listLessLoadedNeighbors[i]]->get_load()) { - S[i]=delta; - myLoad-=delta; - } - } - for(i=0; iget_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: diff --git a/main.cpp b/main.cpp index 71eefb9..478d1e8 100644 --- a/main.cpp +++ b/main.cpp @@ -252,7 +252,7 @@ int main(int argc, char* argv[]) } else if (opt::auto_depl::load < 0.0) opt::auto_depl::load = -opt::auto_depl::load * opt::auto_depl::nhosts; - double iload = trunc(opt::auto_depl::load); + double iload = std::trunc(opt::auto_depl::load); if (opt::integer_transfer && opt::auto_depl::load != iload) { XBT_WARN("Total load %g is not an integer. Truncate it.", opt::auto_depl::load); diff --git a/messages.cpp b/messages.cpp index c542596..2d5de94 100644 --- a/messages.cpp +++ b/messages.cpp @@ -36,7 +36,7 @@ std::string message::to_string() oss << "; " << credit << " (credit)"; break; case DATA: - oss << "DATA: " << amount << " (load)"; + oss << "DATA: " << amount << " (load)"; break; case CTRL_CLOSE: oss << "CTRL_CLOSE"; diff --git a/process.cpp b/process.cpp index 04c08c0..0f7380c 100644 --- a/process.cpp +++ b/process.cpp @@ -37,7 +37,7 @@ process::process(int argc, char* argv[]) if (argc < 2 || !(std::istringstream(argv[1]) >> real_load)) throw std::invalid_argument("bad or missing initial load parameter"); - double iload = trunc(real_load); + double iload = std::trunc(real_load); if (opt::integer_transfer && real_load != iload) { XBT_WARN("Initial load %g is not an integer. Truncate it.", real_load); diff --git a/statistics.h b/statistics.h index 7e3fb2e..28aa913 100644 --- a/statistics.h +++ b/statistics.h @@ -25,7 +25,7 @@ public: double get_sum() const { return sum; } double get_mean() const { return mean; } double get_variance() const { return sqdiff_sum / count; } - double get_stddev() const { return sqrt(get_variance()); } + double get_stddev() const { return std::sqrt(get_variance()); } private: int count;