X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/3d1592bcd7bd39aa4ca37bb93d00cb9b770f70ca..28a30c9d25c9555dd21935653d2386653b0f3fe8:/process.cpp diff --git a/process.cpp b/process.cpp index 07372dc..76524fd 100644 --- a/process.cpp +++ b/process.cpp @@ -20,6 +20,9 @@ double process::total_load_init = 0.0; double process::total_load_running = 0.0; double process::total_load_exit = 0.0; +int process::process_counter = 0; +double process::total_load_average; + namespace { void sleep_until_date(double& date, double duration) @@ -54,12 +57,20 @@ process::process(int argc, char* argv[]) rev_neigh.insert(std::make_pair(host, ptr)); } + // Note: there should not be race condition with the current + // version of Simgrid, when updating the global variables. + prev_load_broadcast = -1; // force sending of load on first send_all() expected_load = real_load; total_load_running += real_load; total_load_init += real_load; received_load = 0.0; + convergence = -1.0; + + process_counter++; + total_load_average = total_load_running / process_counter; + ctrl_close_pending = data_close_pending = neigh.size(); close_received = false; finalizing = false; @@ -95,6 +106,12 @@ process::~process() return; XBT_INFO("Final load after %d:%d:%d iterations: %g", lb_iter, comp_iter, all_comp_iter, real_load); + if (convergence >= 0.0) + XBT_INFO("Convergence within %g%% was achieved at time %g", + opt::avg_load_ratio, convergence); + else + XBT_INFO("Convergence within %g%% was not achieved", + opt::avg_load_ratio); XBT_VERB("Expected load was: %g", expected_load); XBT_VERB("Total computation for this process: %g", get_comp_amount()); print_loads(true, xbt_log_priority_debug); @@ -199,6 +216,22 @@ void process::compute_loop() if (real_load == 0.0) continue; + double load_ratio = + 100.0 * std::fabs(real_load / total_load_average - 1.0); + if (convergence >= 0.0) { + if (load_ratio > opt::avg_load_ratio) { + XBT_VERB("current load has diverged: %g (%.4g%%)", + real_load, load_ratio); + convergence = -1.0; + } + } else { + if (load_ratio <= opt::avg_load_ratio) { + XBT_VERB("current load has converged: %g (%.4g%%)", + real_load, load_ratio); + convergence = MSG_get_clock(); + } + } + // compute ++comp_iter; double flops = opt::comp_cost(real_load);