statistics ctrl_recv_amount;
statistics ctrl_send_count;
statistics ctrl_recv_count;
+ statistics convergence;
}
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());
+ double c = proc->get_convergence();
+ if (c != -1.0)
+ convergence.push(c);
// Synchronization barrier...
// The goal is to circumvent a limitation in SimGrid (at least
elapsed_time.stop();
if (!check_for_lost_load())
exit_status |= EXIT_FAILURE_LOAD;
+
XBT_INFO(",----[ Results ]");
PR_STATS("Load", loads);
PR_STATS("Computation", comps);
PR_VALUE("Total simulation time", "%g", simulation_time.duration());
PR_VALUE("Elapsed (wall clock) time", "%g", elapsed_time.duration());
XBT_INFO("`----");
+
+ double load_imbalance = 100.0 * loads.get_stddev() / loads.get_mean();
+ double transfer_amount =
+ data_send_amount.get_sum() / opt::comm_cost(loads.get_sum());
+
+ XBT_INFO(",----[ Useful metrics ]");
+ PR_VALUE("Final load imbalance", "%g %s", load_imbalance,
+ "percent of the load average");
+ PR_VALUE("Data transfer amount", "%g %s", transfer_amount,
+ "times the total amount of data");
+ PR_VALUE("Number of hosts that converged", "%u / %u",
+ convergence.get_count(), loads.get_count());
+ PR_VALUE("Times of convergence (min/max/avg/dev)", "%g / %g / %g / %g",
+ convergence.get_min(), convergence.get_max(),
+ convergence.get_mean(), convergence.get_stddev());
+ XBT_INFO("`----");
+
}
if (exit_status)
XBT_ERROR("Simulation failed (%#x).", exit_status);