#include <cerrno>
+#include <cmath>
#include <csignal>
#include <cstring> // strchr
#include <iostream>
#include "tracing.h"
#include "version.h"
-#define DATA_DESCR_WIDTH 37
+#define DATA_DESCR_WIDTH 39
namespace {
// Failure exit status
statistics loads;
statistics comps;
+ statistics comp_iterations;
+ statistics all_comp_iterations;
statistics data_send_amount;
statistics data_recv_amount;
statistics data_send_count;
statistics ctrl_recv_amount;
statistics ctrl_send_count;
statistics ctrl_recv_count;
+ statistics convergence;
}
proc_mutex->acquire();
loads.push(proc->get_real_load());
comps.push(proc->get_comp_amount());
+ comp_iterations.push(proc->get_comp_iter());
+ all_comp_iterations.push(proc->get_all_comp_iter());
data_send_amount.push(proc->get_data_send_amount());
data_recv_amount.push(proc->get_data_recv_amount());
data_send_count.push(proc->get_data_send_count());
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
}
}
+#define PR_VALUE(descr, format, ...) \
+ XBT_INFO("| %.*s: " format, DATA_DESCR_WIDTH, \
+ descr ".................................................", \
+ __VA_ARGS__)
+
#define PR_STATS(descr, st) \
XBT_INFO("| %.*s: %g / %g / %g", DATA_DESCR_WIDTH, \
- descr " (total/avg./stddev)................................", \
+ descr " (total/avg./stddev).............................", \
st.get_sum(), st.get_mean(), st.get_stddev())
int main(int argc, char* argv[])
} else if (opt::auto_depl::load < 0.0)
opt::auto_depl::load =
-opt::auto_depl::load * opt::auto_depl::nhosts;
- double iload = trunc(opt::auto_depl::load);
+ double iload = std::trunc(opt::auto_depl::load);
if (opt::integer_transfer && opt::auto_depl::load != iload) {
XBT_WARN("Total load %g is not an integer. Truncate it.",
opt::auto_depl::load);
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_STATS("Comp. iterations", comp_iterations);
+ PR_STATS("X-Comp. iterations", all_comp_iterations);
PR_STATS("Data send amount", data_send_amount);
PR_STATS("Data recv amount", data_recv_amount);
PR_STATS("Data send count", data_send_count);
PR_STATS("Ctrl recv amount", ctrl_recv_amount);
PR_STATS("Ctrl send count", ctrl_send_count);
PR_STATS("Ctrl recv count", ctrl_recv_count);
- XBT_INFO("| %.*s: %g", DATA_DESCR_WIDTH,
- "Total simulated time..................................",
- simulated_time);
- XBT_INFO("| %.*s: %g", DATA_DESCR_WIDTH,
- "Total simulation time.................................",
- simulation_time.duration());
- XBT_INFO("| %.*s: %g", DATA_DESCR_WIDTH,
- "Elapsed (wall clock) time.............................",
- elapsed_time.duration());
+ PR_VALUE("Total simulated time", "%g", simulated_time);
+ 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("Date of first host convergence", "%g", convergence.get_min());
+ PR_VALUE("Date of last host convergence", "%g", convergence.get_max());
+ XBT_INFO("`----");
+
}
if (exit_status)
XBT_ERROR("Simulation failed (%#x).", exit_status);