4 #ifndef TEUCHOS_STACKED_TIMER_HPP
5 #define TEUCHOS_STACKED_TIMER_HPP
22 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
25 extern void pushRegion (
const std::string&);
26 extern void popRegion ();
35 void error_out(
const std::string& msg,
const bool fail_all =
false);
50 using Clock = std::chrono::high_resolution_clock;
57 error_out(
"Base_Timer:start Failed timer already running");
67 error_out(
"Base_Timer:stop Failed timer not running");
126 error_out(
"BaseTimer, cannot reset a running timer");
217 const char* name =
"RootTimer",
219 bool start_timer=
true) :
262 error_out(
"Stopping timer "+name+
" But top level running timer is "+
name_);
273 std::string parent_name(
"");
277 std::string my_name(
name_);
279 std::string full_name = parent_name + my_name;
308 if (locate_name ==
"")
311 std::string first_name,second_name;
313 size_t i = locate_name.find_first_of(
'@');
314 if ( i >= locate_name.size() ) {
315 first_name = locate_name;
318 first_name.assign(locate_name,0,i);
319 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
323 return sub_timers_[j].accumulatedTime(second_name);
334 void splitString(
const std::string &locate_name, std::string &first_name, std::string &second_name) {
335 size_t i = locate_name.find_first_of(
'@');
336 if ( i >= locate_name.size() ) {
337 first_name = locate_name;
340 first_name.assign(locate_name,0,i);
341 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
353 if (locate_name ==
"")
356 std::string first_name,second_name;
361 return sub_timers_[j].accumulatedTimePerUpdate(second_name);
372 if (locate_name ==
"")
375 std::string first_name,second_name;
380 return sub_timers_[j].accumulatedTimePerTimerCall(second_name);
400 void report(std::ostream &os);
431 explicit StackedTimer(
const char *name,
const bool start_base_timer =
true)
432 :
timer_(0,name,nullptr,false),
437 if (start_base_timer)
440 auto check_verbose = std::getenv(
"TEUCHOS_ENABLE_VERBOSE_TIMERS");
441 if (check_verbose !=
nullptr)
449 timer_.BaseTimer::start();
450 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
460 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
461 ::Kokkos::Profiling::popRegion();
471 const bool push_kokkos_profiling_region =
true) {
476 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
477 if (push_kokkos_profiling_region) {
478 ::Kokkos::Profiling::pushRegion(name);
490 void stop(
const std::string &name,
491 const bool pop_kokkos_profiling_region =
true) {
496 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
497 if (pop_kokkos_profiling_region) {
498 ::Kokkos::Profiling::popRegion();
556 "StackedTimer::findBaseTimer() failed to find a timer named \"" << name <<
"\"!\n");
566 bool foundTimer =
false;
569 "StackedTimer::findTimer() failed to find a timer named \"" << name <<
"\"!\n");
675 std::vector<bool> &printed,
double parent_time,
681 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="")
Clock::time_point start_time_
double difference(const BaseTimer &from) const
Return the difference between two timers in seconds,.
void setVerboseOstream(const Teuchos::RCP< std::ostream > &os)
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.
std::string::size_type timer_names_
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.
std::string::size_type histogram_
std::string::size_type average_time_
bool running() const
Returns true if the timer is currently accumulating time.
std::string::size_type total_updates_
double accumulatedTimePerTimerCall() const
return the average time per timer start/stop
std::vector< LevelTimer > sub_timers_
void addTimerNames(Array< std::string > &names, unsigned &pos)
unsigned long count_started_
void enableVerbose(const bool enable_verbose)
void merge(Teuchos::RCP< const Teuchos::Comm< int > > comm)
std::string::size_type max_
#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...
bool enable_verbose_
If set to true, prints to the debug ostream. At construction, default value is set from environment v...
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="")
std::string::size_type fraction_
std::string::size_type count_
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.
Array< Array< int > > hist_
void collectRemoteData(Teuchos::RCP< const Teuchos::Comm< int > > comm, const OutputOptions &options)
std::chrono::high_resolution_clock Clock
LevelTimer(const LevelTimer &src)
Copy constructor.
bool print_names_before_values
Array< unsigned long long > updates_
Timer info at a given level and all the children.
std::string::size_type min_
const BaseTimer * findBaseTimer(const std::string &name) const
double accumulatedTimePerUpdate(const std::string &locate_name="")
Teuchos::RCP< std::ostream > verbose_ostream_
For debugging, this is the ostream used for printing.
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.
Array< std::string > flat_names_
void stop()
Stop a current running timer and accumulate time difference.
void report(std::ostream &os)
LevelTimer()
Default constructor, shouldn't be used but needed for std::vector.
const BaseTimer * findBaseTimer(const std::string &name) const
unsigned long long count_updates_
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.
Array< unsigned long > count_
std::string::size_type stddev_
unsigned long long updates
bool output_total_updates
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
struct Teuchos::StackedTimer::AlignmentWidths alignments_