DESCRIPTIONS DES ALGORITHMES D'ÉQUILIBRAGE
+2besteffort
+===========
+Calcule la moyenne des charges des voisins et de soi-même.
+Ordonne ensuite les voisins du moins chargé au plus chargé, et
+effectue les transferts en prenant les voisins dans cet ordre. Les
+transferts de charge sont faits en visant cette moyenne pour tous les
+voisins. On envoie une quantité de charge égale à
+ min(moyenne - charge_du_voisin, charge_propre - moyenne),
+tant que cette quantité est positive.
+
+NB: Ceci est une variante de besteffort, la différence étant la
+ moyenne visée.
+
+
besteffort
==========
Ordonne les voisins du moins chargé au plus chargé.
--- /dev/null
+#include <cmath> // std::isfinite
+#include <functional>
+#include <numeric>
+#include <xbt/log.h>
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
+
+#include "loba_2besteffort.h"
+
+void loba_2besteffort::load_balance()
+{
+ using std::placeholders::_1;
+ using std::placeholders::_2;
+
+ pneigh_sort_by_load(std::less<double>());
+ print_loads_p(false, xbt_log_priority_debug);
+
+ double sum = get_load() +
+ std::accumulate(pneigh.begin(), pneigh.end(), 0.0,
+ std::bind(std::plus<double>(), _1,
+ std::bind(&neighbor::get_load, _2)));
+ double mean = sum / (pneigh.size() + 1);
+ XBT_DEBUG("sum = %g ; mean = %g", sum, mean);
+
+ if (!std::isfinite(mean))
+ return;
+
+ for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
+ double transfer = std::min(mean - pneigh[i]->get_load(),
+ get_load() - mean);
+ // don't continue if get_load() <= mean, or pneigh[i]->get_load >= mean
+ if (transfer <= 0.0)
+ break;
+ send(pneigh[i], transfer);
+ XBT_DEBUG("sent %g to %s", transfer, pneigh[i]->get_name());
+ }
+}
+
+// Local variables:
+// mode: c++
+// End:
--- /dev/null
+#ifndef LOBA_2BESTEFFORT_H
+#define LOBA_2BESTEFFORT_H
+
+#include "process.h"
+
+class loba_2besteffort: public process {
+public:
+ loba_2besteffort(int argc, char* argv[]): process(argc, argv) { }
+ ~loba_2besteffort() { }
+
+private:
+ void load_balance();
+};
+
+#endif //!LOBA_2BESTEFFORT_H
+
+// Local variables:
+// mode: c++
+// End:
#include "deployment.h"
#include "process.h"
+#include "loba_2besteffort.h"
#include "loba_besteffort.h"
#include "loba_bulk.h"
#include "loba_fairstrategy.h"
loba_algorithms_type loba_algorithms;
loba_algorithms_type::loba_algorithms_type()
{
+ NOL_INSERT("2besteffort", "balance with best effort strategy (take #2)",
+ loba_2besteffort);
NOL_INSERT("besteffort", "balance with best effort strategy",
loba_besteffort);
NOL_INSERT("bulk", "A multi-load-units assignation rule without ordering...",