diff --git a/dune/xt/common/test/profiler.cc b/dune/xt/common/test/profiler.cc index 7a177fab45998e5e306b1f5f4d48c320a22a01e9..483666b9fd262e2c89d7ecbef7eac6c7d50ce56d 100644 --- a/dune/xt/common/test/profiler.cc +++ b/dune/xt/common/test/profiler.cc @@ -52,8 +52,9 @@ TEST(ProfilerTest, OutputConstness) { DXTC_TIMINGS.reset(); const auto& prof = DXTC_TIMINGS; - prof.output_timings("timings"); - prof.output_timings(dev_null); + prof.output_per_rank("timings"); + prof.output_all_measures(dev_null); + prof.output_simple(dev_null); } TEST(ProfilerTest, ExpectedFailures) diff --git a/dune/xt/common/timings.cc b/dune/xt/common/timings.cc index 3887b2c963ba1f2a4190eeb653063cb261c15fff..3a16cfa2a244b5a54a775172993537a7ebc856c3 100644 --- a/dune/xt/common/timings.cc +++ b/dune/xt/common/timings.cc @@ -165,25 +165,37 @@ void Timings::set_outputdir(const std::string dir) test_create_directory(output_dir_); } -void Timings::output_timings(const std::string csv_base, - const CollectiveCommunication<MPIHelper::MPICommunicator>& comm) const +void Timings::output_per_rank(const std::string csv_base) const { + const auto rank = MPIHelper::getCollectiveCommunication().rank(); boost::filesystem::path dir(output_dir_); - boost::filesystem::path filename = dir / (boost::format("%s_p%08d.csv") % csv_base % comm.rank()).str(); + boost::filesystem::path filename = dir / (boost::format("%s_p%08d.csv") % csv_base % rank).str(); boost::filesystem::ofstream out(filename); - output_timings(out); + output_all_measures(out, MPIHelper::getLocalCommunicator()); std::stringstream tmp_out; - output_timings_all(tmp_out); - if (comm.rank() == 0) { + output_all_measures(tmp_out, MPIHelper::getCommunicator()); + if (rank == 0) { boost::filesystem::path a_filename = dir / (boost::format("%s.csv") % csv_base).str(); boost::filesystem::ofstream a_out(a_filename); a_out << tmp_out.str() << std::endl; } } -void Timings::output_timings_all(std::ostream& out, - const CollectiveCommunication<MPIHelper::MPICommunicator>& comm) const +void Timings::output_simple(std::ostream& out) const { + for (const auto& section : commited_deltas_) { + out << csv_sep_ << section.first; + } + for (const auto& section : commited_deltas_) { + out << csv_sep_ << section.second[0]; + ; + } + out << std::endl; +} + +void Timings::output_all_measures(std::ostream& out, MPIHelper::MPICommunicator mpi_comm) const +{ + CollectiveCommunication<MPIHelper::MPICommunicator> comm(mpi_comm); std::stringstream stash; stash << "run" << csv_sep_ << "threads" << csv_sep_ << "ranks"; @@ -217,19 +229,6 @@ void Timings::output_timings_all(std::ostream& out, out << stash.str(); } -void Timings::output_timings(std::ostream& out, const CollectiveCommunication<MPIHelper::MPICommunicator>& comm) const -{ - for (const auto& section : commited_deltas_) { - out << csv_sep_ << section.first; - } - const double size = comm.size(); - for (const auto& section : commited_deltas_) { - auto val = section.second[0]; - out << csv_sep_ << comm.sum(val) / size; - } - out << std::endl; -} - Timings::Timings() : csv_sep_(",") { diff --git a/dune/xt/common/timings.hh b/dune/xt/common/timings.hh index a68dce193a85cec7887c668355c5ebc7796dae86..70ba6d686a200e318f055c5b59d324199b119870 100644 --- a/dune/xt/common/timings.hh +++ b/dune/xt/common/timings.hh @@ -103,17 +103,16 @@ public: //! get the full delta array TimingData::DeltaType delta(const std::string section_name) const; - /** file-output the named sections' walltimes only - * \note averages over all MPI processes **/ - void output_timings(const std::string csv_base, const CollectiveCommunication<MPIHelper::MPICommunicator>& comm = - Dune::MPIHelper::getCollectiveCommunication()) const; - void output_timings(std::ostream& out = std::cout, const CollectiveCommunication<MPIHelper::MPICommunicator>& comm = - Dune::MPIHelper::getCollectiveCommunication()) const; - /** output all recoreded measures - * \note outputs average, min, max over all MPI processes **/ - void output_timings_all(std::ostream& out = std::cout, - const CollectiveCommunication<MPIHelper::MPICommunicator>& comm = - Dune::MPIHelper::getCollectiveCommunication()) const; + /** creates one file local to each MPI-rank (no global averaging) + * one single rank-0 file with all combined/averaged measures + ***/ + void output_per_rank(const std::string csv_base) const; + //! outputs walltime only w/o MPI-rank averaging + void output_simple(std::ostream& out = std::cout) const; + /** output all recorded measures + * \note outputs average, min, max over all MPI processes associated to mpi_comm **/ + void output_all_measures(std::ostream& out = std::cout, + MPIHelper::MPICommunicator mpi_comm = Dune::MPIHelper::getCommunicator()) const; /// stops and resets all timers and data void reset();