From 64e3d18e629fa5a4d3fcc7974c7f582c510ff2d8 Mon Sep 17 00:00:00 2001
From: Ben Cumming <bcumming@cscs.ch>
Date: Tue, 22 Jan 2019 17:09:05 +0100
Subject: [PATCH] Output accumulated meter values in meter printer (#672)
* Print a `meter-total` value of the accumulated meter values across all checkpoints to the meter `ostream` output.
* Add default behavior that prints the mean of a meter across all ranks if the meter type is not one of the known special cases (i.e. not one of time, memory or energy).
Fixes #671
---
arbor/profile/meter_manager.cpp | 41 +++++++++++++++++++++++++++------
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/arbor/profile/meter_manager.cpp b/arbor/profile/meter_manager.cpp
index ba5fd8dc..d3e4097e 100644
--- a/arbor/profile/meter_manager.cpp
+++ b/arbor/profile/meter_manager.cpp
@@ -141,31 +141,58 @@ std::ostream& operator<<(std::ostream& o, const meter_report& report) {
else if (m.name.find("energy")!=std::string::npos) {
o << strprintf("%16s", m.name+"(kJ)");
}
+ else {
+ o << strprintf("%16s(avg)", m.name);
+ }
}
o << "\n-------------------------------------------------------------------------------------------\n";
+ std::vector<double> sums(report.meters.size());
int cp_index = 0;
for (auto name: report.checkpoints) {
name.resize(20);
o << strprintf("%-21s", name);
+ int m_index = 0;
for (const auto& m: report.meters) {
if (m.name=="time") {
- std::vector<double> times = m.measurements[cp_index];
- o << strprintf("%16.3f", algorithms::mean(times));
+ // Calculate the average time per rank in s.
+ double time = algorithms::mean(m.measurements[cp_index]);
+ sums[m_index] += time;
+ o << strprintf("%16.3f", time);
}
else if (m.name.find("memory")!=std::string::npos) {
- std::vector<double> mem = m.measurements[cp_index];
- o << strprintf("%16.3f", algorithms::mean(mem)*1e-6);
+ // Calculate the average memory per rank in MB.
+ double mem = algorithms::mean(m.measurements[cp_index])*1e-6;
+ sums[m_index] += mem;
+ o << strprintf("%16.3f", mem);
}
else if (m.name.find("energy")!=std::string::npos) {
- std::vector<double> e = m.measurements[cp_index];
- // TODO: this is an approximation: better reduce a subset of measurements
auto doms_per_host = double(report.num_domains)/report.num_hosts;
- o << strprintf("%16.3f", algorithms::sum(e)/doms_per_host*1e-3);
+ // Calculate the total energy consumed accross all ranks in kJ
+ // Energy measurements are per "per node", so only normalise
+ // by the number of ranks per node. TODO, this is an
+ // approximation: better reduce a subset of measurements.
+ double energy = algorithms::sum(m.measurements[cp_index])/doms_per_host*1e-3;
+ sums[m_index] += energy;
+ o << strprintf("%16.3f", energy);
+ }
+ else {
+ double value = algorithms::mean(m.measurements[cp_index]);
+ sums[m_index] += value;
+ o << strprintf("%16.3f", value);
}
+ ++m_index;
}
o << "\n";
++cp_index;
}
+
+ // Print a final line with the accumulated values of each meter.
+ o << strprintf("%-21s", "meter-total");
+ for (const auto& v: sums) {
+ o << strprintf("%16.3f", v);
+ }
+ o << "\n";
+
return o;
}
--
GitLab