--- /dev/null
+#include "loba_fairstrategy.h"
+
+#include <xbt/log.h>
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
+
+/* simple version:
+ * load balance with a least-loaded neighbor,
+ * without breaking the ping-pong condition
+ */
+double loba_fairstrategy::load_balance(double my_load)
+{
+ int imin = -1;
+ int imax = -1;
+ double min = my_load;
+ double max = -1.0;
+ for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
+ double l = pneigh[i]->get_load();
+ if (l >= my_load)
+ continue;
+ if (l < min) {
+ imin = i;
+ min = l;
+ }
+ if (l > max) {
+ imax = i;
+ max = l;
+ }
+ }
+ if (imin != -1) {
+ // found someone
+ double balance = (my_load - max) / 2;
+ DEBUG6("%d:%g %d:%g %g %g", imin, min, imax, max, my_load, balance);
+ pneigh[imin]->set_to_send(balance);
+ return balance;
+ } else {
+ return 0.0;
+ }
+}
+
+// Local variables:
+// mode: c++
+// End:
--- /dev/null
+#ifndef LOBA_FAIRSTRATEGY_H
+#define LOBA_FAIRSTRATEGY_H
+
+#include "process.h"
+
+class loba_fairstrategy: public process {
+public:
+ loba_fairstrategy(int argc, char* argv[]): process(argc, argv) { }
+ ~loba_fairstrategy() { }
+
+private:
+ double load_balance(double my_load);
+};
+
+#endif //!LOBA_SIMPLE
+
+// Local variables:
+// mode: c++
+// End:
#include <unistd.h> // getopt
#include <xbt/log.h>
#include "loba_simple.h"
+#include "loba_fairstrategy.h"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main);
loba_algorithms_type loba_algorithms;
loba_algorithms_type::loba_algorithms_type()
{
+ NOL_INSERT("fairstrategy", "balance with fair strategy", loba_fairstrategy);
NOL_INSERT("none", "no load-balancing (for testing)", process);
NOL_INSERT("simple", "balance with least loaded neighbor", loba_simple);
}