X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/b0b2d9cb57d83fcdfb92837561ffb5dbab288323..88921c948c99bfaf470e528e6e6d004c22905a40:/process.cpp diff --git a/process.cpp b/process.cpp index 5d0f98b..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,17 +57,25 @@ 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; - comp_iter = lb_iter = 0; + all_comp_iter = comp_iter = lb_iter = 0; lb_thread = new_msg_thread("loba", std::bind(&process::load_balance_loop, this)); @@ -93,8 +104,14 @@ process::~process() "received_load is %g, but should be 0.0 !", received_load); if (opt::log_rate < 0) return; - XBT_INFO("Final load after %d:%d iterations: %g", - lb_iter, comp_iter, real_load); + 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); @@ -144,7 +161,8 @@ void process::load_balance_loop() // 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_INFO("(%u:%u:%u) current load: %g", + lb_iter, comp_iter, all_comp_iter, real_load); XBT_VERB("... expected load: %g", expected_load); } @@ -194,9 +212,26 @@ void process::compute_loop() std::bind(&process::data_send, this, _1)); mutex.release(); + ++all_comp_iter; 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);