Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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.
#define TEUCHOS_UNIT_TEST(TEST_GROUP, TEST_NAME)
Macro for defining a (non-templated) unit test.
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.
Ptr< T > outArg(T &arg)
create a non-persisting (required or optional) output argument for a function call.