]> AND Private Git Repository - loba.git/commitdiff
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Add loba_fairstrategy.
authorRaphaël Couturier <couturie@debian.iut-bm.univ-fcomte.fr>
Fri, 17 Dec 2010 13:29:17 +0000 (14:29 +0100)
committerRaphaël Couturier <couturie@debian.iut-bm.univ-fcomte.fr>
Fri, 17 Dec 2010 13:31:08 +0000 (14:31 +0100)
loba_fairstrategy.cpp [new file with mode: 0644]
loba_fairstrategy.h [new file with mode: 0644]
options.cpp

diff --git a/loba_fairstrategy.cpp b/loba_fairstrategy.cpp
new file mode 100644 (file)
index 0000000..fd710c2
--- /dev/null
@@ -0,0 +1,43 @@
+#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:
diff --git a/loba_fairstrategy.h b/loba_fairstrategy.h
new file mode 100644 (file)
index 0000000..9984c36
--- /dev/null
@@ -0,0 +1,19 @@
+#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:
index 12e1b22e28156d95faa12c9a64e650508b96305b..e41347071d8194c0d8977e251ce12f0e3d310626 100644 (file)
@@ -6,6 +6,7 @@
 #include <unistd.h>             // getopt
 #include <xbt/log.h>
 #include "loba_simple.h"
 #include <unistd.h>             // getopt
 #include <xbt/log.h>
 #include "loba_simple.h"
+#include "loba_fairstrategy.h"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main);
 
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main);
 
@@ -45,6 +46,7 @@ namespace opt {
     loba_algorithms_type loba_algorithms;
     loba_algorithms_type::loba_algorithms_type()
     {
     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);
     }
         NOL_INSERT("none", "no load-balancing (for testing)", process);
         NOL_INSERT("simple", "balance with least loaded neighbor", loba_simple);
     }