11#include "Teuchos_CommHelpers.hpp"
12#include "Teuchos_DefaultComm.hpp"
15#include "Teuchos_StandardParameterEntryValidators.hpp"
17#include "Teuchos_StackedTimer.hpp"
21#ifdef HAVE_TEUCHOS_ADD_TIME_MONITOR_TO_STACKED_TIMER
78 template<
class Ordinal,
class ScalarType,
class IndexType>
84 const std::pair<ScalarType, IndexType>
inBuffer[],
85 std::pair<ScalarType, IndexType>
inoutBuffer[])
const;
88 template<
class Ordinal>
93 reduce (
const Ordinal count,
94 const std::pair<double, int>
inBuffer[],
97 for (Ordinal
ind = 0;
ind < count; ++
ind) {
104 }
else if (in.first < inout.first) {
107 inout.first = in.first;
108 inout.second = std::min (in.second, inout.second);
140 template<
class Ordinal,
class ScalarType,
class IndexType>
146 const std::pair<ScalarType, IndexType>
inBuffer[],
147 std::pair<ScalarType, IndexType>
inoutBuffer[])
const;
150 template<
class Ordinal>
155 reduce (
const Ordinal count,
156 const std::pair<double, int>
inBuffer[],
159 for (Ordinal
ind = 0;
ind < count; ++
ind) {
166 }
else if (in.first > inout.first) {
169 inout.first = in.first;
170 inout.second = std::min (in.second, inout.second);
179 template<
class Ordinal,
class ScalarType,
class IndexType>
185 const std::pair<ScalarType, IndexType>
inBuffer[],
186 std::pair<ScalarType, IndexType>
inoutBuffer[])
const;
189 template<
class Ordinal>
194 reduce (
const Ordinal count,
195 const std::pair<double, int>
inBuffer[],
198 for (Ordinal
ind = 0;
ind < count; ++
ind) {
202 if ( (
in.first <
inout.first &&
in.first != 0) || (
inout.first == 0 &&
in.first != 0) ) {
205 }
else if (in.first > inout.first) {
208 inout.first = in.first;
209 inout.second = std::min (in.second, inout.second);
215 constexpr const std::string_view defaultStackedTimerName =
"Teuchos::StackedTimer";
221 typedef std::map<std::string, std::pair<double, int> > timer_map_t;
231#ifdef HAVE_TEUCHOS_ADD_TIME_MONITOR_TO_STACKED_TIMER
241#ifdef HAVE_TEUCHOS_ADD_TIME_MONITOR_TO_STACKED_TIMER
246 catch (std::runtime_error&
e) {
249 "\n*********************************************************************\n"
250 "WARNING: Overlapping timers detected! Near: " <<
counter().name()<<
"\n"
251 "A TimeMonitor timer was stopped before a nested subtimer was\n"
252 "stopped. This is not allowed by the StackedTimer. This corner case\n"
253 "typically occurs if the TimeMonitor is stored in an RCP and the RCP is\n"
254 "assigned to a new timer. To disable this warning, either fix the\n"
255 "ordering of timer creation and destuction or disable the StackedTimer\n"
256 "support in the TimeMonitor by setting the StackedTimer to null\n"
258 " RCP<TimeMonitor> MM = rcp(new TimeMonitor(*(TimeMonitor::getNewTimer(\"Junk\"))));\n"
260 "MM = Teuchos::null;\n"
261 "MM = rcp(new TimeMonitor(*(TimeMonitor::getNewTimer(\"SecondJunk\"))));\n"
262 "*********************************************************************\n";
263 std::cout <<
warning.str() << std::endl <<
e.what() << std::endl;
275 timer == null, std::invalid_argument,
276 "TimeMonitor::disableTimer: Invalid timer \"" << name <<
"\"");
285 timer == null, std::invalid_argument,
286 "TimeMonitor::enableTimer: Invalid timer \"" << name <<
"\"");
293 typedef std::map<std::string, RCP<Time> > map_type;
308 it->second->isRunning (), std::runtime_error,
309 "Timer \"" <<
it->second->name () <<
"\" is currently running. "
310 "You are not allowed to reset running timers.");
328 std::pair<std::string, std::pair<double, int> >
331 return std::make_pair (name, std::make_pair (
double(0),
int(0)));
352 collectLocalTimerData (timer_map_t& localData,
353 const std::map<std::string, RCP<Time> >& localCounters,
354 const std::string& filter=
"")
356 using std::make_pair;
357 typedef timer_map_t::iterator iter_t;
359 timer_map_t theLocalData;
360 for (std::map<std::string, RCP<Time> >::const_iterator it = localCounters.begin();
361 it != localCounters.end(); ++it) {
362 const std::string& name = it->second->name ();
366 const bool skipThisOne = (filter !=
"" && name.find (filter) != 0);
368 const double timing = it->second->totalElapsedTime ();
369 const int numCalls = it->second->numCalls ();
373 iter_t loc = theLocalData.find (name);
374 if (loc == theLocalData.end()) {
376 theLocalData.insert (loc, make_pair (name, make_pair (timing, numCalls)));
379 loc->second.first += timing;
380 loc->second.second += numCalls;
386 localData.swap (theLocalData);
393 filterZeroData (timer_map_t& timerData)
397 timer_map_t newTimerData;
398 for (timer_map_t::const_iterator it = timerData.begin();
399 it != timerData.end(); ++it) {
400 if (it->second.second > 0) {
401 newTimerData[it->first] = it->second;
404 timerData.swap (newTimerData);
429 collectLocalTimerDataAndNames (timer_map_t& localTimerData,
430 Array<std::string>& localTimerNames,
431 const std::map<std::string, RCP<Time> >& localTimers,
432 const bool writeZeroTimers,
433 const std::string& filter=
"")
436 collectLocalTimerData (localTimerData, localTimers, filter);
442 if (! writeZeroTimers) {
443 filterZeroData (localTimerData);
448 localTimerNames.reserve (localTimerData.size());
449 for (timer_map_t::const_iterator it = localTimerData.begin();
450 it != localTimerData.end(); ++it) {
451 localTimerNames.push_back (it->first);
490 collectGlobalTimerData (timer_map_t& globalTimerData,
491 Array<std::string>& globalTimerNames,
492 timer_map_t& localTimerData,
493 Array<std::string>& localTimerNames,
494 Ptr<
const Comm<int> > comm,
495 const bool alwaysWriteLocal,
524 const timer_map_t::size_type myNumGlobalNames = globalTimerNames.size();
525 timer_map_t::size_type minNumGlobalNames = 0;
526 timer_map_t::size_type maxNumGlobalNames = 0;
527 reduceAll (*comm,
REDUCE_MIN, myNumGlobalNames,
528 outArg (minNumGlobalNames));
529 reduceAll (*comm,
REDUCE_MAX, myNumGlobalNames,
530 outArg (maxNumGlobalNames));
532 std::logic_error,
"Min # global timer names = " << minNumGlobalNames
533 <<
" != max # global timer names = " << maxNumGlobalNames
534 <<
". Please report this bug to the Teuchos developers.");
536 std::logic_error,
"My # global timer names = " << myNumGlobalNames
537 <<
" != min # global timer names = " << minNumGlobalNames
538 <<
". Please report this bug to the Teuchos developers.");
557 timer_map_t::iterator globalMapIter = globalTimerData.begin();
558 timer_map_t::iterator localMapIter;
560 it != globalTimerNames.end(); ++it) {
561 const std::string& globalName = *it;
562 localMapIter = localTimerData.find (globalName);
564 if (localMapIter == localTimerData.end()) {
565 if (alwaysWriteLocal) {
581 localMapIter = localTimerData.insert (localMapIter, makeEmptyTimerDatum (globalName));
586 localTimerNames.push_back (globalName);
591 globalMapIter = globalTimerData.insert (globalMapIter, makeEmptyTimerDatum (globalName));
597 globalMapIter = globalTimerData.insert (globalMapIter, std::make_pair (globalName, localMapIter->second));
601 if (alwaysWriteLocal) {
604 std::sort (localTimerNames.begin(), localTimerNames.end());
611 const timer_map_t::size_type myNumGlobalTimers = globalTimerData.size();
612 timer_map_t::size_type minNumGlobalTimers = 0;
613 timer_map_t::size_type maxNumGlobalTimers = 0;
614 reduceAll (*comm,
REDUCE_MIN, myNumGlobalTimers,
615 outArg (minNumGlobalTimers));
616 reduceAll (*comm,
REDUCE_MAX, myNumGlobalTimers,
617 outArg (maxNumGlobalTimers));
619 std::logic_error,
"Min # global timers = " << minNumGlobalTimers
620 <<
" != max # global timers = " << maxNumGlobalTimers
621 <<
". Please report this bug to the Teuchos developers.");
623 std::logic_error,
"My # global timers = " << myNumGlobalTimers
624 <<
" != min # global timers = " << minNumGlobalTimers
625 <<
". Please report this bug to the Teuchos developers.");
678 std::vector<std::string>& statNames,
679 Ptr<
const Comm<int> > comm,
680 const timer_map_t& globalTimerData,
681 const bool ignoreZeroTimers)
685 const int numTimers =
static_cast<int> (globalTimerData.size());
686 const int numProcs = comm->getSize();
691 Array<std::pair<double, int> > timingsAndCallCounts;
692 timingsAndCallCounts.reserve (numTimers);
693 for (timer_map_t::const_iterator it = globalTimerData.begin();
694 it != globalTimerData.end(); ++it) {
695 timingsAndCallCounts.push_back (it->second);
702 Array<std::pair<double, int> > minTimingsAndCallCounts (numTimers);
704 if (ignoreZeroTimers)
705 reduceAll (*comm, MinLocNonzero<int, double, int>(), numTimers,
706 &timingsAndCallCounts[0], &minTimingsAndCallCounts[0]);
708 reduceAll (*comm, MinLoc<int, double, int>(), numTimers,
709 &timingsAndCallCounts[0], &minTimingsAndCallCounts[0]);
716 Array<std::pair<double, int> > maxTimingsAndCallCounts (numTimers);
718 reduceAll (*comm, MaxLoc<int, double, int>(), numTimers,
719 &timingsAndCallCounts[0], &maxTimingsAndCallCounts[0]);
733 Array<double> meanOverCallCountsTimings (numTimers);
734 Array<double> meanOverProcsTimings (numTimers);
735 Array<double> meanCallCounts (numTimers);
736 Array<int> ICallThisTimer (numTimers);
737 Array<int> numProcsCallingEachTimer (numTimers);
740 if (ignoreZeroTimers) {
741 for (
int k = 0; k < numTimers; ++k) {
742 const double callCount =
static_cast<double> (timingsAndCallCounts[k].second);
743 if (callCount > 0) ICallThisTimer[k] = 1;
744 else ICallThisTimer[k] = 0;
747 reduceAll (*comm,
REDUCE_SUM, numTimers, &ICallThisTimer[0],
748 &numProcsCallingEachTimer[0]);
755 Array<double> scaledTimings (numTimers);
756 Array<double> scaledCallCounts (numTimers);
757 const double P =
static_cast<double> (numProcs);
759 if (ignoreZeroTimers) {
760 for (
int k = 0; k < numTimers; ++k) {
761 const double timing = timingsAndCallCounts[k].first;
762 const double callCount =
static_cast<double> (timingsAndCallCounts[k].second);
764 scaledTimings[k] = timing / numProcsCallingEachTimer[k];
765 scaledCallCounts[k] = callCount / numProcsCallingEachTimer[k];
769 for (
int k = 0; k < numTimers; ++k) {
770 const double timing = timingsAndCallCounts[k].first;
771 const double callCount =
static_cast<double> (timingsAndCallCounts[k].second);
773 scaledTimings[k] = timing / P;
774 scaledCallCounts[k] = callCount / P;
779 reduceAll (*comm,
REDUCE_SUM, numTimers, &scaledTimings[0],
780 &meanOverProcsTimings[0]);
781 reduceAll (*comm,
REDUCE_SUM, numTimers, &scaledCallCounts[0],
786 for (
int k = 0; k < numTimers; ++k) {
788 meanOverCallCountsTimings[k] = meanOverProcsTimings[k] / meanCallCounts[k];
800 statNames.resize (4);
801 statNames[0] =
"MinOverProcs";
802 statNames[1] =
"MeanOverProcs";
803 statNames[2] =
"MaxOverProcs";
804 statNames[3] =
"MeanOverCallCounts";
806 stat_map_type::iterator statIter = statData.end();
807 timer_map_t::const_iterator it = globalTimerData.begin();
808 for (
int k = 0; it != globalTimerData.end(); ++k, ++it) {
809 std::vector<std::pair<double, double> > curData (4);
810 curData[0] = minTimingsAndCallCounts[k];
811 curData[1] = std::make_pair (meanOverProcsTimings[k], meanCallCounts[k]);
812 curData[2] = maxTimingsAndCallCounts[k];
813 curData[3] = std::make_pair (meanOverCallCountsTimings[k], meanCallCounts[k]);
818 statIter = statData.insert (statIter, std::make_pair (it->first, curData));
839 RCP<const Comm<int> >
851 int mpiHasBeenStarted = 0;
852 MPI_Initialized (&mpiHasBeenStarted);
853 if (! mpiHasBeenStarted) {
855 comm = rcp_implicit_cast<const Comm<int> > (
rcp (
new SerialComm<int> ()));
870 const std::string&
filter)
901 const std::string&
filter,
942 const int precision =
format().precision();
943 const std::ios_base::fmtflags&
flags = out.flags();
961 titles.append (
"Timer Name");
981 titles.append (
"Local time (num calls)");
1012 titles.append (
"Global time (num calls)");
1028 stat_map_type::const_iterator
it =
statData.begin();
1060 const std::string&
filter,
1076 const std::string&
filter)
1125 if (label.empty ()) {
1132 const bool alreadyQuoted = label.size () >= 2 &&
1133 label[0] ==
'"' && label[label.size() - 1] ==
'"';
1138 bool needToQuote =
false;
1141 out.reserve (label.size ());
1143 const size_t startPos = alreadyQuoted ? 1 : 0;
1144 const size_t endPos = alreadyQuoted ? label.size () - 1 : label.size ();
1145 for (
size_t i = startPos; i < endPos; ++i) {
1146 const char c = label[i];
1147 if (c ==
'"' || c ==
'\\') {
1148 out.push_back (
'\\');
1151 else if (c ==
':') {
1157 if (needToQuote || alreadyQuoted) {
1160 return "\"" + out +
"\"";
1171 summarizeToYaml (Ptr<
const Comm<int> > comm,
1173 const ETimeMonitorYamlFormat yamlStyle,
1174 const std::string& filter)
1177 using Teuchos::fancyOStream;
1178 using Teuchos::getFancyOStream;
1181 using Teuchos::rcpFromRef;
1183 typedef std::vector<std::string>::size_type size_type;
1185 const bool compact = (yamlStyle == YAML_FORMAT_COMPACT);
1193 std::vector<std::string> statNames;
1196 const int numProcs = comm->getSize();
1209 RCP<FancyOStream> pfout = getFancyOStream (rcpFromRef (out));
1210 pfout->setTabIndentStr (
" ");
1213 fout <<
"# Teuchos::TimeMonitor report" << endl
1225 fout <<
"Output mode: " << (compact ?
"compact" :
"spacious") << endl
1226 <<
"Number of processes: " << numProcs << endl
1227 <<
"Time unit: s" << endl;
1231 fout <<
"Statistics collected: ";
1235 for (size_type i = 0; i < statNames.size (); ++i) {
1236 fout << quoteLabelForYaml (statNames[i]);
1237 if (i + 1 < statNames.size ()) {
1241 fout <<
"]" << endl;
1246 for (size_type i = 0; i < statNames.size (); ++i) {
1247 fout <<
"- " << quoteLabelForYaml (statNames[i]) << endl;
1256 fout <<
"Timer names: ";
1260 for (stat_map_type::const_iterator it = statData.begin();
1261 it != statData.end(); ++it, ++ind) {
1262 fout << quoteLabelForYaml (it->first);
1263 if (ind + 1 < statData.size ()) {
1267 fout <<
"]" << endl;
1272 for (stat_map_type::const_iterator it = statData.begin();
1273 it != statData.end(); ++it) {
1274 fout <<
"- " << quoteLabelForYaml (it->first) << endl;
1279 fout <<
"Total times: ";
1282 size_type outerInd = 0;
1283 for (stat_map_type::const_iterator outerIter = statData.begin();
1284 outerIter != statData.end(); ++outerIter, ++outerInd) {
1286 fout << quoteLabelForYaml (outerIter->first) <<
": ";
1288 const std::vector<std::pair<double, double> >& curData = outerIter->second;
1290 for (size_type innerInd = 0; innerInd < curData.size (); ++innerInd) {
1291 fout << quoteLabelForYaml (statNames[innerInd]) <<
": "
1292 << curData[innerInd].first;
1293 if (innerInd + 1 < curData.size ()) {
1298 if (outerInd + 1 < statData.size ()) {
1302 fout <<
"}" << endl;
1307 size_type outerInd = 0;
1308 for (stat_map_type::const_iterator outerIter = statData.begin();
1309 outerIter != statData.end(); ++outerIter, ++outerInd) {
1311 fout << quoteLabelForYaml (outerIter->first) <<
": " << endl;
1314 const std::vector<std::pair<double, double> >& curData = outerIter->second;
1315 for (size_type innerInd = 0; innerInd < curData.size (); ++innerInd) {
1316 fout << quoteLabelForYaml (statNames[innerInd]) <<
": "
1317 << curData[innerInd].first << endl;
1323 fout <<
"Call counts:";
1326 size_type outerInd = 0;
1327 for (stat_map_type::const_iterator outerIter = statData.begin();
1328 outerIter != statData.end(); ++outerIter, ++outerInd) {
1330 fout << quoteLabelForYaml (outerIter->first) <<
": ";
1332 const std::vector<std::pair<double, double> >& curData = outerIter->second;
1334 for (size_type innerInd = 0; innerInd < curData.size (); ++innerInd) {
1335 fout << quoteLabelForYaml (statNames[innerInd]) <<
": "
1336 << curData[innerInd].second;
1337 if (innerInd + 1 < curData.size ()) {
1342 if (outerInd + 1 < statData.size ()) {
1346 fout <<
"}" << endl;
1351 size_type outerInd = 0;
1352 for (stat_map_type::const_iterator outerIter = statData.begin();
1353 outerIter != statData.end(); ++outerIter, ++outerInd) {
1355 fout << quoteLabelForYaml (outerIter->first) <<
": " << endl;
1358 const std::vector<std::pair<double, double> >& curData = outerIter->second;
1359 for (size_type innerInd = 0; innerInd < curData.size (); ++innerInd) {
1360 fout << quoteLabelForYaml (statNames[innerInd]) <<
": "
1361 << curData[innerInd].second << endl;
1368 summarizeToYaml (std::ostream &out,
1369 const ETimeMonitorYamlFormat yamlStyle,
1370 const std::string& filter)
1375 RCP<const Comm<int> > comm = getDefaultComm ();
1377 summarizeToYaml (comm.ptr (), out, yamlStyle, filter);
1382 bool TimeMonitor::setParams_ =
false;
1385 TimeMonitor::ETimeMonitorReportFormat TimeMonitor::reportFormat_ = TimeMonitor::REPORT_FORMAT_TABLE;
1386 TimeMonitor::ETimeMonitorYamlFormat TimeMonitor::yamlStyle_ = TimeMonitor::YAML_FORMAT_SPACIOUS;
1388 bool TimeMonitor::alwaysWriteLocal_ =
false;
1389 bool TimeMonitor::writeGlobalStats_ =
true;
1390 bool TimeMonitor::writeZeroTimers_ =
true;
1393 TimeMonitor::setReportFormatParameter (ParameterList& plist)
1395 const std::string name (
"Report format");
1396 const std::string defaultValue (
"Table");
1397 const std::string docString (
"Output format for report of timer statistics");
1398 Array<std::string> strings;
1399 Array<std::string> docs;
1400 Array<ETimeMonitorReportFormat> values;
1402 strings.push_back (
"YAML");
1403 docs.push_back (
"YAML (see yaml.org) format");
1404 values.push_back (REPORT_FORMAT_YAML);
1405 strings.push_back (
"Table");
1406 docs.push_back (
"Tabular format via Teuchos::TableFormat");
1407 values.push_back (REPORT_FORMAT_TABLE);
1409 setStringToIntegralParameter<ETimeMonitorReportFormat> (name, defaultValue,
1411 strings (), docs (),
1416 TimeMonitor::setYamlFormatParameter (ParameterList& plist)
1418 const std::string name (
"YAML style");
1419 const std::string defaultValue (
"spacious");
1420 const std::string docString (
"YAML-specific output format");
1421 Array<std::string> strings;
1422 Array<std::string> docs;
1423 Array<ETimeMonitorYamlFormat> values;
1425 strings.push_back (
"compact");
1426 docs.push_back (
"Compact format: use \"flow style\" (see YAML 1.2 spec at "
1427 "yaml.org) for most sequences except the outermost sequence");
1428 values.push_back (YAML_FORMAT_COMPACT);
1430 strings.push_back (
"spacious");
1431 docs.push_back (
"Spacious format: avoid flow style");
1432 values.push_back (YAML_FORMAT_SPACIOUS);
1434 setStringToIntegralParameter<ETimeMonitorYamlFormat> (name, defaultValue,
1436 strings (), docs (),
1441 TimeMonitor::setSetOpParameter (ParameterList& plist)
1443 const std::string name (
"How to merge timer sets");
1444 const std::string defaultValue (
"Intersection");
1445 const std::string docString (
"How to merge differing sets of timers "
1446 "across processes");
1447 Array<std::string> strings;
1448 Array<std::string> docs;
1449 Array<ECounterSetOp> values;
1451 strings.push_back (
"Intersection");
1452 docs.push_back (
"Compute intersection of timer sets over processes");
1453 values.push_back (Intersection);
1454 strings.push_back (
"Union");
1455 docs.push_back (
"Compute union of timer sets over processes");
1456 values.push_back (Union);
1458 setStringToIntegralParameter<ECounterSetOp> (name, defaultValue, docString,
1459 strings (), docs (), values (),
1476 TimeMonitor::stackedTimerNameIsDefault() {
1480 RCP<const ParameterList>
1492 setReportFormatParameter (*
plist);
1493 setYamlFormatParameter (*
plist);
1494 setSetOpParameter (*
plist);
1496 "Always output local timers' values on Proc 0");
1498 "statistics, even if there is only one process in the "
1501 "timers that have never been called");
1509 ETimeMonitorReportFormat
reportFormat = REPORT_FORMAT_TABLE;
1510 ETimeMonitorYamlFormat
yamlStyle = YAML_FORMAT_SPACIOUS;
1526 reportFormat = getIntegralValue<ETimeMonitorReportFormat> (*params,
"Report format");
1527 yamlStyle = getIntegralValue<ETimeMonitorYamlFormat> (*params,
"YAML style");
1528 setOp = getIntegralValue<ECounterSetOp> (*params,
"How to merge timer sets");
1529 alwaysWriteLocal = params->
get<
bool> (
"alwaysWriteLocal");
1530 writeGlobalStats = params->
get<
bool> (
"writeGlobalStats");
1531 writeZeroTimers = params->
get<
bool> (
"writeZeroTimers");
1536 reportFormat_ = reportFormat;
1537 yamlStyle_ = yamlStyle;
1539 alwaysWriteLocal_ = alwaysWriteLocal;
1540 writeGlobalStats_ = writeGlobalStats;
1541 writeZeroTimers_ = writeZeroTimers;
1549 const std::string&
filter,
1552 setReportParameters (
params);
1554 if (reportFormat_ == REPORT_FORMAT_YAML) {
1555 summarizeToYaml (
comm, out, yamlStyle_,
filter);
1557 else if (reportFormat_ == REPORT_FORMAT_TABLE) {
1559 writeZeroTimers_, setOp_,
filter);
1563 "Invalid report format. This should never happen; ParameterList "
1564 "validation should have caught this. Please report this bug to the "
1565 "Teuchos developers.");
1579 const std::string&
filter,
Defines basic traits for the scalar field type.
A column of TableEntry objects.
Scope guard for Teuchos::Time, with MPI collective timer reporting.
std::vector< T >::const_iterator const_iterator
The type of a const forward iterator.
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Return the default global communicator.
Teuchos version of MPI_MAXLOC.
void reduce(const Ordinal count, const std::pair< ScalarType, IndexType > inBuffer[], std::pair< ScalarType, IndexType > inoutBuffer[]) const
same as MinLoc, but don't allow zero
void reduce(const Ordinal count, const std::pair< ScalarType, IndexType > inBuffer[], std::pair< ScalarType, IndexType > inoutBuffer[]) const
Teuchos version of MPI_MINLOC.
void reduce(const Ordinal count, const std::pair< ScalarType, IndexType > inBuffer[], std::pair< ScalarType, IndexType > inoutBuffer[]) const
Simple wrapper class for raw pointers to single objects where no persisting relationship exists.
Smart reference counting pointer class for automatic garbage collection.
void reset()
Reset to null.
bool is_null() const
Returns true if the underlying pointer is null.
Ptr< T > ptr() const
Get a safer wrapper raw C++ pointer to the underlying object.
T * get() const
Get the raw C++ pointer to the underlying object.
This class allows one to push and pop timers on and off a stack.
~SyncTimeMonitor() override
Destructor: stops the timer.
SyncTimeMonitor()=delete
Default constructor is deleted, since it would be unsafe.
Scope guard for Time, that can compute MPI collective timer statistics.
~TimeMonitor() override
Destructor: stops the timer.
static void computeGlobalTimerStatistics(stat_map_type &statData, std::vector< std::string > &statNames, Ptr< const Comm< int > > comm, const ECounterSetOp setOp=Intersection, const std::string &filter="")
Compute global timer statistics for all timers on the given communicator.
static Teuchos::RCP< Teuchos::StackedTimer > getStackedTimer()
The StackedTimer used by the TimeMonitor.
static void enableTimer(const std::string &name)
Enable the timer with the given name.
static void zeroOutTimers()
Reset all global timers to zero.
static void setStackedTimer(const Teuchos::RCP< Teuchos::StackedTimer > &t)
Sets the StackedTimer into which the TimeMonitor will insert timings.
static void report(Ptr< const Comm< int > > comm, std::ostream &out, const std::string &filter, const RCP< ParameterList > ¶ms=null)
Report timer statistics to the given output stream.
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 Teuchos::RCP< Teuchos::StackedTimer > stackedTimer_
Stacked timer for optional injection of timing from TimeMonitor-enabled objects.
static RCP< const ParameterList > getValidReportParameters()
Default parameters (with validators) for report().
static void disableTimer(const std::string &name)
Disable the timer with the given name.
TimeMonitor()=delete
Default constructor is deleted, since it would be unsafe.
Base interface class for user-defined reduction operations for objects that use value semantics.
std::ostream subclass that performs the magic of indenting data sent to an std::ostream object among ...
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
basic_FancyOStream< char > FancyOStream
basic_OSTab< char > OSTab
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
ECounterSetOp
Set operation type for mergeCounterNames() to perform.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
void mergeCounterNames(const Comm< int > &comm, const Array< std::string > &localNames, Array< std::string > &globalNames, const ECounterSetOp setOp)
Merge counter names over all processors.
std::map< std::string, std::vector< std::pair< double, double > > > stat_map_type
Global statistics collected from timer data.
This structure defines some basic traits for a scalar field type.
static T zero()
Returns representation of zero for this scalar type.