diff --git a/dune/stuff/common/profiler.cc b/dune/stuff/common/profiler.cc index 99268555c799cca0e2adea586cca93a4ff0f70de..be44691576f644cc5befd3446a1fcb91db857bcf 100644 --- a/dune/stuff/common/profiler.cc +++ b/dune/stuff/common/profiler.cc @@ -249,13 +249,39 @@ void Profiler::setOutputdir(const std::string dir) Dune::Stuff::Common::testCreateDirectory(output_dir_); } -void Profiler::outputTimings(const std::string /*csv*/) const +void Profiler::outputTimings(const std::string csv) const { const auto& comm = Dune::MPIHelper::getCollectiveCommunication(); - boost::filesystem::path filename(output_dir_); - filename /= (boost::format("timings_p%08d.csv") % comm.rank()).str(); + boost::filesystem::path dir(output_dir_); + boost::filesystem::path filename = dir / (boost::format("%s_p%08d.csv") % csv % comm.rank()).str(); boost::filesystem::ofstream out(filename); outputTimings(out); + if (comm.rank() == 0) { + boost::filesystem::path a_filename = dir / (boost::format("%s.csv") % csv).str(); + boost::filesystem::ofstream a_out(a_filename); + outputTimingsAll(a_out); + } +} + +void Profiler::outputTimingsAll(std::ostream& out) const +{ + if (datamaps_.size() < 1) + return; + // csv header: + const auto& comm = Dune::MPIHelper::getCollectiveCommunication(); + out << "run"; + for (const auto& section : datamaps_[0]) { + out << csv_sep << section.first << "_avg" << csv_sep << section.first << "_sum"; + } + int i = 0; + for (const auto& datamap : datamaps_) { + out << std::endl << i; + for (const auto& section : datamap) { + auto sum = comm.sum(section.second); + out << csv_sep << sum / float(comm.size()) << csv_sep << sum; + } + out << std::endl; + } } void Profiler::outputTimings(std::ostream& out) const diff --git a/dune/stuff/common/profiler.hh b/dune/stuff/common/profiler.hh index 39cf80497c68cf5c339378f907ece67af9f242d4..075ffaa323b55d0a406598c2ca46ca6dbc39bfbc 100644 --- a/dune/stuff/common/profiler.hh +++ b/dune/stuff/common/profiler.hh @@ -123,8 +123,9 @@ public: void outputMap(const InfoContainerMap& run_infos_map, const double scale_factor = 1.0) const; //! file-output the named sections only - void outputTimings(const std::string filename) const; + void outputTimings(const std::string filename = "timings") const; void outputTimings(std::ostream& out = std::cout) const; + void outputTimingsAll(std::ostream& out = std::cout) const; /** call this with correct numRuns <b> before </b> starting any profiling * if you're planning on doing more than one iteration of your code * called once fromm ctor with numRuns=1