From a97c4fc77c41acb53065062500cc3337097a6337 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 4 Oct 2011 10:18:30 +0200 Subject: [PATCH 1/1] Check for convergence after final receive too. Also use opt::load_ratio_threshold when comparing floating point values, when checking for convergence. --- process.cpp | 40 +++++++++++++++++++++++++--------------- process.h | 4 ++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/process.cpp b/process.cpp index 76524fd..e772176 100644 --- a/process.cpp +++ b/process.cpp @@ -22,6 +22,7 @@ double process::total_load_exit = 0.0; int process::process_counter = 0; double process::total_load_average; +double process::load_diff_threshold; namespace { @@ -70,6 +71,8 @@ process::process(int argc, char* argv[]) 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; @@ -216,21 +219,7 @@ 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(); - } - } + convergence_check(); // compute ++comp_iter; @@ -259,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; diff --git a/process.h b/process.h index ff8b751..d2f1229 100644 --- a/process.h +++ b/process.h @@ -87,6 +87,7 @@ private: static int process_counter; static double total_load_average; + static double load_diff_threshold; typedef MAP_TEMPLATE rev_neigh_type; neigh_type neigh; // list of neighbors (do not alter @@ -159,6 +160,9 @@ private: // Simulate computation loop void compute_loop(); + // Check for convergence + void convergence_check(); + // Check if we need to stop bool still_running(); -- 2.39.5