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