4 #ifndef TEUCHOS_STACKED_TIMER_HPP
5 #define TEUCHOS_STACKED_TIMER_HPP
8 #include "Teuchos_Comm.hpp"
9 #include "Teuchos_DefaultComm.hpp"
10 #include "Teuchos_CommHelpers.hpp"
20 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
23 extern void pushRegion (
const std::string&);
24 extern void popRegion ();
33 void error_out(
const std::string& msg,
const bool fail_all =
false);
48 using Clock = std::chrono::high_resolution_clock;
50 BaseTimer() : accumulation_(0.0), count_started_(0), count_updates_(0), running_(
false) {}
55 error_out(
"Base_Timer:start Failed timer already running");
56 start_time_ = Clock::now();
65 error_out(
"Base_Timer:stop Failed timer not running");
66 accumulation_ += std::chrono::duration_cast<std::chrono::duration<double>>(Clock::now() - start_time_).count();
71 unsigned long long incrementUpdates(
unsigned long long count=1) {count_updates_ += count;
return count_updates_;}
88 if (count_updates_ > 0) {
89 return accumulation_/count_updates_;
104 if (count_started_> 0) {
105 return accumulation_/count_started_;
118 return accumulation_ - from.accumulation_;
124 error_out(
"BaseTimer, cannot reset a running timer");
126 count_started_ = count_updates_ = 0;
133 unsigned long numCalls()
const {
return count_started_; }
136 unsigned long long numUpdates()
const {
return count_updates_; }
140 { count_started_ = num_calls; }
144 { count_updates_ = num_updates; }
147 TimeInfo():time(0.0), count(0), updates(0),
running(false){}
148 TimeInfo(BaseTimer* t): time(t->accumulation_), count(t->count_started_), updates(t->count_updates_),
running(t->
running()) {}
151 unsigned long long updates;
156 double accumulation_;
157 unsigned long count_started_;
158 unsigned long long count_updates_;
159 Clock::time_point start_time_;
162 friend struct TimeInfo;
202 std::vector<LevelTimer> sub_timers_;
215 const char* name =
"RootTimer",
217 bool start_timer=
true) :
230 BaseTimer(src), level_(src.level_), name_(src.name_),parent_(src.parent_), sub_timers_(src.sub_timers_)
232 for (
unsigned i=0;i<sub_timers_.size();++i)
233 sub_timers_[i].parent_ =
this;
242 for (
unsigned i=0;i<sub_timers_.size();i++ )
243 if (sub_name == sub_timers_[i].name_ ) {
244 sub_timers_[i].BaseTimer::start();
245 return &sub_timers_[i];
247 sub_timers_.push_back(
LevelTimer(level_+1,sub_name,
this,
true));
248 return &sub_timers_[sub_timers_.size()-1];
260 error_out(
"Stopping timer "+name+
" But top level running timer is "+name_);
271 std::string parent_name(
"");
272 if ((parent_ !=
nullptr))
275 std::string my_name(name_);
277 std::string full_name = parent_name + my_name;
288 for (
unsigned i=0;i<sub_timers_.size(); ++i)
295 for (
unsigned i=0;i<sub_timers_.size(); ++i)
296 sub_timers_[i].addTimerNames(names, pos);
306 if (locate_name ==
"")
309 std::string first_name,second_name;
311 size_t i = locate_name.find_first_of(
'@');
312 if ( i >= locate_name.size() ) {
313 first_name = locate_name;
316 first_name.assign(locate_name,0,i);
317 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
319 for (
unsigned j=0;j<sub_timers_.size();++j)
320 if ( first_name == sub_timers_[j].name_)
321 return sub_timers_[j].accumulatedTime(second_name);
332 void splitString(
const std::string &locate_name, std::string &first_name, std::string &second_name) {
333 size_t i = locate_name.find_first_of(
'@');
334 if ( i >= locate_name.size() ) {
335 first_name = locate_name;
338 first_name.assign(locate_name,0,i);
339 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
351 if (locate_name ==
"")
354 std::string first_name,second_name;
357 for (
unsigned j=0;j<sub_timers_.size();j++)
358 if ( first_name == sub_timers_[j].name_)
359 return sub_timers_[j].accumulatedTimePerUpdate(second_name);
370 if (locate_name ==
"")
373 std::string first_name,second_name;
376 for (
unsigned j=0;j<sub_timers_.size();j++)
377 if ( first_name == sub_timers_[j].name_)
378 return sub_timers_[j].accumulatedTimePerTimerCall(second_name);
398 void report(std::ostream &os);
413 BaseTimer::TimeInfo
findTimer(
const std::string &name,
bool& found);
429 explicit StackedTimer(
const char *name,
const bool start_base_timer =
true)
430 :
timer_(0,name,nullptr,false)
433 if (start_base_timer)
441 timer_.BaseTimer::start();
442 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
452 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
453 ::Kokkos::Profiling::popRegion();
463 const bool push_kokkos_profiling_region =
true) {
468 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
469 if (push_kokkos_profiling_region) {
470 ::Kokkos::Profiling::pushRegion(name);
480 void stop(
const std::string &name,
481 const bool pop_kokkos_profiling_region =
true) {
486 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
487 if (pop_kokkos_profiling_region) {
488 ::Kokkos::Profiling::popRegion();
544 "StackedTimer::findBaseTimer() failed to find a timer named \"" << name <<
"\"!\n");
553 BaseTimer::TimeInfo
findTimer(
const std::string &name) {
554 bool foundTimer =
false;
557 "StackedTimer::findTimer() failed to find a timer named \"" << name <<
"\"!\n");
561 void report(std::ostream &os) {
567 OutputOptions() : output_fraction(
false), output_total_updates(
false), output_histogram(
false),
568 output_minmax(
false), num_histogram(10), max_levels(INT_MAX),
569 print_warnings(
true), align_columns(
false), print_names_before_values(
true) {}
570 bool output_fraction;
571 bool output_total_updates;
572 bool output_histogram;
578 bool print_names_before_values;
607 std::string::size_type timer_names_;
608 std::string::size_type average_time_;
609 std::string::size_type fraction_;
610 std::string::size_type count_;
611 std::string::size_type total_updates_;
612 std::string::size_type min_;
613 std::string::size_type max_;
614 std::string::size_type stddev_;
615 std::string::size_type histogram_;
651 std::vector<bool> &printed,
double parent_time,
657 double printLevel(std::string prefix,
int level, std::ostream &os, std::vector<bool> &printed,
void setAccumulatedTime(double accum=0)
Setter for accumulated time.
double accumulatedTimePerTimerCall(const std::string &name="")
double difference(const BaseTimer &from) const
Return the difference between two timers in seconds,.
StackedTimer(const char *name, const bool start_base_timer=true)
void overrideNumUpdatesForUnitTesting(const unsigned long long num_updates)
Sets the number of counts for this timer. This is only used for unit testing.
double accumulatedTime() const
Get the total accumulated time since last reset or construction when the timer is running...
void splitString(const std::string &locate_name, std::string &first_name, std::string &second_name)
split a string into two parts split by a '@' if no '@' first gets the full string ...
void stop(const std::string &name, const bool pop_kokkos_profiling_region=true)
LevelTimer(int level, const char *name="RootTimer", LevelTimer *parent=nullptr, bool start_timer=true)
unsigned long long incrementUpdates(unsigned long long count=1)
Increment the total number of items updated between a start stop.
bool running() const
Returns true if the timer is currently accumulating time.
double accumulatedTimePerTimerCall() const
return the average time per timer start/stop
void merge(Teuchos::RCP< const Teuchos::Comm< int > > comm)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
double accumulatedTimePerUpdate() const
return the average time per item updated
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
void incrementUpdates(const long long i=1)
void start()
Start a currently stopped timer.
LevelTimer * top_
Current level running.
double accumulatedTimePerUpdate(const std::string &name="")
unsigned long numCalls() const
Returns the number of calls to start().
BaseTimer::TimeInfo findTimer(const std::string &name, bool &found)
double printLevel(std::string prefix, int level, std::ostream &os, std::vector< bool > &printed, double parent_time, const OutputOptions &options)
LevelTimer * unpack(unsigned from)
double accumulatedTime(const std::string &name="")
void start(const std::string name, const bool push_kokkos_profiling_region=true)
double accumulatedTime(const std::string &locate_name="")
void report(std::ostream &os)
void overrideNumCallsForUnitTesting(const unsigned long num_calls)
Sets the number of calls to start() for this timer. This is only used for unit testing.
the basic timer used elsewhere, uses MPI_Wtime for time
double computeColumnWidthsForAligment(std::string prefix, int print_level, std::vector< bool > &printed, double parent_time, const OutputOptions &options)
Stores the column widths for output alignment.
void collectRemoteData(Teuchos::RCP< const Teuchos::Comm< int > > comm, const OutputOptions &options)
LevelTimer(const LevelTimer &src)
Copy constructor.
Timer info at a given level and all the children.
const BaseTimer * findBaseTimer(const std::string &name) const
double accumulatedTimePerUpdate(const std::string &locate_name="")
LevelTimer timer_
Base timer.
double accumulatedTimePerTimerCall(const std::string &locate_name="")
Templated array class derived from the STL std::vector.
void error_out(const std::string &msg, const bool)
Error reporting function for stacked timer.
Abstract interface for distributed-memory communication.
LevelTimer * stop(const std::string &name="RootTimer")
void reset()
Reset all the timer stats, throws if it is already running.
void stop()
Stop a current running timer and accumulate time difference.
LevelTimer()
Default constructor, shouldn't be used but needed for std::vector.
const BaseTimer * findBaseTimer(const std::string &name) const
Smart reference counting pointer class for automatic garbage collection.
BaseTimer::TimeInfo findTimer(const std::string &name)
This class allows one to push and pop timers on and off a stack.
unsigned long long numUpdates() const
Returns the number of updates added to this timer.
Struct for controlling output options like histograms.
Reference-counted pointer class and non-member templated function implementations.
LevelTimer * start(const char *sub_name)
std::string get_full_name() const