From: Raphaƫl Couturier Date: Fri, 17 Dec 2010 14:42:48 +0000 (+0100) Subject: modification to fairstrategy X-Git-Tag: v0.1~222 X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/e77b88227729cc003cb8e74b5657886ed61a270f modification to fairstrategy --- diff --git a/loba_fairstrategy.cpp b/loba_fairstrategy.cpp index fd710c2..81de9e1 100644 --- a/loba_fairstrategy.cpp +++ b/loba_fairstrategy.cpp @@ -1,5 +1,5 @@ #include "loba_fairstrategy.h" - +#include #include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); @@ -8,34 +8,54 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); * load balance with a least-loaded neighbor, * without breaking the ping-pong condition */ + +class compare { +public : + bool operator()(const neighbor*a, const neighbor*b) { + return a->get_load()>b->get_load(); + } +}; + 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) { + + std::sort(pneigh.begin(),pneigh.end(),compare()); + + //print_loads(); + + INFO0("list voisins"); + for(unsigned i=0;i< pneigh.size() ; ++i) { + INFO2("%s %f ", pneigh[i]->get_name(), pneigh[i]->get_load()); + } + + double sum_sent=0; + bool found=true; + + while(found) { + found=false; + 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; - } + continue; + if(lset_load(l+1); + pneigh[i]->add_to_send(1); + INFO1("sent to %s",pneigh[i]->get_name()); + my_load--; + sum_sent++; + } + } + } + + + + return sum_sent; + } // Local variables: diff --git a/neighbor.h b/neighbor.h index 9607c07..58f6c1c 100644 --- a/neighbor.h +++ b/neighbor.h @@ -25,6 +25,7 @@ public: // Getter and setter for to_send double get_to_send() const { return to_send; } void set_to_send(double amount) { to_send = amount; } + void add_to_send(double amount) { to_send += amount; } private: const hostdata* host; // pointer to this neighbor's hostdata diff --git a/process.h b/process.h index 053e348..df0cfe5 100644 --- a/process.h +++ b/process.h @@ -35,6 +35,8 @@ protected: // Returns the sum of "to_send" for all neighbors. double sum_of_to_send() const; + // Print with given priority what we know about our neighbors' loads + void print_loads(e_xbt_log_priority_t logp = xbt_log_priority_info); private: static double total_load_init; @@ -83,8 +85,7 @@ private: void finalize1(neighbor& nb); void finalize(); - // Print with given priority what we know about our neighbors' loads - void print_loads(e_xbt_log_priority_t logp = xbt_log_priority_info); + }; #endif // !PROCESS_H