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

Private GIT Repository
Try to make results more consistent.
authorArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Fri, 18 Feb 2011 07:40:25 +0000 (08:40 +0100)
committerArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Fri, 18 Feb 2011 07:40:25 +0000 (08:40 +0100)
BUGS
NOTES
process.cpp
process.h

diff --git a/BUGS b/BUGS
index 5cc104066a1923c1dfe7597ba2953204e3444a54..5d493adbba62676426fa8571d67bc87dc0281733 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -1,3 +1,6 @@
+Faut-il protéger les accès concurrents à real_load, entre compute_loop
+et load_balance_loop ?
+
 ========================================================================
 Il semblerait qu'il y ait un bug dans SG 3.5, et qu'on ne puisse pas
 utiliser MSG_comm_waitany() pour l'émetteur *et* le récepteur sans
diff --git a/NOTES b/NOTES
index da97c1b7d931932e6731a146a82bc34209c49531..12f082bad0e45178f1369c3af61a929b84c6c345 100644 (file)
--- a/NOTES
+++ b/NOTES
@@ -57,3 +57,17 @@ thread, and a load-balancer thread.
 
   The loop terminates when process::still_running() returns false.
   (read the source for full details...)
+
+Some notes about *load attributes
+=================================
+process::real_load              Current *real* load.
+                                Used for the computations.
+                                Displayed in log messages.
+
+process::expected_load          Current load estimation.
+                                Used for load-balancing estimation, and for
+                                diffusing to neighbors.
+                                * Without bookkeeping, it equals real_load
+                                  minus pending sends.
+                                * With bookkeeping, it corresponds to the "virtual
+                                  load".
index 8e9f5245fd896a8cd9cfcff05ff51a53b3235c48..2b1b36936b0dba553cdf7460082b546befe9e0d6 100644 (file)
@@ -128,12 +128,16 @@ void process::load_balance_loop()
             ++lb_iter;
         }
 
+        if (!opt::bookkeeping)
+            expected_load = real_load - get_sum_of_to_send();
+        // nothing to do with opt::bookkeeping
+
         if (opt::log_rate && lb_iter % opt::log_rate == 0) {
             XBT_INFO("(%u:%u) current load: %g", lb_iter, comp_iter, real_load);
             XBT_VERB("... expected load: %g", expected_load);
         }
 
-        if (get_load() > 0.0)
+        if (expected_load > 0.0)
             load_balance();
 
         print_loads(true, xbt_log_priority_debug);
@@ -141,7 +145,7 @@ void process::load_balance_loop()
         // send
         std::for_each(neigh.begin(), neigh.end(),
                       bind(&process::ctrl_send, this, _1));
-        prev_load_broadcast = get_load();
+        prev_load_broadcast = expected_load;
 
         sleep_until_date(next_iter_after_date, opt::min_lb_iter_duration);
         ctrl_receive(0.0);
@@ -272,14 +276,14 @@ void process::load_balance()
 
 void process::send(neighbor& nb, double amount)
 {
-    set_load(get_load() - amount);
+    expected_load -= amount;
     nb.set_to_send(nb.get_to_send() + amount);
     nb.set_load(nb.get_load() + amount);
 }
 
 void process::ctrl_send(neighbor& nb)
 {
-    double info_to_send = get_load();
+    double info_to_send = expected_load;
     if (info_to_send != prev_load_broadcast)
         comm.ctrl_send(nb.get_ctrl_mbox(),
                        new message(message::INFO, info_to_send));
@@ -310,7 +314,7 @@ void process::data_send(neighbor& nb)
     } else {
         load_to_send = nb.get_to_send();
         nb.set_to_send(0.0);
-        // do not update real_load here
+        real_load -= load_to_send;
     }
     if (load_to_send > 0.0)
         comm.data_send(nb.get_data_mbox(),
@@ -356,7 +360,7 @@ void process::handle_message(message* msg, m_host_t from)
     switch (msg->get_type()) {
     case message::INFO: {
         neighbor* n = rev_neigh[from];
-        n->set_load(msg->get_amount());
+        n->set_load(msg->get_amount() + n->get_to_send());
         break;
     }
     case message::CREDIT:
index 926bf1f9d064e343cd87273bdbdec41f41879cf9..cc10b0494ba0710994be865891af6b153acba24b 100644 (file)
--- a/process.h
+++ b/process.h
@@ -46,8 +46,7 @@ protected:
 
     // Get and set current load, which may be real load, or expected
     // load if opt::bookkeeping is true.
-    double get_load() const;
-    void set_load(double load);
+    double get_load() const                { return expected_load; }
 
     // The load balancing algorithm comes here...
     virtual void load_balance();
@@ -108,6 +107,7 @@ private:
     // Simulate computation loop
     void compute_loop();
 
+    // Check if we need to stop
     bool still_running();
 
     // Returns the sum of "to_send" for all neighbors.
@@ -127,24 +127,6 @@ private:
     void handle_message(message* msg, m_host_t from);
 };
 
-inline
-double process::get_load() const
-{
-    if (opt::bookkeeping)
-        return expected_load;
-    else
-        return real_load;
-}
-
-inline
-void process::set_load(double load)
-{
-    if (opt::bookkeeping)
-        expected_load = load;
-    else
-        real_load = load;
-}
-
 template <typename Compare>
 void process::pneigh_sort_by_load(const Compare& comp)
 {