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=1)
 Print elapsed time and call count for each region. More...
 

Private Attributes

CounterType m_start
 
CounterType m_end
 

Static Private Attributes

static std::map< std::string, std::tuple< Seconds, size_t, int > > m_elapsedRegion {}
 
static unsigned short m_maxStringWidth = 10
 

Detailed Description

Definition at line 52 of file Timer.h.

Member Typedef Documentation

◆ Clock

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

Definition at line 55 of file Timer.h.

◆ CounterType

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

Definition at line 56 of file Timer.h.

◆ Seconds

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

Definition at line 57 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 67 of file Timer.cpp.

68 {
69  // search for region
70  auto search = m_elapsedRegion.find(region);
71  if (search == m_elapsedRegion.end())
72  {
73  m_elapsedRegion.insert({region,
74  std::make_tuple<Timer::Seconds, size_t>(this->Elapsed(),1, iolevel)});
75  // update field width
76  m_maxStringWidth = std::max(
77  static_cast<decltype(m_maxStringWidth)>(region.size()),
79  }
80  else
81  {
82  std::get<0>(search->second) += this->Elapsed();
83  std::get<1>(search->second) += 1;
84  }
85 }
static unsigned short m_maxStringWidth
Definition: Timer.h:91
static std::map< std::string, std::tuple< Seconds, size_t, int > > m_elapsedRegion
Definition: Timer.h:90

References Elapsed(), m_elapsedRegion, and m_maxStringWidth.

Referenced by Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), 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_IterPerExp(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), Nektar::VelocityCorrectionScheme::v_EvaluateAdvection_SetPressureBCs(), and Nektar::MultiRegions::ExpList::v_PhysDeriv().

◆ Elapsed()

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

Definition at line 57 of file Timer.cpp.

58 {
59  return std::chrono::duration_cast<Seconds>(m_end - m_start);
60 }
CounterType m_start
Definition: Timer.h:87

References m_end, and m_start.

Referenced by AccumulateRegion(), and TimePerTest().

◆ 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 87 of file Timer.cpp.

88 {
89  std::string def("default");
90  char *argv = new char [def.length()+1];
91  std::strcpy(argv,def.c_str());
94 
95  PrintElapsedRegions(comm);
96 }
static void PrintElapsedRegions()
Print elapsed time and call count for each region with default serial communicator.
Definition: Timer.cpp:87
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 = 1 
)
static

Print elapsed time and call count for each region.

Definition at line 98 of file Timer.cpp.

101 {
102  std::vector<std::string> labels{
103  "Region",
104  "Elapsed time Avg (s)",
105  "Min (s)",
106  "Max (s)",
107  "Count"};
108 
109 
110  if (comm->GetRank() == 0 &&
111  m_elapsedRegion.begin() != m_elapsedRegion.end())
112  {
113  o << "-------------------------------------------\n";
114  o << std::setw(m_maxStringWidth+2) << labels[0] << '\t'
115  << std::setw(10) << labels[1] << '\t'
116  << std::setw(10) << labels[2] << '\t'
117  << std::setw(10) << labels[3] << '\t'
118  << std::setw(10) << labels[4] << '\n';
119  }
120  // first write out execute time
121  auto item = m_elapsedRegion.find("Execute");
122  if(item != m_elapsedRegion.end())
123  {
124  auto elapsedAve = std::get<0>(item->second).count();
125  comm->AllReduce(elapsedAve, LibUtilities::ReduceSum);
126  elapsedAve /= comm->GetSize();
127  auto elapsedMin = std::get<0>(item->second).count();
128  comm->AllReduce(elapsedMin, LibUtilities::ReduceMin);
129  auto elapsedMax = std::get<0>(item->second).count();
130  comm->AllReduce(elapsedMax, LibUtilities::ReduceMax);
131 
132  if (comm->GetRank() == 0)
133  {
134  o << std::setw(m_maxStringWidth+2) << item->first << '\t'
135  << std::setw(10) << elapsedAve << '\t'
136  << std::setw(10) << elapsedMin << '\t'
137  << std::setw(10) << elapsedMax << '\t'
138  << std::setw(10) << std::get<1>(item->second) << '\n';
139  }
140  }
141 
142  // write out all other timings order alphabetically on string
143  for (auto item = m_elapsedRegion.begin();
144  item != m_elapsedRegion.end(); ++item)
145  {
146  if(std::get<2>(item->second) < iolevel)
147  {
148  if(boost::iequals(item->first,"Execute"))
149  {
150  continue;
151  }
152 
153  auto elapsedAve = std::get<0>(item->second).count();
154  comm->AllReduce(elapsedAve, LibUtilities::ReduceSum);
155  elapsedAve /= comm->GetSize();
156  auto elapsedMin = std::get<0>(item->second).count();
157  comm->AllReduce(elapsedMin, LibUtilities::ReduceMin);
158  auto elapsedMax = std::get<0>(item->second).count();
159  comm->AllReduce(elapsedMax, LibUtilities::ReduceMax);
160 
161  if (comm->GetRank() == 0)
162  {
163  o << std::setw(m_maxStringWidth+2) << item->first << '\t'
164  << std::setw(10) << elapsedAve << '\t'
165  << std::setw(10) << elapsedMin << '\t'
166  << std::setw(10) << elapsedMax << '\t'
167  << std::setw(10) << std::get<1>(item->second) << '\n';
168  }
169  }
170  }
171 }

References m_elapsedRegion, m_maxStringWidth, 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  m_start = Clock::now();
50 }

References m_start.

Referenced by Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), Nektar::SpatialDomains::MeshGraphHDF5::PartitionMesh(), Nektar::FieldUtils::InputXml::Process(), Nektar::FieldUtils::ProcessCreateExp::Process(), Nektar::FieldUtils::ProcessIsoContour::Process(), Nektar::SolverUtils::CouplingCwipi::ReceiveCwipi(), Nektar::SolverUtils::CouplingCwipi::ReceiveStart(), RunModule(), Nektar::SolverUtils::CouplingCwipi::SendComplete(), 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::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), 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::DriverSteadyState::v_Execute(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::Dummy::v_PostIntegrate(), and Nektar::SolverUtils::CouplingCwipi::v_Send().

◆ Stop()

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

Definition at line 52 of file Timer.cpp.

53 {
54  m_end = Clock::now();
55 }

References m_end.

Referenced by Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::MultiRegions::ExpList::IProductWRTDerivBase(), main(), Nektar::SpatialDomains::MeshGraphHDF5::PartitionMesh(), Nektar::FieldUtils::InputXml::Process(), Nektar::FieldUtils::ProcessCreateExp::Process(), Nektar::FieldUtils::ProcessIsoContour::Process(), Nektar::SolverUtils::CouplingCwipi::ReceiveCwipi(), Nektar::SolverUtils::CouplingCwipi::ReceiveStart(), RunModule(), Nektar::SolverUtils::CouplingCwipi::SendComplete(), 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_IterPerExp(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), 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::MultiRegions::ExpList::v_PhysDeriv(), Nektar::Dummy::v_PostIntegrate(), 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
private

Definition at line 88 of file Timer.h.

Referenced by Elapsed(), and Stop().

◆ m_maxStringWidth

unsigned short Nektar::LibUtilities::Timer::m_maxStringWidth = 10
staticprivate

Definition at line 91 of file Timer.h.

Referenced by AccumulateRegion(), and PrintElapsedRegions().

◆ m_start

CounterType Nektar::LibUtilities::Timer::m_start
private

Definition at line 87 of file Timer.h.

Referenced by Elapsed(), and Start().