Nektar++
Public Types | Public Member Functions | Static Public Member Functions | Private Attributes | Static Private Attributes | List of all members
Nektar::LibUtilities::Timer Class Reference

#include <Timer.h>

Public Types

using Clock = std::chrono::steady_clock
 
using CounterType = Clock::time_point
 
using Seconds = std::chrono::duration< NekDouble >
 

Public Member Functions

 Timer ()=default
 
 ~Timer ()=default
 
 Timer (const Timer &rhs)=delete
 
Timeroperator= (const Timer &rhs)=delete
 
void Start ()
 
void Stop ()
 
Seconds Elapsed ()
 
void AccumulateRegion (std::string, int iolevel=0)
 Accumulate elapsed time for a region. More...
 
NekDouble TimePerTest (unsigned int n)
 Returns amount of seconds per iteration in a test with n iterations. More...
 

Static Public Member Functions

static void PrintElapsedRegions ()
 Print elapsed time and call count for each region with default serial communicator. More...
 
static void PrintElapsedRegions (LibUtilities::CommSharedPtr comm, std::ostream &o=std::cout, int iolevel=0)
 Print elapsed time and call count for each region. More...
 

Private Attributes

CounterType m_start = CounterType()
 
CounterType m_end = CounterType()
 
bool m_isactive = false
 

Static Private Attributes

static std::map< std::string, std::tuple< Seconds, size_t, int > > m_elapsedRegion {}
 

Detailed Description

Definition at line 51 of file Timer.h.

Member Typedef Documentation

◆ Clock

using Nektar::LibUtilities::Timer::Clock = std::chrono::steady_clock

Definition at line 54 of file Timer.h.

◆ CounterType

using Nektar::LibUtilities::Timer::CounterType = Clock::time_point

Definition at line 55 of file Timer.h.

◆ Seconds

using Nektar::LibUtilities::Timer::Seconds = std::chrono::duration<NekDouble>

Definition at line 56 of file Timer.h.

Constructor & Destructor Documentation

◆ Timer() [1/2]

Nektar::LibUtilities::Timer::Timer ( )
default

◆ ~Timer()

Nektar::LibUtilities::Timer::~Timer ( )
default

◆ Timer() [2/2]

Nektar::LibUtilities::Timer::Timer ( const Timer rhs)
delete

Member Function Documentation

◆ AccumulateRegion()

void Nektar::LibUtilities::Timer::AccumulateRegion ( std::string  region,
int  iolevel = 0 
)

Accumulate elapsed time for a region.

Definition at line 73 of file Timer.cpp.

74 {
75  // search for region
76  auto search = m_elapsedRegion.find(region);
77  if (search == m_elapsedRegion.end())
78  {
79  m_elapsedRegion.insert({region, std::make_tuple<Timer::Seconds, size_t>(
80  this->Elapsed(), 1, iolevel)});
81  }
82  else
83  {
84  std::get<0>(search->second) += this->Elapsed();
85  std::get<1>(search->second) += 1;
86  }
87 }
static std::map< std::string, std::tuple< Seconds, size_t, int > > m_elapsedRegion
Definition: Timer.h:90

References Elapsed(), and m_elapsedRegion.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::PreconCoeff(), Nektar::PulseWavePropagation::SetPulseWaveBoundaryConditions(), Nektar::VelocityCorrectionScheme::SolveUnsteadyStokesSystem(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectTraceFlux(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), Nektar::PreconCfsBRJ::v_DoPreconCfs(), Nektar::PulseWaveSystem::v_DoSolve(), Nektar::VelocityCorrectionScheme::v_EvaluateAdvection_SetPressureBCs(), and Nektar::MultiRegions::ExpList::v_PhysDeriv().

◆ Elapsed()

Timer::Seconds Nektar::LibUtilities::Timer::Elapsed ( )

Definition at line 61 of file Timer.cpp.

62 {
64  "Call to Timer::Elapsed() done before Timer::Stop().");
65  return std::chrono::duration_cast<Seconds>(m_end - m_start);
66 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
CounterType m_start
Definition: Timer.h:86

References ASSERTL0, m_end, m_isactive, and m_start.

Referenced by AccumulateRegion(), main(), TimePerTest(), Nektar::SolverUtils::DriverAdaptive::v_Execute(), Nektar::SolverUtils::DriverParareal::v_Execute(), and Nektar::SolverUtils::DriverStandard::v_Execute().

◆ operator=()

Timer& Nektar::LibUtilities::Timer::operator= ( const Timer rhs)
delete

◆ PrintElapsedRegions() [1/2]

void Nektar::LibUtilities::Timer::PrintElapsedRegions ( )
static

Print elapsed time and call count for each region with default serial communicator.

Definition at line 89 of file Timer.cpp.

90 {
91  std::string def("default");
92  char *argv = new char[def.length() + 1];
93  std::strcpy(argv, def.c_str());
96 
97  PrintElapsedRegions(comm);
98 
99  delete[] argv;
100 }
static void PrintElapsedRegions()
Print elapsed time and call count for each region with default serial communicator.
Definition: Timer.cpp:89
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:54

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ PrintElapsedRegions() [2/2]

void Nektar::LibUtilities::Timer::PrintElapsedRegions ( LibUtilities::CommSharedPtr  comm,
std::ostream &  o = std::cout,
int  iolevel = 0 
)
static

Print elapsed time and call count for each region.

Definition at line 102 of file Timer.cpp.

104 {
105  // Return if there is nothing to write, or the user has disabled printing
106  if (m_elapsedRegion.begin() == m_elapsedRegion.end() || iolevel < 0)
107  {
108  return;
109  }
110 
111  // Define content of each column that will be written
112  std::vector<std::string> labels{"Region", "Elapsed time Avg (s)",
113  "Min (s)", "Max (s)",
114  "Count", "IO Level"};
115 
116  // Set width of each column (minimum 14 characters)
117  std::vector<size_t> widths;
118  for (const auto &label : labels)
119  {
120  widths.push_back(std::max<size_t>(label.size() + 2, 14));
121  }
122 
123  // Make sure that names for each "Region" fits
124  for (const auto &entry : m_elapsedRegion)
125  {
126  widths[0] = std::max<size_t>(entry.first.size() + 2, widths[0]);
127  }
128 
129  // Print header
130  if (comm->GetRank() == 0)
131  {
132  o << "-------------------------------------------\n";
133  for (int i = 0; i < labels.size(); ++i)
134  {
135  o << std::setw(widths[i]) << labels[i];
136  }
137  o << '\n';
138  }
139 
140  // first write out execute time
141  auto item = m_elapsedRegion.find("Execute");
142  if (item != m_elapsedRegion.end())
143  {
144  auto elapsedAve = std::get<0>(item->second).count();
145  comm->AllReduce(elapsedAve, LibUtilities::ReduceSum);
146  elapsedAve /= comm->GetSize();
147  auto elapsedMin = std::get<0>(item->second).count();
148  comm->AllReduce(elapsedMin, LibUtilities::ReduceMin);
149  auto elapsedMax = std::get<0>(item->second).count();
150  comm->AllReduce(elapsedMax, LibUtilities::ReduceMax);
151 
152  if (comm->GetRank() == 0)
153  {
154  o << std::setw(widths[0]) << item->first << std::setw(widths[1])
155  << elapsedAve << std::setw(widths[2]) << elapsedMin
156  << std::setw(widths[3]) << elapsedMax << std::setw(widths[4])
157  << std::get<1>(item->second) << std::setw(widths[5])
158  << std::get<2>(item->second) << '\n';
159  }
160  }
161 
162  // Write all remaining timers, grouped by their IO Level
163  for (int i = 0; i <= iolevel; i++)
164  {
165  // Add a newline between each IO Level group
166  if (comm->GetRank() == 0)
167  o << "\n";
168 
169  for (auto item = m_elapsedRegion.begin(); item != m_elapsedRegion.end();
170  ++item)
171  {
172  // Avoid writing the "Execute" timer twice
173  if (boost::iequals(item->first, "Execute"))
174  {
175  continue;
176  }
177 
178  // Check if this timer has the correct IO Level
179  if (std::get<2>(item->second) == i)
180  {
181 
182  auto elapsedAve = std::get<0>(item->second).count();
183  comm->AllReduce(elapsedAve, LibUtilities::ReduceSum);
184  elapsedAve /= comm->GetSize();
185  auto elapsedMin = std::get<0>(item->second).count();
186  comm->AllReduce(elapsedMin, LibUtilities::ReduceMin);
187  auto elapsedMax = std::get<0>(item->second).count();
188  comm->AllReduce(elapsedMax, LibUtilities::ReduceMax);
189 
190  if (comm->GetRank() == 0)
191  {
192  o << std::setw(widths[0]) << item->first
193  << std::setw(widths[1]) << elapsedAve
194  << std::setw(widths[2]) << elapsedMin
195  << std::setw(widths[3]) << elapsedMax
196  << std::setw(widths[4]) << std::get<1>(item->second)
197  << std::setw(widths[5]) << std::get<2>(item->second)
198  << '\n';
199  }
200  }
201  }
202  }
203 }

References CG_Iterations::label, m_elapsedRegion, Nektar::LibUtilities::ReduceMax, Nektar::LibUtilities::ReduceMin, and Nektar::LibUtilities::ReduceSum.

◆ Start()

void Nektar::LibUtilities::Timer::Start ( )

Definition at line 47 of file Timer.cpp.

48 {
49  ASSERTL0(!m_isactive, "Call to Timer::Start() done when timer is active.");
50  m_isactive = true;
51  m_start = Clock::now();
52 }

References ASSERTL0, m_isactive, and m_start.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::PreconCoeff(), Nektar::SolverUtils::CouplingCwipi::ReceiveCwipi(), Nektar::SolverUtils::CouplingCwipi::ReceiveStart(), RunModule(), Nektar::SolverUtils::CouplingCwipi::SendComplete(), Nektar::PulseWavePropagation::SetPulseWaveBoundaryConditions(), Nektar::CoupledLinearNS::SetUpCoupledMatrix(), Nektar::Collections::CollectionOptimisation::SetWithTimings(), Nektar::CoupledLinearNS::SolveSteadyNavierStokes(), Nektar::VelocityCorrectionScheme::SolveUnsteadyStokesSystem(), Nektar::MultiRegions::AssemblyCommDG::Timing(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectTraceFlux(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), Nektar::PreconCfsBRJ::v_DoPreconCfs(), Nektar::SolverUtils::UnsteadySystem::v_DoSolve(), Nektar::MMFAdvection::v_DoSolve(), Nektar::MMFMaxwell::v_DoSolve(), Nektar::PulseWaveSystem::v_DoSolve(), Nektar::MMFSWE::v_DoSolve(), Nektar::CoupledLinearNS::v_DoSolve(), Nektar::VelocityCorrectionScheme::v_EvaluateAdvection_SetPressureBCs(), Nektar::SolverUtils::DriverAdaptive::v_Execute(), Nektar::SolverUtils::DriverParareal::v_Execute(), Nektar::SolverUtils::DriverStandard::v_Execute(), Nektar::SolverUtils::DriverSteadyState::v_Execute(), Nektar::SpatialDomains::MeshGraphHDF5::v_PartitionMesh(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::Dummy::v_PostIntegrate(), Nektar::FieldUtils::InputXml::v_Process(), Nektar::FieldUtils::ProcessCreateExp::v_Process(), Nektar::FieldUtils::ProcessIsoContour::v_Process(), and Nektar::SolverUtils::CouplingCwipi::v_Send().

◆ Stop()

void Nektar::LibUtilities::Timer::Stop ( )

Definition at line 54 of file Timer.cpp.

55 {
56  m_end = Clock::now();
57  ASSERTL0(m_isactive, "Call to Timer::Stop() done when timer is inactive.");
58  m_isactive = false;
59 }

References ASSERTL0, m_end, and m_isactive.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::PreconCoeff(), Nektar::SolverUtils::CouplingCwipi::ReceiveCwipi(), Nektar::SolverUtils::CouplingCwipi::ReceiveStart(), RunModule(), Nektar::SolverUtils::CouplingCwipi::SendComplete(), Nektar::PulseWavePropagation::SetPulseWaveBoundaryConditions(), Nektar::CoupledLinearNS::SetUpCoupledMatrix(), Nektar::Collections::CollectionOptimisation::SetWithTimings(), Nektar::CoupledLinearNS::SolveSteadyNavierStokes(), Nektar::VelocityCorrectionScheme::SolveUnsteadyStokesSystem(), Nektar::MultiRegions::AssemblyCommDG::Timing(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::v_AdvectTraceFlux(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), Nektar::PreconCfsBRJ::v_DoPreconCfs(), Nektar::SolverUtils::UnsteadySystem::v_DoSolve(), Nektar::MMFAdvection::v_DoSolve(), Nektar::MMFMaxwell::v_DoSolve(), Nektar::PulseWaveSystem::v_DoSolve(), Nektar::MMFSWE::v_DoSolve(), Nektar::CoupledLinearNS::v_DoSolve(), Nektar::VelocityCorrectionScheme::v_EvaluateAdvection_SetPressureBCs(), Nektar::SolverUtils::DriverAdaptive::v_Execute(), Nektar::SolverUtils::DriverParareal::v_Execute(), Nektar::SolverUtils::DriverStandard::v_Execute(), Nektar::SpatialDomains::MeshGraphHDF5::v_PartitionMesh(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::Dummy::v_PostIntegrate(), Nektar::FieldUtils::InputXml::v_Process(), Nektar::FieldUtils::ProcessCreateExp::v_Process(), Nektar::FieldUtils::ProcessIsoContour::v_Process(), and Nektar::SolverUtils::CouplingCwipi::v_Send().

◆ TimePerTest()

NekDouble Nektar::LibUtilities::Timer::TimePerTest ( unsigned int  n)

Member Data Documentation

◆ m_elapsedRegion

std::map< std::string, std::tuple< Timer::Seconds, size_t, int > > Nektar::LibUtilities::Timer::m_elapsedRegion {}
staticprivate

Definition at line 90 of file Timer.h.

Referenced by AccumulateRegion(), and PrintElapsedRegions().

◆ m_end

CounterType Nektar::LibUtilities::Timer::m_end = CounterType()
private

Definition at line 87 of file Timer.h.

Referenced by Elapsed(), and Stop().

◆ m_isactive

bool Nektar::LibUtilities::Timer::m_isactive = false
private

Definition at line 88 of file Timer.h.

Referenced by Elapsed(), Start(), and Stop().

◆ m_start

CounterType Nektar::LibUtilities::Timer::m_start = CounterType()
private

Definition at line 86 of file Timer.h.

Referenced by Elapsed(), and Start().