Teuchos Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
SyncTimeMonitor.cpp
Go to the documentation of this file.
1// @HEADER
2// @HEADER
3
8#ifdef HAVE_TEUCHOS_MPI
10#endif // HAVE_TEUCHOS_MPI
11#include <thread>
12#include <chrono>
13
14// Check that timers are sync'd
15TEUCHOS_UNIT_TEST(TimeMonitor, SyncTimeMonitor) {
17 using Teuchos::Comm;
18 using Teuchos::outArg;
19 using Teuchos::RCP;
21 using Teuchos::reduceAll;
22 using Clock = std::chrono::high_resolution_clock;
23
24 RCP<const Comm<int> > comm = Teuchos::DefaultComm<int>::getComm ();
25
26 const int numProcs = comm->getSize ();
27 TEST_ASSERT( numProcs > 1 );
28 if (numProcs < 4) {
29 out << "This test requires at least 4 MPI processes." << std::endl;
30 return;
31 }
32
33 const int myRank = comm->getRank();
34
35 double time;
36 {
37 Clock::time_point start_time = Clock::now();
38 {
39 SyncTimeMonitor timer(*Teuchos::TimeMonitor::getNewTimer(std::string("myTimer")), comm.ptr());
40 // sleep a second on rank 1 only
41 if (myRank == 1)
42 std::this_thread::sleep_for (std::chrono::seconds(1));
43 }
44 time = std::chrono::duration_cast<std::chrono::duration<double>>(Clock::now() - start_time).count();
45 }
46
47 std::ostringstream out1;
48 Teuchos::TimeMonitor::summarize(out1,false,true,false,Teuchos::Union,"",true);
49 std::string outStr = out1.str();
50 int test = (outStr.find("myTimer") != std::string::npos);
51 // Check that we took at least a second.
52 int test2 = (time >= 1.0);
53 test = std::min(test, test2);
54
55 int gblTest = false; // output argument
56 reduceAll<int, int> (*comm, REDUCE_MAX, test, outArg (gblTest));
57 TEST_EQUALITY(gblTest, 1);
58
59}
60
61// Check that sync'd timers do not hang execution.
62TEUCHOS_UNIT_TEST(TimeMonitor, HangingSyncTimeMonitor) {
64 using Teuchos::Comm;
65 using Teuchos::outArg;
66 using Teuchos::RCP;
68 using Teuchos::reduceAll;
69
70 RCP<const Comm<int> > comm = Teuchos::DefaultComm<int>::getComm ();
71
72 const int numProcs = comm->getSize ();
73 TEST_ASSERT( numProcs > 1 );
74 if (numProcs < 4) {
75 out << "This test requires at least 4 MPI processes." << std::endl;
76 return;
77 }
78
79 const int myRank = comm->getRank();
80 int test = false;
81
82 try {
83 // Setup up a sync'd timer and raise an exception on one rank.
84 {
85 SyncTimeMonitor timer(*Teuchos::TimeMonitor::getNewTimer(std::string("myTimer")), comm.ptr());
86 if (myRank == 1)
87 throw std::runtime_error("Test");
88 }
89 test = true;
90 } catch (const std::runtime_error& e) {
91 test = (myRank == 1);
92 }
93
94 int gblTest = false; // output argument
95 reduceAll<int, int> (*comm, REDUCE_MAX, test, outArg (gblTest));
96 TEST_EQUALITY(gblTest, 1);
97
98}
Implementation of Teuchos wrappers for MPI.
#define TEST_ASSERT(v1)
Assert the given statement is true.
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
Scope guard for Teuchos::Time, with MPI collective timer reporting.
Unit testing support.
#define TEUCHOS_UNIT_TEST(TEST_GROUP, TEST_NAME)
Macro for defining a (non-templated) unit test.
Abstract interface for distributed-memory communication.
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Return the default global communicator.
Smart reference counting pointer class for automatic garbage collection.
A TimeMonitor that waits at a MPI barrier before destruction.
static void summarize(Ptr< const Comm< int > > comm, std::ostream &out=std::cout, const bool alwaysWriteLocal=false, const bool writeGlobalStats=true, const bool writeZeroTimers=true, const ECounterSetOp setOp=Intersection, const std::string &filter="", const bool ignoreZeroTimers=false)
Print summary statistics for all timers on the given communicator.
static RCP< Time > getNewTimer(const std::string &name)
Return a new timer with the given name (class method).