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 49 of file Timer.h.

Member Typedef Documentation

◆ Clock

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

Definition at line 52 of file Timer.h.

◆ CounterType

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

Definition at line 53 of file Timer.h.

◆ Seconds

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

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

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

References Elapsed(), and m_elapsedRegion.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::SolverUtils::AdvectionWeakDG::AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::AdvectTraceFlux(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::PyrCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::TriCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::LibUtilities::NekLinSysIterGMRESLoc::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::UnsteadyInviscidBurgers::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff1D(), Nektar::CFSImplicit::PreconCoeff(), Nektar::PulseWavePropagation::SetPulseWaveBoundaryConditions(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseCoeffs(), Nektar::SolverUtils::DiffusionIP::v_DiffuseTraceFlux(), Nektar::SolverUtils::DiffusionIP::v_DiffuseVolumeFlux(), Nektar::PreconCfsBRJ::v_DoPreconCfs(), Nektar::PulseWaveSystem::v_DoSolve(), Nektar::VelocityCorrectionScheme::v_EvaluateAdvection_SetPressureBCs(), Nektar::VCSImplicit::v_EvaluateAdvection_SetPressureBCs(), Nektar::MultiRegions::ExpList::v_IProductWRTBase(), Nektar::MultiRegions::ExpList::v_IProductWRTDerivBase(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::MultiRegions::ExpList::v_PhysInterp1DScaled(), and Nektar::VelocityCorrectionScheme::v_SolveUnsteadyStokesSystem().

◆ Elapsed()

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

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

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

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and PrintElapsedRegions().

Referenced by Nektar::TriCollectionTests::BOOST_AUTO_TEST_CASE(), and PrintElapsedRegions().

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

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

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

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

References ASSERTL0, m_isactive, and m_start.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::SolverUtils::AdvectionWeakDG::AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::AdvectTraceFlux(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::PyrCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::TriCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::LibUtilities::NekLinSysIterGMRESLoc::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::UnsteadyInviscidBurgers::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::SolverUtils::DriverParallelInTime::EstimateCommunicationTime(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff1D(), 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::MultiRegions::AssemblyCommDG::Timing(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseCoeffs(), 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::VCSImplicit::v_EvaluateAdvection_SetPressureBCs(), Nektar::SolverUtils::DriverAdaptive::v_Execute(), Nektar::SolverUtils::DriverParareal::v_Execute(), Nektar::SolverUtils::DriverPFASST::v_Execute(), Nektar::SolverUtils::DriverStandard::v_Execute(), Nektar::SolverUtils::DriverSteadyState::v_Execute(), Nektar::MultiRegions::ExpList::v_IProductWRTBase(), Nektar::MultiRegions::ExpList::v_IProductWRTDerivBase(), Nektar::SpatialDomains::MeshGraphHDF5::v_PartitionMesh(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::MultiRegions::ExpList::v_PhysInterp1DScaled(), Nektar::Dummy::v_PostIntegrate(), Nektar::FieldUtils::InputXml::v_Process(), Nektar::FieldUtils::ProcessCreateExp::v_Process(), Nektar::FieldUtils::ProcessIsoContour::v_Process(), Nektar::SolverUtils::CouplingCwipi::v_Send(), and Nektar::VelocityCorrectionScheme::v_SolveUnsteadyStokesSystem().

◆ Stop()

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

Definition at line 51 of file Timer.cpp.

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

References ASSERTL0, m_end, and m_isactive.

Referenced by Nektar::CFSImplicit::AddMatNSBlkDiagBnd(), Nektar::SolverUtils::AdvectionWeakDG::AdvectCoeffs(), Nektar::SolverUtils::AdvectionWeakDG::AdvectTraceFlux(), Nektar::PulseWaveSystem::BifurcationRiemann(), Nektar::PyrCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::TriCollectionTests::BOOST_AUTO_TEST_CASE(), Nektar::CFSImplicit::CalcPreconMatBRJCoeff(), Nektar::SolverUtils::DiffusionIP::CalcTraceNumFlux(), Nektar::SolverUtils::DriverSteadyState::ConvergenceHistory(), Nektar::FieldUtils::Field::CreateExp(), Nektar::LibUtilities::NekLinSysIterGMRES::DoArnoldi(), Nektar::LibUtilities::NekLinSysIterGMRESLoc::DoArnoldi(), Nektar::UnsteadyAdvection::DoOdeRhs(), Nektar::UnsteadyInviscidBurgers::DoOdeRhs(), Nektar::CompressibleFlowSystem::DoOdeRhs(), Nektar::PulseWavePropagation::DoOdeRhs(), Nektar::CFSImplicit::DoOdeRhsCoeff(), Nektar::SolverUtils::CouplingCwipi::DumpRawFields(), Nektar::PulseWaveSystem::EnforceInterfaceConditions(), Nektar::SolverUtils::DriverParallelInTime::EstimateCommunicationTime(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::Evaluate(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator::EvaluateAtPoint(), Nektar::SolverUtils::CouplingCwipi::ExtrapolateFields(), Nektar::PulseWaveSystem::FillDataFromInterfacePoint(), Nektar::PulseWavePropagation::GetFluxVector(), Nektar::PulseWaveSystem::InterfaceRiemann(), main(), Nektar::PulseWaveSystem::MergingRiemann(), Nektar::PreconCfsBRJ::MinusOffDiag2Rhs(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff(), Nektar::CFSImplicit::NonlinSysEvaluatorCoeff1D(), 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::MultiRegions::AssemblyCommDG::Timing(), Nektar::SolverUtils::AdvectionWeakDG::v_Advect(), Nektar::NavierStokesAdvection::v_Advect(), Nektar::MultiRegions::ExpList::v_BwdTrans(), Nektar::SolverUtils::DiffusionIP::v_Diffuse(), Nektar::SolverUtils::DiffusionIP::v_DiffuseCoeffs(), 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::VCSImplicit::v_EvaluateAdvection_SetPressureBCs(), Nektar::SolverUtils::DriverAdaptive::v_Execute(), Nektar::SolverUtils::DriverParareal::v_Execute(), Nektar::SolverUtils::DriverPFASST::v_Execute(), Nektar::SolverUtils::DriverStandard::v_Execute(), Nektar::MultiRegions::ExpList::v_IProductWRTBase(), Nektar::MultiRegions::ExpList::v_IProductWRTDerivBase(), Nektar::SpatialDomains::MeshGraphHDF5::v_PartitionMesh(), Nektar::MultiRegions::ExpList::v_PhysDeriv(), Nektar::MultiRegions::ExpList::v_PhysInterp1DScaled(), Nektar::Dummy::v_PostIntegrate(), Nektar::FieldUtils::InputXml::v_Process(), Nektar::FieldUtils::ProcessCreateExp::v_Process(), Nektar::FieldUtils::ProcessIsoContour::v_Process(), Nektar::SolverUtils::CouplingCwipi::v_Send(), and Nektar::VelocityCorrectionScheme::v_SolveUnsteadyStokesSystem().

◆ 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 88 of file Timer.h.

Referenced by AccumulateRegion(), and PrintElapsedRegions().

◆ m_end

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

Definition at line 85 of file Timer.h.

Referenced by Elapsed(), and Stop().

◆ m_isactive

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

Definition at line 86 of file Timer.h.

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

◆ m_start

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

Definition at line 84 of file Timer.h.

Referenced by Elapsed(), and Start().