1 // @HEADER
2 // @HEADER
3 
4 #include "Teuchos_UnitTestHarness.hpp"
5 #include "Teuchos_UnitTestRepository.hpp"
6 #include "Teuchos_GlobalMPISession.hpp"
7 #include "Teuchos_PerformanceMonitorBase.hpp"
8 #include "Teuchos_TimeMonitor.hpp"
9 #include "Teuchos_StackedTimer.hpp"
10 #include "Teuchos_DefaultComm.hpp"
11 #include <sstream>
12 #include <thread> // std::this_thread::sleep_for;
13 #include <tuple>
14 #include <regex>
15 #include <iterator>
16 #include <limits>
17 
18 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
19 #include "Kokkos_Core.hpp"
20 #endif
21 
22 
TEUCHOS_UNIT_TEST(StackedTimer,minmax_hist)23 TEUCHOS_UNIT_TEST(StackedTimer, minmax_hist)
24 {
25 
26   Teuchos::StackedTimer timer("L0");
27   timer.stopBaseTimer();
28 
29   const Teuchos::RCP<const Teuchos::Comm<int>> comm = Teuchos::DefaultComm<int>::getComm();
30   if (comm->getSize() != 4)
31     return;
32   const int myRank = Teuchos::rank(*comm);
33 
34   if ((myRank == 1) || (myRank == 2)) {
35     timer.start("T0");
36     timer.stop("T0");
37     const_cast<Teuchos::BaseTimer*>(timer.findBaseTimer("L0@T0"))->setAccumulatedTime(Teuchos::as<double>(myRank));
38   } else {
39     timer.start("T1");
40     timer.stop("T1");
41     const_cast<Teuchos::BaseTimer*>(timer.findBaseTimer("L0@T1"))->setAccumulatedTime(Teuchos::as<double>(myRank));
42   }
43 
44   Teuchos::StackedTimer::OutputOptions options;
45 
46   out << "\n### Printing default report ###" << std::endl;
47   options.output_minmax=true;
48   options.output_proc_minmax=true;
49   options.output_histogram=true;
50   options.num_histogram=2;
51   options.output_fraction=false;
52   timer.report(out, comm, options);
53   {
54     std::ostringstream os;
55     timer.report(os, comm, options);
56     if (myRank == 0) {
57       TEST_ASSERT(os.str().find("min=1, max=2, proc min=1, proc max=2") != std::string::npos);
58       TEST_ASSERT(os.str().find("<1, 1>") != std::string::npos);
59       TEST_ASSERT(os.str().find("min=0, max=3, proc min=0, proc max=3") != std::string::npos);
60     }
61   }
62 }
63 
64 // Use our own main to initialize kokkos before calling
65 // runUnitTestsFromMain(). The kokkos space_time_stack profiler seg
66 // faults due to inconsistent push/pop of timers in the teuchos unit
67 // test startup code. By calling initialize here we can use the
68 // space_time_stack profiler with this unit test.
main(int argc,char * argv[])69 int main( int argc, char* argv[] )
70 {
71   // Note that the dtor for GlobalMPISession will call
72   // Kokkos::finalize_all().
73   Teuchos::GlobalMPISession mpiSession(&argc, &argv);
74 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
75   Kokkos::initialize(argc,argv);
76 #endif
77   {
78     Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
79     out.setOutputToRootOnly(0);
80   }
81   Teuchos::UnitTestRepository::setGloballyReduceTestResult(true);
82 
83   auto return_val = Teuchos::UnitTestRepository::runUnitTestsFromMain(argc, argv);
84 #if defined(HAVE_TEUCHOS_KOKKOS_PROFILING) && defined(HAVE_TEUCHOSCORE_KOKKOSCORE)
85   if (Kokkos::is_initialized())
86     Kokkos::finalize_all();
87 #endif
88   return return_val;
89 }
90