X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/526e1f382ddc9f0010c41a526f3029af769162c9..d5bb5e4a973b0e6e2346204eb743da3676b92821:/process.cpp diff --git a/process.cpp b/process.cpp index 36bdff0..6c72d45 100644 --- a/process.cpp +++ b/process.cpp @@ -24,8 +24,11 @@ double process::total_load_exit = 0.0; int process::process_counter = 0; double process::total_load_average; +double process::average_load_ratio; double process::load_diff_threshold; +std::atomic process::convergence_counter(0); + namespace { void sleep_until_date(double& date, double duration) @@ -69,11 +72,17 @@ process::process(int argc, char* argv[]) proc_mutex->acquire(); process_counter++; + convergence_counter++; total_load_init += real_load; total_load_running += real_load; total_load_average = total_load_running / process_counter; + if (opt::avg_load_ratio >= 0.0) + average_load_ratio = opt::avg_load_ratio; + else + average_load_ratio = 100.0 * + (process_counter / -opt::avg_load_ratio) / total_load_average; load_diff_threshold = (opt::load_ratio_threshold + - opt::avg_load_ratio * total_load_average) / 100.0; + average_load_ratio * total_load_average) / 100.0; proc_mutex->release(); ctrl_close_pending = data_close_pending = neigh.size(); @@ -115,10 +124,10 @@ process::~process() 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); + average_load_ratio, convergence); else XBT_INFO("Convergence within %g%% was not achieved", - opt::avg_load_ratio); + average_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); @@ -248,7 +257,7 @@ void process::compute_loop() ++comp_iter; double flops = opt::comp_cost(real_load); m_task_t task = MSG_task_create("computation", flops, 0.0, NULL); - TRACE_msg_set_task_category(task, TRACE_CAT_COMP); + // MSG_task_set_category(task, TRACE_CAT_COMP); XBT_DEBUG("compute %g flop%s", flops, ESSE(flops)); MSG_task_execute(task); add_comp_amount(flops); @@ -286,17 +295,22 @@ void process::convergence_check() double load_diff = std::fabs(real_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 / average); - convergence = -1.0; - } - } else { - if (converged) { + if (converged) { + if (convergence < 0) { XBT_VERB("current load has converged: %g (%.4g%%)", real_load, 100.0 * load_diff / average); convergence = MSG_get_clock(); + local_convergence_counter = opt::exit_on_convergence; + } + if (local_convergence_counter > 0 && --local_convergence_counter == 0) + --convergence_counter; + } else { + if (convergence >= 0.0) { + XBT_VERB("current load has diverged: %g (%.4g%%)", + real_load, 100.0 * load_diff / average); + convergence = -1.0; + if (local_convergence_counter == 0) + ++convergence_counter; } } } @@ -324,6 +338,10 @@ bool process::still_running() XBT_VERB("Reached comp_maxiter: %d/%d", comp_iter, opt::comp_maxiter); last_status = false; + } else if (opt::exit_on_convergence && convergence_counter == 0) { + XBT_VERB("Global convergence detected"); + last_status = false; + } else if (opt::exit_on_close && close_received) { XBT_VERB("Close received"); last_status = false; @@ -403,7 +421,11 @@ void process::data_send(neighbor& nb) else excess_load = real_load; - double balance = nb.get_debt() - nb.get_credit(); + double balance; + if (nb.get_credit() > 0.0) + balance = nb.get_debt() - nb.get_credit(); + else + balance = nb.get_debt(); load_to_send = std::min(excess_load, std::max(0.0, balance));