X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/6b7dedf20c9bd5bca561df7ca9d664939ca66161..3cd6600dbcb87137c7adde8e4e310aefaea2a2e7:/process.cpp diff --git a/process.cpp b/process.cpp index 07372dc..e772176 100644 --- a/process.cpp +++ b/process.cpp @@ -20,6 +20,10 @@ 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; +double process::load_diff_threshold; + namespace { void sleep_until_date(double& date, double duration) @@ -54,12 +58,22 @@ 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; + load_diff_threshold = (opt::load_ratio_threshold + + opt::avg_load_ratio * total_load_average) / 100.0; + ctrl_close_pending = data_close_pending = neigh.size(); close_received = false; finalizing = false; @@ -95,6 +109,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 +219,8 @@ void process::compute_loop() if (real_load == 0.0) continue; + convergence_check(); + // compute ++comp_iter; double flops = opt::comp_cost(real_load); @@ -226,9 +248,30 @@ void process::compute_loop() real_load += received_load; received_load = 0.0; total_load_running -= real_load; + convergence_check(); comm.data_flush(true); } +void process::convergence_check() +{ + double load_diff = std::fabs(real_load - total_load_average); + bool converged = load_diff <= load_diff_threshold; + + if (convergence >= 0.0) { + if (!converged) { + XBT_VERB("current load has diverged: %g (%.4g%%)", + real_load, 100.0 * load_diff / total_load_average); + convergence = -1.0; + } + } else { + if (converged) { + XBT_VERB("current load has converged: %g (%.4g%%)", + real_load, 100.0 * load_diff / total_load_average); + convergence = MSG_get_clock(); + } + } +} + bool process::still_running() { static bool last_status = true;