From 01f10aeb9d9a94f01006b4e7396711b8964f43da Mon Sep 17 00:00:00 2001
From: Arnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Date: Fri, 14 Oct 2011 17:02:32 +0200
Subject: [PATCH] Add statistics about idle duration.

---
 main.cpp    | 3 +++
 process.cpp | 5 +++++
 process.h   | 2 ++
 3 files changed, 10 insertions(+)

diff --git a/main.cpp b/main.cpp
index c373553..45c58ce 100644
--- a/main.cpp
+++ b/main.cpp
@@ -61,6 +61,7 @@ namespace {
     statistics ctrl_recv_amount;
     statistics ctrl_send_count;
     statistics ctrl_recv_count;
+    statistics idle_duration;
     statistics convergence;
 
 }
@@ -91,6 +92,7 @@ static int simulation_main(int argc, char* argv[])
         ctrl_recv_amount.push(proc->get_ctrl_recv_amount());
         ctrl_send_count.push(proc->get_ctrl_send_count());
         ctrl_recv_count.push(proc->get_ctrl_recv_count());
+        idle_duration.push(proc->get_idle_duration());
         double c = proc->get_convergence();
         if (c != -1.0)
             convergence.push(c);
@@ -329,6 +331,7 @@ int main(int argc, char* argv[])
         PR_STATS("Computation", comps);
         PR_STATS("Comp. iterations", comp_iterations);
         PR_STATS("X-Comp. iterations", all_comp_iterations);
+        PR_STATS("Idle duration", idle_duration);
         PR_STATS("Data send amount", data_send_amount);
         PR_STATS("Data recv amount", data_recv_amount);
         PR_STATS("Data send count", data_send_count);
diff --git a/process.cpp b/process.cpp
index b6a6d28..eac87d1 100644
--- a/process.cpp
+++ b/process.cpp
@@ -67,6 +67,7 @@ process::process(int argc, char* argv[])
     total_load_init += real_load;
     received_load = 0.0;
 
+    idle_duration = 0.0;
     convergence = -1.0;
 
     process_counter++;
@@ -202,6 +203,7 @@ void process::compute_loop()
     using std::placeholders::_1;
 
     double next_iter_after_date = MSG_get_clock() + opt::min_comp_iter_duration;
+    double idle_since_date = 0.0;
     while (still_running()) {
 
         do {
@@ -226,6 +228,7 @@ void process::compute_loop()
         convergence_check();
 
         // compute
+        idle_duration += MSG_get_clock() - idle_since_date;
         ++comp_iter;
         double flops = opt::comp_cost(real_load);
         m_task_t task = MSG_task_create("computation", flops, 0.0, NULL);
@@ -235,6 +238,8 @@ void process::compute_loop()
         add_comp_amount(flops);
         MSG_task_destroy(task);
 
+        idle_since_date = MSG_get_clock();
+
         sleep_until_date(next_iter_after_date, opt::min_comp_iter_duration);
     }
 
diff --git a/process.h b/process.h
index d2f1229..f2e5a45 100644
--- a/process.h
+++ b/process.h
@@ -44,6 +44,7 @@ public:
     double get_ctrl_recv_amount() const    { return acc.ctrl_recv.amount; }
     unsigned get_ctrl_send_count() const   { return acc.ctrl_send.count;  }
     unsigned get_ctrl_recv_count() const   { return acc.ctrl_recv.count;  }
+    double get_idle_duration() const       { return idle_duration;        }
     double get_convergence() const         { return convergence;          }
 
     int run();
@@ -113,6 +114,7 @@ private:
     double expected_load;       // expected load in bookkeeping mode
     double received_load;       // load received from neighbors
 
+    double idle_duration;       // how long we had nothing to compute
     double convergence;         // date when convergence was achieved, or -1.0
 
     mutex_t mutex;              // synchronization between threads
-- 
2.39.5