40 #ifndef TEUCHOS_STACKED_TIMER_HPP 41 #define TEUCHOS_STACKED_TIMER_HPP 59 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE) 62 extern void pushRegion (
const std::string&);
63 extern void popRegion ();
72 void error_out(
const std::string& msg,
const bool fail_all =
false);
87 using Clock = std::chrono::high_resolution_clock;
94 error_out(
"Base_Timer:start Failed timer already running");
104 error_out(
"Base_Timer:stop Failed timer not running");
163 error_out(
"BaseTimer, cannot reset a running timer");
254 const char* name =
"RootTimer",
256 bool start_timer=
true) :
299 error_out(
"Stopping timer "+name+
" But top level running timer is "+
name_);
310 std::string parent_name(
"");
314 std::string my_name(
name_);
316 std::string full_name = parent_name + my_name;
345 if (locate_name ==
"")
348 std::string first_name,second_name;
350 size_t i = locate_name.find_first_of(
'@');
351 if ( i >= locate_name.size() ) {
352 first_name = locate_name;
355 first_name.assign(locate_name,0,i);
356 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
360 return sub_timers_[j].accumulatedTime(second_name);
375 void splitString(
const std::string &locate_name, std::string &first_name, std::string &second_name) {
376 size_t i = locate_name.find_first_of(
'@');
377 if ( i >= locate_name.size() ) {
378 first_name = locate_name;
381 first_name.assign(locate_name,0,i);
382 second_name.assign(locate_name,i+1,locate_name.size()-i-1);
394 if (locate_name ==
"")
397 std::string first_name,second_name;
402 return sub_timers_[j].accumulatedTimePerUpdate(second_name);
413 if (locate_name ==
"")
416 std::string first_name,second_name;
421 return sub_timers_[j].accumulatedTimePerTimerCall(second_name);
441 void report(std::ostream &os);
472 explicit StackedTimer(
const char *name,
const bool start_base_timer =
true)
473 :
timer_(0,name,nullptr,false),
479 if (start_base_timer)
482 auto check_verbose = std::getenv(
"TEUCHOS_ENABLE_VERBOSE_TIMERS");
483 if (check_verbose !=
nullptr)
486 auto check_timestamp = std::getenv(
"TEUCHOS_ENABLE_VERBOSE_TIMESTAMP_LEVELS");
487 if (check_timestamp !=
nullptr) {
496 timer_.BaseTimer::start();
497 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE) 507 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE) 508 ::Kokkos::Profiling::popRegion();
518 const bool push_kokkos_profiling_region =
true) {
523 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE) 524 if (push_kokkos_profiling_region) {
525 ::Kokkos::Profiling::pushRegion(name);
534 #if !defined(__GNUC__) || ( defined(__GNUC__) && (__GNUC__ > 4) ) 535 else if (
top_ !=
nullptr) {
537 auto now = std::chrono::system_clock::now();
538 auto now_time = std::chrono::system_clock::to_time_t(now);
539 auto gmt = gmtime(&now_time);
540 auto timestamp = std::put_time(gmt,
"%Y-%m-%d %H:%M:%S");
541 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
554 void stop(
const std::string &name,
555 const bool pop_kokkos_profiling_region =
true) {
560 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE) 561 if (pop_kokkos_profiling_region) {
562 ::Kokkos::Profiling::popRegion();
571 #if !defined(__GNUC__) || ( defined(__GNUC__) && (__GNUC__ > 4) ) 573 else if (
top_ !=
nullptr) {
575 auto now = std::chrono::system_clock::now();
576 auto now_time = std::chrono::system_clock::to_time_t(now);
577 auto gmt = gmtime(&now_time);
578 auto timestamp = std::put_time(gmt,
"%Y-%m-%d %H:%M:%S");
579 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
638 "StackedTimer::findBaseTimer() failed to find a timer named \"" << name <<
"\"!\n");
648 bool foundTimer =
false;
651 "StackedTimer::findTimer() failed to find a timer named \"" << name <<
"\"!\n");
821 std::vector<bool> &printed,
double parent_time,
827 double printLevel(std::string prefix,
int level, std::ostream &os, std::vector<bool> &printed,
834 double printLevelXML(std::string prefix,
int level, std::ostream &os, std::vector<bool> &printed,
double parent_time,
const std::string& rootName =
"");
void setAccumulatedTime(double accum=0)
Setter for accumulated time.
double accumulatedTimePerTimerCall(const std::string &name="")
Clock::time_point start_time_
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_
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_
std::string::size_type total_updates_
std::string::size_type procmax_
std::vector< LevelTimer > sub_timers_
void addTimerNames(Array< std::string > &names, unsigned &pos)
unsigned long count_started_
void enableVerboseTimestamps(const unsigned levels)
const BaseTimer * findBaseTimer(const std::string &name) const
double accumulatedTimePerUpdate() const
return the average time per item updated
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.
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
std::string::size_type procmin_
bool enable_verbose_
If set to true, prints to the debug ostream. At construction, default value is set from environment v...
unsigned long long numUpdates() const
Returns the number of updates added to this timer.
void incrementUpdates(const long long i=1)
double printLevelXML(std::string prefix, int level, std::ostream &os, std::vector< bool > &printed, double parent_time, const std::string &rootName="")
double accumulatedTime() const
Get the total accumulated time since last reset or construction when the timer is running...
void start()
Start a currently stopped timer.
LevelTimer * top_
Current level running.
double accumulatedTimePerUpdate(const std::string &name="")
std::string reportWatchrXML(const std::string &name, Teuchos::RCP< const Teuchos::Comm< int > > comm)
unsigned verbose_timestamp_levels_
If set to a value greater than 0, verbose mode will print that many levels of timers with timestamps...
bool running() const
Returns true if the timer is currently accumulating time.
BaseTimer::TimeInfo findTimer(const std::string &name, bool &found)
const BaseTimer * findBaseTimer(const std::string &name) const
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)
void reportXML(std::ostream &os, const std::string &datestamp, const std::string ×tamp, Teuchos::RCP< const Teuchos::Comm< int > > comm)
double difference(const BaseTimer &from) const
Return the difference between two timers in seconds,.
Stores the column widths for output alignment.
Array< Array< int > > hist_
double accumulatedTimePerTimerCall() const
return the average time per timer start/stop
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_
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.
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_
std::string get_full_name() const
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.
unsigned level() const
Returns the level of the timer in the stack.
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.
Array< unsigned long > count_
std::string::size_type stddev_
unsigned long long updates
bool output_total_updates
Reference-counted pointer class and non-member templated function implementations.
LevelTimer * start(const char *sub_name)
unsigned long numCalls() const
Returns the number of calls to start().
struct Teuchos::StackedTimer::AlignmentWidths alignments_