18#if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
19#include "Kokkos_Core.hpp"
73 const int myRank = Teuchos::rank(*comm);
78 timer.
start(
"Total Time");
80 for (
int i=0; i < 10; ++i) {
82 timer.
start(
"Assembly");
83 std::this_thread::sleep_for(std::chrono::milliseconds{100});
84 timer.
stop(
"Assembly");
89 std::this_thread::sleep_for(std::chrono::milliseconds{50});
94 const std::string label =
"Rank 0 ONLY";
96 std::this_thread::sleep_for(std::chrono::milliseconds{50});
101 timer.
start(
"Not Rank 0");
102 std::this_thread::sleep_for(std::chrono::milliseconds{50});
104 timer.
stop(
"Not Rank 0");
112 timer.
stop(
"Total Time");
137 std::stringstream sout1;
138 timer.
report(sout1, comm, options);
142 std::stringstream sout2;
143 timer.
report(sout2, comm, options);
147 std::vector<std::tuple<std::string,double,unsigned long>> lineChecks;
148 lineChecks.push_back(std::make_tuple(
"My New Timer:",2.0,1));
149 lineChecks.push_back(std::make_tuple(
"Total Time:",2.0,1));
150 lineChecks.push_back(std::make_tuple(
"Assembly:",1.0,10));
151 lineChecks.push_back(std::make_tuple(
"Solve:",1.0,10));
152 lineChecks.push_back(std::make_tuple(
"Prec:",0.5,10));
161#if !defined(__GNUC__) \
162 || ( defined(__GNUC__) && (__GNUC__ > 4) ) \
163 || ( defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC__MINOR__ > 8) )
166 const double timerTolerance = 0.25;
167 std::istringstream is(sout1.str());
168 for (
const auto& check : lineChecks) {
171 std::getline(is,line);
172 std::smatch regexSMatch;
173 std::regex timerName(std::get<0>(check));
174 std::regex_search(line,regexSMatch,timerName);
178 std::regex delimiter(
":\\s|\\s\\[|\\]\\s");
179 std::sregex_token_iterator tok(line.begin(), line.end(),delimiter,-1);
181 const std::string timeAsString = (++tok)->str();
182 const double time = std::stod(timeAsString);
185 const std::string countAsString = (++tok)->str();
186 const unsigned long count = std::stoul(countAsString);
193 out <<
"\n### Printing default report ###" << std::endl;
195 timer.
report(out, comm, defaultOptions);
198 out <<
"\n### Printing aligned_column with timers names on left ###" << std::endl;
205 timer.
report(out, comm, options);
209 out <<
"\n### Printing aligned_column with timers names on right ###" << std::endl;
217 std::string reportOut;
219 std::ostringstream reportOut1;
220 timer.
report(reportOut1, comm, options);
221 std::ostringstream reportOut2;
222 timer.
report(reportOut2, comm, options);
223 reportOut = reportOut1.str();
226 std::string reportXmlOut;
228 std::ostringstream reportOut1;
229 timer.
reportXML(reportOut1,
"2020_01_01",
"2020-01-01T01:02:03", comm);
230 std::ostringstream reportOut2;
231 timer.
reportXML(reportOut2,
"2020_01_01",
"2020-01-01T01:02:03", comm);
232 reportXmlOut = reportOut1.str();
235 out << reportOut <<
'\n';
236 out << reportXmlOut <<
'\n';
242 const int myRank = Teuchos::rank(*comm);
246 timer->startBaseTimer();
247 for (
int i=0; i < 10; ++i) {
248 timer-> start(
"Subtask");
249 timer->incrementUpdates();
250 timer->incrementUpdates(2);
251 timer-> stop(
"Subtask");
253 timer->stopBaseTimer();
258 auto sub_timer =
const_cast<Teuchos::BaseTimer*
>(timer->findBaseTimer(
"Total Time@Subtask"));
263 TEST_THROW(timer->findBaseTimer(
"Testing misspelled timer name!"),std::runtime_error);
277 top_timer->setAccumulatedTime(5000.0);
278 top_timer->overrideNumCallsForUnitTesting(2);
279 top_timer->overrideNumUpdatesForUnitTesting(3);
280 sub_timer->setAccumulatedTime(4000.0);
281 sub_timer->overrideNumCallsForUnitTesting(4);
282 sub_timer->overrideNumUpdatesForUnitTesting(5);
284 const double timerTolerance = 100.0 * std::numeric_limits<double>::epsilon();
309 TEST_ASSERT(nonnull(timeMonitorDefaultStackedTimer));
311 TEST_ASSERT(timeMonitorDefaultStackedTimer != timer);
315 timer->start(
"Total Time");
317 for (
int i=0; i < 10; ++i) {
319 timer->start(
"Assembly");
323 std::this_thread::sleep_for(std::chrono::milliseconds{25});
327 std::this_thread::sleep_for(std::chrono::milliseconds{75});
330 std::this_thread::sleep_for(std::chrono::milliseconds{100});
332 timer->stop(
"Assembly");
333 timer->start(
"Solve");
337 std::this_thread::sleep_for(std::chrono::milliseconds{50});
341 std::this_thread::sleep_for(std::chrono::milliseconds{50});
344 std::this_thread::sleep_for(std::chrono::milliseconds{100});
346 timer->stop(
"Solve");
347 std::this_thread::sleep_for(std::chrono::milliseconds{100});
350 timer->stop(
"Total Time");
351 timer->stopBaseTimer();
353 assert(size(*comm)>0);
355 TEST_EQUALITY((timer->findTimer(
"TM:Interoperability@Total Time")).count, 1);
356 TEST_EQUALITY((timer->findTimer(
"TM:Interoperability@Total Time@Assembly")).count, 10);
359#ifdef HAVE_TEUCHOS_ADD_TIME_MONITOR_TO_STACKED_TIMER
360 TEST_EQUALITY((timer->findTimer(
"TM:Interoperability@Total Time@Solve@Prec")).count, 10);
361 TEST_EQUALITY((timer->findTimer(
"TM:Interoperability@Total Time@Solve@GMRES")).count, 10);
365 out <<
"\n### Printing default report ###" << std::endl;
369 timer->report(out, comm, options);
371 out <<
"\n### Printing aligned_column with timers names on left ###" << std::endl;
373 timer->report(out, comm, options);
375 out <<
"\n### Printing aligned_column with timers names on right ###" << std::endl;
382 timer->report(out, comm, options);
385 out <<
"\n### Printing with max_levels=2 ###" << std::endl;
389 timer->report(out, comm, options);
419 const int myRank = Teuchos::rank(*comm);
423 out <<
"\n### Printing default report ###" << std::endl;
427 timer.
report(out, comm, options);
429 std::ostringstream os;
430 timer.
report(os, comm, options);
432 TEST_ASSERT(os.str().find(
"L2a") == std::string::npos);
433 TEST_ASSERT(os.str().find(
"L2b") != std::string::npos);
434 TEST_ASSERT(os.str().find(
"L1b") == std::string::npos);
438 out <<
"\n### Printing aligned_column with timers names on left ###" << std::endl;
440 timer.
report(out, comm, options);
442 std::ostringstream os;
443 timer.
report(os, comm, options);
445 TEST_ASSERT(os.str().find(
"L2a") == std::string::npos);
446 TEST_ASSERT(os.str().find(
"L2b") != std::string::npos);
447 TEST_ASSERT(os.str().find(
"L1b") == std::string::npos);
451 out <<
"\n### Printing aligned_column with timers names on right ###" << std::endl;
454 timer.
report(out, comm, options);
456 std::ostringstream os;
457 timer.
report(os, comm, options);
459 TEST_ASSERT(os.str().find(
"L2a") == std::string::npos);
460 TEST_ASSERT(os.str().find(
"L2b") != std::string::npos);
461 TEST_ASSERT(os.str().find(
"L1b") == std::string::npos);
473 if (comm->getSize() < 2)
475 const int myRank = Teuchos::rank(*comm);
479 else if (myRank == 1)
486 out <<
"\n### Printing default report ###" << std::endl;
492 timer.
report(out, comm, options);
494 std::ostringstream os;
495 timer.
report(os, comm, options);
497 TEST_ASSERT(os.str().find(
"proc min=0") != std::string::npos);
498 TEST_ASSERT(os.str().find(
"proc max=1") != std::string::npos);
521 timer.
start(
"Outer");
522 timer.
start(
"Inner");
531#ifdef HAVE_TEUCHOS_ADD_TIME_MONITOR_TO_STACKED_TIMER
549int main(
int argc,
char* argv[] )
554#if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
555 Kokkos::initialize(argc,argv);
564#if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
565 if (Kokkos::is_initialized())
573#if !defined(__GNUC__) || ( defined(__GNUC__) && (__GNUC__ > 4) )
580 std::ostringstream os;
591 out << os.str() << std::endl;
597 TEST_ASSERT(os.str().find(
"L1") != std::string::npos);
598 TEST_ASSERT(os.str().find(
"L2") != std::string::npos);
599 TEST_ASSERT(os.str().find(
"L3") == std::string::npos);
608 timer.
start(
"Total Time");
610 for (
int i=0; i < 10; ++i) {
612 timer.
start(
"Assembly");
613 timer.
stop(
"Assembly");
619 timer.
start(
"Solve");
632 timer.
start(
"Restarted");
633 timer.
stop(
"Restarted");
636 timer.
stop(
"Total Time");
A MPI utilities class, providing methods for initializing, finalizing, and querying the global MPI se...
#define TEST_ASSERT(v1)
Assert the given statement is true.
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
#define TEST_THROW(code, ExceptType)
Assert that the statement 'code' throws the exception 'ExceptType' (otherwise the test fails).
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
Assert the relative floating-point equality of rel_error(v1,v2) <= tol.
Scope guard for Teuchos::Time, with MPI collective timer reporting.
#define TEUCHOS_UNIT_TEST(TEST_GROUP, TEST_NAME)
Macro for defining a (non-templated) unit test.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
void push_back(const value_type &x)
the basic timer used elsewhere, uses MPI_Wtime for time
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Return the default global communicator.
Initialize, finalize, and query the global MPI session.
Smart reference counting pointer class for automatic garbage collection.
This class allows one to push and pop timers on and off a stack.
void start(const std::string name, const bool push_kokkos_profiling_region=true)
BaseTimer::TimeInfo findTimer(const std::string &name)
void stop(const std::string &name, const bool pop_kokkos_profiling_region=true)
const BaseTimer * findBaseTimer(const std::string &name) const
void report(std::ostream &os)
void enableVerboseTimestamps(const unsigned levels)
Enable timestamps in verbose mode for the number of levels specified.
void setVerboseOstream(const Teuchos::RCP< std::ostream > &os)
Set the ostream for verbose mode(defaults to std::cout).
void enableVerbose(const bool enable_verbose)
If set to true, print timer start/stop to verbose ostream.
void reportXML(std::ostream &os, const std::string &datestamp, const std::string ×tamp, Teuchos::RCP< const Teuchos::Comm< int > > comm)
Scope guard for Time, that can compute MPI collective timer statistics.
static Teuchos::RCP< Teuchos::StackedTimer > getStackedTimer()
The StackedTimer used by the TimeMonitor.
static void setStackedTimer(const Teuchos::RCP< Teuchos::StackedTimer > &t)
Sets the StackedTimer into which the TimeMonitor will insert timings.
static RCP< Time > getNewTimer(const std::string &name)
Return a new timer with the given name (class method).
static int runUnitTestsFromMain(int argc, char *argv[])
Run the unit tests from main() passing in (argc, argv).
static void setGloballyReduceTestResult(const bool globallyReduceUnitTestResult)
Set if the unit tests should reduce pass/fail across processes.
std::ostream subclass that performs the magic of indenting data sent to an std::ostream object among ...
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
Set the stream to print only on the (MPI) process with the given rank.
bool is_null(const boost::shared_ptr< T > &p)
Returns true if p.get()==NULL.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
void unsortedMergePair(const Array< std::string > &localNames, Array< std::string > &globalNames, const ECounterSetOp setOp)
bool print_names_before_values
bool output_total_updates