Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
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
15 TEUCHOS_UNIT_TEST(TimeMonitor, SyncTimeMonitor) {
17  using Teuchos::Comm;
18  using Teuchos::outArg;
19  using Teuchos::RCP;
20  using Teuchos::REDUCE_MAX;
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.
62 TEUCHOS_UNIT_TEST(TimeMonitor, HangingSyncTimeMonitor) {
64  using Teuchos::Comm;
65  using Teuchos::outArg;
66  using Teuchos::RCP;
67  using Teuchos::REDUCE_MAX;
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 }
#define TEST_ASSERT(v1)
Assert the given statement is true.
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Return the default global communicator.
A TimeMonitor that waits at a MPI barrier before destruction.
static RCP< Time > getNewTimer(const std::string &name)
Return a new timer with the given name (class method).
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.
Unit testing support.
Implementation of Teuchos wrappers for MPI.
void reduceAll< int, int >(const Comm< int > &comm, const EReductionType reductType, const int count, const int sendBuffer[], int globalReducts[])
Abstract interface for distributed-memory communication.
Scope guard for Teuchos::Time, with MPI collective timer reporting.
Smart reference counting pointer class for automatic garbage collection.
TEUCHOS_UNIT_TEST(TimeMonitor, SyncTimeMonitor)
Ptr< T > outArg(T &arg)
create a non-persisting (required or optional) output argument for a function call.