https://mooseframework.inl.gov
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions | Friends | List of all members
PerfGraph Class Reference

The PerfGraph will hold the master list of all registered performance segments and the head PerfNode. More...

#include <PerfGraph.h>

Inheritance diagram for PerfGraph:
[legend]

Classes

struct  CumulativeSectionInfo
 Use to hold the cumulative time and memory for each section, which comes from all of the PerfNodes that contribute to said section. More...
 
class  SectionIncrement
 Use to hold an increment of time and memory for a section This is used in the LivePrint capability. More...
 

Public Types

enum  DataType {
  SELF, CHILDREN, TOTAL, SELF_AVG,
  CHILDREN_AVG, TOTAL_AVG, SELF_PERCENT, CHILDREN_PERCENT,
  TOTAL_PERCENT, SELF_MEMORY, CHILDREN_MEMORY, TOTAL_MEMORY,
  CALLS
}
 For retrieving values. More...
 
using PerfGraphRegistry = moose::internal::PerfGraphRegistry
 

Public Member Functions

 PerfGraph (const std::string &root_name, MooseApp &app, const bool live_all, const bool perf_graph_live)
 Create a new PerfGraph. More...
 
 ~PerfGraph ()
 Destructor. More...
 
void print (const ConsoleStream &console, unsigned int level)
 Print the tree out. More...
 
void printHeaviestBranch (const ConsoleStream &console)
 Print out the heaviest branch through the tree. More...
 
void printHeaviestSections (const ConsoleStream &console, const unsigned int num_sections)
 Print out the heaviest sections that were timed. More...
 
bool active () const
 Whether or not timing is active. More...
 
void setActive (bool active)
 Turn on or off timing. More...
 
void enableLivePrint ()
 Enables Live Print. More...
 
void disableLivePrint ()
 Completely disables Live Print (cannot be restarted) More...
 
void setLivePrintAll (bool active)
 Forces all sections to be output live. More...
 
void setLiveTimeLimit (Real time_limit)
 Set the time limit before a message prints. More...
 
void setLiveMemoryLimit (unsigned int mem_limit)
 Sert the memory limit before a message prints. More...
 
Real sectionData (const DataType type, const std::string &section_name, const bool must_exist=true)
 Gets a PerfGraph result pertaining to a section. More...
 
void update ()
 Updates the time section_time and time for all currently running nodes. More...
 
MooseAppmooseApp ()
 
const PerfNoderootNode () const
 
template<typename Functor >
void treeRecurse (const Functor &act, const unsigned int level=MOOSE_MAX_STACK_SIZE, const bool heaviest=false) const
 

Static Public Member Functions

static MooseEnum dataTypeEnum ()
 DataType in a MooseEnum for use in InputParameters in objects that query the PerfGraph with sectionData. More...
 

Protected Types

enum  IncrementState { STARTED, PRINTED, FINISHED }
 The execution state of an increment. More...
 
typedef VariadicTable< std::string, unsigned long int, Real, Real, Real, long int, Real, Real, Real, long intFullTable
 
typedef VariadicTable< std::string, unsigned long int, Real, Real, Real, long intHeaviestTable
 

Protected Member Functions

void addToExecutionList (const PerfID id, const IncrementState state, const std::chrono::time_point< std::chrono::steady_clock > time, const long int memory)
 Add the information to the execution list. More...
 
void push (const PerfID id)
 Add a Node onto the end of the end of the current callstack. More...
 
void pop ()
 Remove a Node from the end of the current scope. More...
 
void recursivelyUpdate (const PerfNode &current_node)
 Updates the cumulative self/children/total time and memory for each section across all nodes that contribute to said section in _cumulative_section_info. More...
 

Protected Attributes

MooseApp_moose_app
 The MooseApp. More...
 
bool _live_print_all
 Whether or not to put everything in the perf graph. More...
 
bool _disable_live_print
 Whether or not live print is disabled (cannot be turned on again) More...
 
PerfGraphRegistry_perf_graph_registry
 The PerfGraphRegistry. More...
 
const libMesh::processor_id_type _pid
 This processor id. More...
 
const std::string _root_name
 Name of the root node. More...
 
const PerfID _root_node_id
 The id for the root node. More...
 
const std::unique_ptr< PerfNode_root_node
 The root node of the graph. More...
 
int _current_position
 The current node position in the stack. More...
 
std::array< PerfNode *, MOOSE_MAX_STACK_SIZE > _stack
 The full callstack. Currently capped at a depth of 100. More...
 
std::array< SectionIncrement, MAX_EXECUTION_LIST_SIZE > _execution_list
 A circular buffer for holding the execution list, this is read by the printing loop. More...
 
std::atomic< unsigned int_execution_list_begin
 Where the print thread should start reading the execution list. More...
 
std::atomic< unsigned int_execution_list_end
 Where the print thread should stop reading the execution list. More...
 
std::unordered_map< std::string, CumulativeSectionInfo_cumulative_section_info
 The cumulative time and memory for each section. More...
 
std::vector< CumulativeSectionInfo * > _cumulative_section_info_ptrs
 Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we don't need to iterate over the above map much - and it makes it easier to sort. More...
 
bool _active
 Whether or not timing is active. More...
 
std::promise< bool > _done
 The promise to the print thread that will signal when to stop. More...
 
bool _destructing
 Tell the print thread to teardown. More...
 
std::mutex _destructing_mutex
 The mutex to use with a condition_variable predicate to guard _destructing. More...
 
std::condition_variable _finished_section
 The condition_variable to wake the print thread. More...
 
std::atomic< Real_live_print_time_limit
 The time limit before a message is printed (in seconds) More...
 
std::atomic< unsigned int_live_print_mem_limit
 The memory limit before a message is printed (in MB) More...
 
const std::unique_ptr< PerfGraphLivePrint_live_print
 The object that is doing live printing. More...
 
std::thread _print_thread
 The thread for printing sections as they execute. More...
 
const ConsoleStream _console
 An instance of helper class to write streams to the Console objects. More...
 

Private Member Functions

FullTable treeTable (const unsigned int level, const bool heaviest=false)
 Helper for building a VariadicTable that represents the tree. More...
 
template<typename Functor >
void treeRecurseInternal (const PerfNode &node, const Functor &act, const unsigned int level, const bool heaviest, unsigned int current_depth) const
 

Friends

class PerfGuard
 
class PerfGraphLivePrint
 
void dataStore (std::ostream &, PerfGraph &, void *)
 
void dataLoad (std::istream &, PerfGraph &, void *)
 

Detailed Description

The PerfGraph will hold the master list of all registered performance segments and the head PerfNode.

Definition at line 43 of file PerfGraph.h.

Member Typedef Documentation

◆ FullTable

typedef VariadicTable<std::string, unsigned long int, Real, Real, Real, long int, Real, Real, Real, long int> PerfGraph::FullTable
protected

Definition at line 204 of file PerfGraph.h.

◆ HeaviestTable

typedef VariadicTable<std::string, unsigned long int, Real, Real, Real, long int> PerfGraph::HeaviestTable
protected

Definition at line 206 of file PerfGraph.h.

◆ PerfGraphRegistry

Definition at line 46 of file PerfGraph.h.

Member Enumeration Documentation

◆ DataType

For retrieving values.

Enumerator
SELF 
CHILDREN 
TOTAL 
SELF_AVG 
CHILDREN_AVG 
TOTAL_AVG 
SELF_PERCENT 
CHILDREN_PERCENT 
TOTAL_PERCENT 
SELF_MEMORY 
CHILDREN_MEMORY 
TOTAL_MEMORY 
CALLS 

Definition at line 51 of file PerfGraph.h.

◆ IncrementState

enum PerfGraph::IncrementState
protected

The execution state of an increment.

Enumerator
STARTED 

Section just started running.

PRINTED 

This section has already started printing.

FINISHED 

The section is complete.

Definition at line 241 of file PerfGraph.h.

242  {
244  STARTED,
245 
247  PRINTED,
248 
250  FINISHED
251  };
The section is complete.
Definition: PerfGraph.h:250
This section has already started printing.
Definition: PerfGraph.h:247
Section just started running.
Definition: PerfGraph.h:244

Constructor & Destructor Documentation

◆ PerfGraph()

PerfGraph::PerfGraph ( const std::string &  root_name,
MooseApp app,
const bool  live_all,
const bool  perf_graph_live 
)

Create a new PerfGraph.

Parameters
root_nameThe name of the root node
appThe MooseApp this PerfGraph is for
live_allWhether every message should be printed
perf_graph_liveEnable/disable PerfGraphLive (permanently)

Definition at line 28 of file PerfGraph.C.

33  _moose_app(app),
34  _live_print_all(live_all),
35  _disable_live_print(!perf_graph_live),
37  _pid(app.comm().rank()),
38  _root_name(root_name),
40  _root_node(std::make_unique<PerfNode>(_root_node_id)),
42  _stack(),
45  _active(true),
46  _destructing(false),
49  _live_print(std::make_unique<PerfGraphLivePrint>(*this, app))
50 {
52 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
std::atomic< unsigned int > _live_print_mem_limit
The memory limit before a message is printed (in MB)
Definition: PerfGraph.h:402
std::atomic< unsigned int > _execution_list_begin
Where the print thread should start reading the execution list.
Definition: PerfGraph.h:361
const std::unique_ptr< PerfGraphLivePrint > _live_print
The object that is doing live printing.
Definition: PerfGraph.h:405
processor_id_type rank() const
std::atomic< unsigned int > _execution_list_end
Where the print thread should stop reading the execution list.
Definition: PerfGraph.h:364
const Parallel::Communicator & comm() const
bool _live_print_all
Whether or not to put everything in the perf graph.
Definition: PerfGraph.h:331
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
bool _active
Whether or not timing is active.
Definition: PerfGraph.h:384
ConsoleStreamInterface(MooseApp &app)
A class for providing a helper stream object for writting message to all the Output objects...
PerfID registerSection(const std::string &section_name, const unsigned int level)
Call to register a named section for timing.
MooseApp & _moose_app
The MooseApp.
Definition: PerfGraph.h:328
int _current_position
The current node position in the stack.
Definition: PerfGraph.h:352
bool _disable_live_print
Whether or not live print is disabled (cannot be turned on again)
Definition: PerfGraph.h:334
std::array< PerfNode *, MOOSE_MAX_STACK_SIZE > _stack
The full callstack. Currently capped at a depth of 100.
Definition: PerfGraph.h:355
const std::string _root_name
Name of the root node.
Definition: PerfGraph.h:343
const libMesh::processor_id_type _pid
This processor id.
Definition: PerfGraph.h:340
bool _destructing
Tell the print thread to teardown.
Definition: PerfGraph.h:390
void push(const PerfID id)
Add a Node onto the end of the end of the current callstack.
Definition: PerfGraph.C:185
PerfGraphRegistry & getPerfGraphRegistry()
Get the global PerfGraphRegistry singleton.
std::atomic< Real > _live_print_time_limit
The time limit before a message is printed (in seconds)
Definition: PerfGraph.h:399
const PerfID _root_node_id
The id for the root node.
Definition: PerfGraph.h:346

◆ ~PerfGraph()

PerfGraph::~PerfGraph ( )

Destructor.

Definition at line 54 of file PerfGraph.C.

54 { disableLivePrint(); }
void disableLivePrint()
Completely disables Live Print (cannot be restarted)
Definition: PerfGraph.C:67

Member Function Documentation

◆ active()

bool PerfGraph::active ( ) const
inline

Whether or not timing is active.

When not active no timing information will be kept

Definition at line 124 of file PerfGraph.h.

Referenced by setActive(), and setLivePrintAll().

124 { return _active; }
bool _active
Whether or not timing is active.
Definition: PerfGraph.h:384

◆ addToExecutionList()

void PerfGraph::addToExecutionList ( const PerfID  id,
const IncrementState  state,
const std::chrono::time_point< std::chrono::steady_clock >  time,
const long int  memory 
)
inlineprotected

Add the information to the execution list.

Should only be called by push() and pop()

Definition at line 154 of file PerfGraph.C.

Referenced by pop(), and push().

158 {
159  auto & section_increment = _execution_list[_execution_list_end];
160 
161  section_increment._id = id;
162  section_increment._state = state;
163  section_increment._time = time;
164  section_increment._memory = memory;
165  section_increment._beginning_num_printed = _console.numPrinted();
166 
167  // A note about this next section of code:
168  // It is only EVER run on the main thread - and therefore there can be
169  // no race conditions. All that is important here is that the print
170  // thread always sees a consistent value for _execution_list_end
171  auto next_execution_list_end = _execution_list_end + 1;
172 
173  // Are we at the end of our circular buffer?
174  if (next_execution_list_end >= MAX_EXECUTION_LIST_SIZE)
175  next_execution_list_end = 0;
176 
177  // This "release" will synchronize the above memory changes with the
178  // "acquire" in the printing thread
179  // All of the above memory operations will be seen by the
180  // printing thread before the printing thread sees this new value
181  _execution_list_end.store(next_execution_list_end, std::memory_order_release);
182 }
std::atomic< unsigned int > _execution_list_end
Where the print thread should stop reading the execution list.
Definition: PerfGraph.h:364
unsigned long long int numPrinted() const
The number of times something has been printed.
Definition: ConsoleStream.C:68
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
std::array< SectionIncrement, MAX_EXECUTION_LIST_SIZE > _execution_list
A circular buffer for holding the execution list, this is read by the printing loop.
Definition: PerfGraph.h:358

◆ dataTypeEnum()

static MooseEnum PerfGraph::dataTypeEnum ( )
inlinestatic

DataType in a MooseEnum for use in InputParameters in objects that query the PerfGraph with sectionData.

Definition at line 72 of file PerfGraph.h.

Referenced by PerfGraphData::validParams().

73  {
74  return MooseEnum(
75  "SELF CHILDREN TOTAL SELF_AVG CHILDREN_AVG TOTAL_AVG SELF_PERCENT CHILDREN_PERCENT "
76  "TOTAL_PERCENT SELF_MEMORY CHILDREN_MEMORY TOTAL_MEMORY CALLS");
77  }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33

◆ disableLivePrint()

void PerfGraph::disableLivePrint ( )

Completely disables Live Print (cannot be restarted)

Definition at line 67 of file PerfGraph.C.

Referenced by CommonOutputAction::act(), MooseApp::setupOptions(), and ~PerfGraph().

68 {
69  if (_pid == 0 && !_disable_live_print)
70  {
71  {
72  // Unlike using atomics for execution_thread_end
73  // here we actually lock to ensure that either the print thread
74  // immediately sees that we are destructing or is immediately
75  // notified with the below notification. Without doing this
76  // it would be possible (but unlikely) for the print thread to
77  // hang for 1 second at the end of execution (which would not be
78  // good anytime you are running lots of fast calculations back-to-back
79  // like during testing or stochastic sampling).
80  std::lock_guard<std::mutex> lock(_destructing_mutex);
81  _destructing = true;
82  }
83 
84  _finished_section.notify_one();
85 
86  _print_thread.join();
87 
88  _disable_live_print = true;
89  }
90 }
std::thread _print_thread
The thread for printing sections as they execute.
Definition: PerfGraph.h:408
std::condition_variable _finished_section
The condition_variable to wake the print thread.
Definition: PerfGraph.h:396
std::mutex _destructing_mutex
The mutex to use with a condition_variable predicate to guard _destructing.
Definition: PerfGraph.h:393
bool _disable_live_print
Whether or not live print is disabled (cannot be turned on again)
Definition: PerfGraph.h:334
const libMesh::processor_id_type _pid
This processor id.
Definition: PerfGraph.h:340
bool _destructing
Tell the print thread to teardown.
Definition: PerfGraph.h:390

◆ enableLivePrint()

void PerfGraph::enableLivePrint ( )

Enables Live Print.

Definition at line 57 of file PerfGraph.C.

58 {
59  if (_pid == 0 && !_disable_live_print)
60  {
61  // Start the printing thread
62  _print_thread = std::thread([this] { this->_live_print->start(); });
63  }
64 }
std::thread _print_thread
The thread for printing sections as they execute.
Definition: PerfGraph.h:408
const std::unique_ptr< PerfGraphLivePrint > _live_print
The object that is doing live printing.
Definition: PerfGraph.h:405
bool _disable_live_print
Whether or not live print is disabled (cannot be turned on again)
Definition: PerfGraph.h:334
const libMesh::processor_id_type _pid
This processor id.
Definition: PerfGraph.h:340

◆ mooseApp()

MooseApp& PerfGraph::mooseApp ( )
inline
Returns
The MooseApp

Definition at line 181 of file PerfGraph.h.

181 { return _moose_app; }
MooseApp & _moose_app
The MooseApp.
Definition: PerfGraph.h:328

◆ pop()

void PerfGraph::pop ( )
protected

Remove a Node from the end of the current scope.

Note: only accessible by using PerfGuard!

Definition at line 231 of file PerfGraph.C.

Referenced by PerfGuard::~PerfGuard().

232 {
233  if (!_active)
234  return;
235 
236  auto current_time = std::chrono::steady_clock::now();
237 
238  auto & current_node = _stack[_current_position];
239 
240  MemoryUtils::Stats stats;
241  auto memory_success = MemoryUtils::getMemoryStats(stats);
242 
243  long int current_memory = 0;
244 
245  if (memory_success)
246  current_memory =
248  else if (_current_position !=
249  -1) // If we weren't able to get the memory stats, let's just use the start memory
250  current_memory = _stack[_current_position]->startMemory();
251 
252  current_node->addTimeAndMemory(current_time, current_memory);
253 
255 
256  // Add this to the exection list
257  if ((_pid == 0 && !_disable_live_print) &&
258  (!_perf_graph_registry.readSectionInfo(current_node->id())._live_message.empty() ||
260  {
261  addToExecutionList(current_node->id(), IncrementState::FINISHED, current_time, current_memory);
262 
263  // Tell the printing thread that a section has finished
264  //
265  // Note: no mutex is needed here because we're using an atomic
266  // in the predicate of the condition_variable in the thread
267  // This is technically correct - but there is a chance of missing a signal
268  // For us - that chance is low and doesn't matter (the timeout will just be hit
269  // instead). So - I would rather not have an extra lock here in the main thread.
270  _finished_section.notify_one();
271  }
272 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
bool getMemoryStats(Stats &stats)
get all memory stats for the current process stats The Stats object to fill with the data ...
Definition: MemoryUtils.C:79
std::size_t _physical_memory
Definition: MemoryUtils.h:23
bool _live_print_all
Whether or not to put everything in the perf graph.
Definition: PerfGraph.h:331
std::condition_variable _finished_section
The condition_variable to wake the print thread.
Definition: PerfGraph.h:396
void addToExecutionList(const PerfID id, const IncrementState state, const std::chrono::time_point< std::chrono::steady_clock > time, const long int memory)
Add the information to the execution list.
Definition: PerfGraph.C:154
bool _active
Whether or not timing is active.
Definition: PerfGraph.h:384
int _current_position
The current node position in the stack.
Definition: PerfGraph.h:352
bool _disable_live_print
Whether or not live print is disabled (cannot be turned on again)
Definition: PerfGraph.h:334
std::array< PerfNode *, MOOSE_MAX_STACK_SIZE > _stack
The full callstack. Currently capped at a depth of 100.
Definition: PerfGraph.h:355
const libMesh::processor_id_type _pid
This processor id.
Definition: PerfGraph.h:340
std::size_t convertBytes(std::size_t bytes, MemUnits unit)
convert bytes to selected unit prefix
Definition: MemoryUtils.C:174
const PerfGraphSectionInfo & readSectionInfo(PerfID section_id) const
Special accessor just for PerfGraph so that no locking is needed in PerfGraph.

◆ print()

void PerfGraph::print ( const ConsoleStream console,
unsigned int  level 
)

Print the tree out.

Parameters
consoleThe output stream to output to
levelThe log level, the higher the number the more output you get

Definition at line 406 of file PerfGraph.C.

Referenced by PerfGraphOutput::output().

407 {
408  console << "\nPerformance Graph:\n";
409  treeTable(level).print(console);
410 }
void print(StreamType &stream)
Pretty print the table of data.
Definition: VariadicTable.h:97
FullTable treeTable(const unsigned int level, const bool heaviest=false)
Helper for building a VariadicTable that represents the tree.
Definition: PerfGraph.C:343

◆ printHeaviestBranch()

void PerfGraph::printHeaviestBranch ( const ConsoleStream console)

Print out the heaviest branch through the tree.

Parameters
consoleThe output stream to output to

Definition at line 413 of file PerfGraph.C.

Referenced by PerfGraphOutput::output().

414 {
415  console << "\nHeaviest Branch:\n";
416  treeTable(MOOSE_MAX_STACK_SIZE, /* heaviest = */ true).print(console);
417 }
void print(StreamType &stream)
Pretty print the table of data.
Definition: VariadicTable.h:97
FullTable treeTable(const unsigned int level, const bool heaviest=false)
Helper for building a VariadicTable that represents the tree.
Definition: PerfGraph.C:343

◆ printHeaviestSections()

void PerfGraph::printHeaviestSections ( const ConsoleStream console,
const unsigned int  num_sections 
)

Print out the heaviest sections that were timed.

Parameters
consoleThe output stream to output to

Definition at line 420 of file PerfGraph.C.

Referenced by PerfGraphOutput::output().

421 {
422  update();
423 
424  console << "\nHeaviest Sections:\n";
425 
426  // Indirect Sort The Self Time
427  std::vector<size_t> sorted;
430  sorted,
431  [](CumulativeSectionInfo * lhs, CumulativeSectionInfo * rhs)
432  {
433  if (lhs && rhs)
434  return lhs->_self > rhs->_self;
435 
436  // If the LHS exists - it's definitely bigger than a non-existant RHS
437  if (lhs)
438  return true;
439 
440  // Both don't exist - so it doesn't matter how we sort them
441  return false;
442  });
443 
444  HeaviestTable vtable({"Section", "Calls", "Self(s)", "Avg.", "%", "Mem(MB)"}, 10);
445 
446  vtable.setColumnFormat({VariadicTableColumnFormat::AUTO, // Section; doesn't matter
452  );
453 
454  vtable.setColumnPrecision({
455  1, // Section
456  1, // Calls
457  3, // Time
458  3, // Avg.
459  2, // Percent
460  1 // Memory
461  });
462 
463  mooseAssert(!_cumulative_section_info_ptrs.empty(),
464  "update() must be run before printHeaviestSections()!");
465 
466  // The total time of the root node
467  auto total_root_time = _cumulative_section_info_ptrs[_root_node_id]->_total;
468 
469  // Now print out the largest ones
470  for (unsigned int i = 0; i < num_sections; i++)
471  {
472  auto id = sorted[i];
473 
475  continue;
476 
477  const auto & entry = *_cumulative_section_info_ptrs[id];
478  vtable.addRow(_perf_graph_registry.sectionInfo(id)._name, // Section
479  entry._num_calls, // Calls
480  entry._self, // Time
481  entry._self / static_cast<Real>(entry._num_calls), // Avg.
482  100. * entry._self / total_root_time, // Percent
483  entry._self_memory); // Memory
484  }
485 
486  vtable.print(console);
487 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
Definition: IndirectSort.h:68
void update()
Updates the time section_time and time for all currently running nodes.
Definition: PerfGraph.C:275
std::vector< CumulativeSectionInfo * > _cumulative_section_info_ptrs
Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we...
Definition: PerfGraph.h:381
const PerfGraphSectionInfo & sectionInfo(const PerfID section_id) const
Given a PerfID return the PerfGraphSectionInfo The ID.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
VariadicTable< std::string, unsigned long int, Real, Real, Real, long int > HeaviestTable
Definition: PerfGraph.h:206
const PerfID _root_node_id
The id for the root node.
Definition: PerfGraph.h:346

◆ push()

void PerfGraph::push ( const PerfID  id)
protected

Add a Node onto the end of the end of the current callstack.

Note: only accessible by using PerfGuard!

Definition at line 185 of file PerfGraph.C.

Referenced by PerfGraph(), and PerfGuard::PerfGuard().

186 {
187  if (!_active)
188  return;
189 
190  PerfNode * new_node = nullptr;
191 
192  if (id == _root_node_id)
193  new_node = _root_node.get();
194  else
195  new_node = _stack[_current_position]->getChild(id);
196 
197  MemoryUtils::Stats stats;
198  auto memory_success = MemoryUtils::getMemoryStats(stats);
199 
200  long int start_memory = 0;
201 
202  if (memory_success)
203  start_memory =
205  else if (_current_position !=
206  -1) // If we weren't able to get the memory stats, let's just use the parent's
207  start_memory = _stack[_current_position]->startMemory();
208 
209  // Set the start time
210  auto current_time = std::chrono::steady_clock::now();
211 
212  new_node->setStartTimeAndMemory(current_time, start_memory);
213 
214  // Increment the number of calls
215  new_node->incrementNumCalls();
216 
218 
219  if (_current_position >= MOOSE_MAX_STACK_SIZE)
220  mooseError("PerfGraph is out of stack space!");
221 
222  _stack[_current_position] = new_node;
223 
224  // Add this to the execution list unless the message is empty - but pre-emted by live_print_all
225  if ((_pid == 0 && !_disable_live_print) &&
227  addToExecutionList(id, IncrementState::STARTED, current_time, start_memory);
228 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
std::string _live_message
Message to print while the section is running.
void setStartTimeAndMemory(const std::chrono::time_point< std::chrono::steady_clock > time, const long int memory)
Set the current start time.
Definition: PerfNode.h:40
bool getMemoryStats(Stats &stats)
get all memory stats for the current process stats The Stats object to fill with the data ...
Definition: MemoryUtils.C:79
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
std::size_t _physical_memory
Definition: MemoryUtils.h:23
bool _live_print_all
Whether or not to put everything in the perf graph.
Definition: PerfGraph.h:331
void addToExecutionList(const PerfID id, const IncrementState state, const std::chrono::time_point< std::chrono::steady_clock > time, const long int memory)
Add the information to the execution list.
Definition: PerfGraph.C:154
void incrementNumCalls()
Increments the number of calls.
Definition: PerfNode.h:75
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
bool _active
Whether or not timing is active.
Definition: PerfGraph.h:384
int _current_position
The current node position in the stack.
Definition: PerfGraph.h:352
bool _disable_live_print
Whether or not live print is disabled (cannot be turned on again)
Definition: PerfGraph.h:334
std::array< PerfNode *, MOOSE_MAX_STACK_SIZE > _stack
The full callstack. Currently capped at a depth of 100.
Definition: PerfGraph.h:355
const libMesh::processor_id_type _pid
This processor id.
Definition: PerfGraph.h:340
std::size_t convertBytes(std::size_t bytes, MemUnits unit)
convert bytes to selected unit prefix
Definition: MemoryUtils.C:174
const PerfGraphSectionInfo & readSectionInfo(PerfID section_id) const
Special accessor just for PerfGraph so that no locking is needed in PerfGraph.
const PerfID _root_node_id
The id for the root node.
Definition: PerfGraph.h:346
A node in the PerfGraph.
Definition: PerfNode.h:24

◆ recursivelyUpdate()

void PerfGraph::recursivelyUpdate ( const PerfNode current_node)
protected

Updates the cumulative self/children/total time and memory for each section across all nodes that contribute to said section in _cumulative_section_info.

Note: requires that the contents in each CumulativeSectionInfo in _cumulative_section_info be initially resized and zeroed

Parameters
current_nodeThe current node to work on

Definition at line 322 of file PerfGraph.C.

Referenced by update().

323 {
324  const auto & section_name = _perf_graph_registry.readSectionInfo(current_node.id())._name;
325 
326  // RHS insertion on purpose
327  auto & section_time = _cumulative_section_info[section_name];
328 
329  section_time._self += current_node.selfTimeSec();
330  section_time._children += current_node.childrenTimeSec();
331  section_time._total += current_node.totalTimeSec();
332  section_time._num_calls += current_node.numCalls();
333 
334  section_time._self_memory += current_node.selfMemory();
335  section_time._children_memory += current_node.childrenMemory();
336  section_time._total_memory += current_node.totalMemory();
337 
338  for (auto & child_it : current_node.children())
339  recursivelyUpdate(*child_it.second);
340 }
long int totalMemory() const
Get the amount of memory added by this node.
Definition: PerfNode.h:161
void recursivelyUpdate(const PerfNode &current_node)
Updates the cumulative self/children/total time and memory for each section across all nodes that con...
Definition: PerfGraph.C:322
Real selfTimeSec() const
Get the time this node took in seconds.
Definition: PerfNode.h:115
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
long int selfMemory() const
Get the amount of memory added by this node.
Definition: PerfNode.C:41
long int childrenMemory() const
Get the amount of memory added by this node.
Definition: PerfNode.C:47
Real totalTimeSec() const
The time this Node plus all of its children took in seconds.
Definition: PerfNode.h:128
unsigned long int numCalls() const
Get the number of times this node was called.
Definition: PerfNode.h:146
const std::map< PerfID, std::unique_ptr< PerfNode > > & children() const
Get the children.
Definition: PerfNode.h:106
Real childrenTimeSec() const
The time this node&#39;s children took in seconds.
Definition: PerfNode.h:141
PerfID id() const
Get the ID of this Node.
Definition: PerfNode.h:35
std::unordered_map< std::string, CumulativeSectionInfo > _cumulative_section_info
The cumulative time and memory for each section.
Definition: PerfGraph.h:375
const PerfGraphSectionInfo & readSectionInfo(PerfID section_id) const
Special accessor just for PerfGraph so that no locking is needed in PerfGraph.

◆ rootNode()

const PerfNode& PerfGraph::rootNode ( ) const
inline
Returns
A constant reference to the root node

Definition at line 186 of file PerfGraph.h.

Referenced by to_json().

186 { return *_root_node; }
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349

◆ sectionData()

Real PerfGraph::sectionData ( const DataType  type,
const std::string &  section_name,
const bool  must_exist = true 
)

Gets a PerfGraph result pertaining to a section.

Parameters
typeThe result type to retrieve
section_nameThe name of the section
must_existWhether not the section must exist; if false and the section does not exist, returns 0, if true and the section does not exist, exit with an error

Definition at line 93 of file PerfGraph.C.

Referenced by PerfGraphData::finalize().

96 {
97  update();
98 
99  const auto section_it =
100  _cumulative_section_info.find(section_name == "Root" ? _root_name : section_name);
101 
102  if (section_it == _cumulative_section_info.end())
103  {
104  if (!must_exist || // isn't required to exist
105  _perf_graph_registry.sectionExists(section_name) // or, is required to exist and it does
106  )
107  return 0;
108 
109  mooseError("Unknown PerfGraph section name \"",
110  section_name,
111  "\" in PerfGraph::sectionData().\nIf you are attempting to retrieve the root use "
112  "\"Root\".");
113  }
114 
115  const CumulativeSectionInfo & section_info = section_it->second;
116 
117  if (type == CALLS)
118  return section_info._num_calls;
119 
120  const auto app_time = _cumulative_section_info_ptrs[_root_node_id]->_total;
121 
122  switch (type)
123  {
124  case SELF:
125  return section_info._self;
126  case CHILDREN:
127  return section_info._children;
128  case TOTAL:
129  return section_info._total;
130  case SELF_AVG:
131  return section_info._self / static_cast<Real>(section_info._num_calls);
132  case CHILDREN_AVG:
133  return section_info._children / static_cast<Real>(section_info._num_calls);
134  case TOTAL_AVG:
135  return section_info._total / static_cast<Real>(section_info._num_calls);
136  case SELF_PERCENT:
137  return 100. * (section_info._self / app_time);
138  case CHILDREN_PERCENT:
139  return 100. * (section_info._children / app_time);
140  case TOTAL_PERCENT:
141  return 100. * (section_info._total / app_time);
142  case SELF_MEMORY:
143  return section_info._self_memory;
144  case CHILDREN_MEMORY:
145  return section_info._children_memory;
146  case TOTAL_MEMORY:
147  return section_info._total_memory;
148  default:
149  ::mooseError("Unknown DataType");
150  }
151 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
bool sectionExists(const std::string &section_name) const
Whether or not a section with that name has been registered The name of the section.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
void update()
Updates the time section_time and time for all currently running nodes.
Definition: PerfGraph.C:275
std::vector< CumulativeSectionInfo * > _cumulative_section_info_ptrs
Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we...
Definition: PerfGraph.h:381
std::unordered_map< std::string, CumulativeSectionInfo > _cumulative_section_info
The cumulative time and memory for each section.
Definition: PerfGraph.h:375
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::string _root_name
Name of the root node.
Definition: PerfGraph.h:343
const PerfID _root_node_id
The id for the root node.
Definition: PerfGraph.h:346

◆ setActive()

void PerfGraph::setActive ( bool  active)
inline

Turn on or off timing.

Definition at line 129 of file PerfGraph.h.

Referenced by CommonOutputAction::act(), and MooseApp::setupOptions().

129 { _active = active; }
bool active() const
Whether or not timing is active.
Definition: PerfGraph.h:124
bool _active
Whether or not timing is active.
Definition: PerfGraph.h:384

◆ setLiveMemoryLimit()

void PerfGraph::setLiveMemoryLimit ( unsigned int  mem_limit)
inline

Sert the memory limit before a message prints.

Definition at line 157 of file PerfGraph.h.

Referenced by CommonOutputAction::act().

158  {
159  _live_print_mem_limit.store(mem_limit, std::memory_order_relaxed);
160  }
std::atomic< unsigned int > _live_print_mem_limit
The memory limit before a message is printed (in MB)
Definition: PerfGraph.h:402

◆ setLivePrintAll()

void PerfGraph::setLivePrintAll ( bool  active)
inline

Forces all sections to be output live.

Definition at line 144 of file PerfGraph.h.

144 { _live_print_all = active; }
bool _live_print_all
Whether or not to put everything in the perf graph.
Definition: PerfGraph.h:331
bool active() const
Whether or not timing is active.
Definition: PerfGraph.h:124

◆ setLiveTimeLimit()

void PerfGraph::setLiveTimeLimit ( Real  time_limit)
inline

Set the time limit before a message prints.

Definition at line 149 of file PerfGraph.h.

Referenced by CommonOutputAction::act().

150  {
151  _live_print_time_limit.store(time_limit, std::memory_order_relaxed);
152  }
std::atomic< Real > _live_print_time_limit
The time limit before a message is printed (in seconds)
Definition: PerfGraph.h:399

◆ treeRecurse()

template<typename Functor >
void PerfGraph::treeRecurse ( const Functor &  act,
const unsigned int  level = MOOSE_MAX_STACK_SIZE,
const bool  heaviest = false 
) const

Definition at line 473 of file PerfGraph.h.

Referenced by treeTable().

476 {
477  mooseAssert(_root_node, "Root node does not exist; calling this too early");
478  treeRecurseInternal(*_root_node, act, level, heaviest, 0);
479 }
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
void treeRecurseInternal(const PerfNode &node, const Functor &act, const unsigned int level, const bool heaviest, unsigned int current_depth) const
Definition: PerfGraph.h:435

◆ treeRecurseInternal()

template<typename Functor >
void PerfGraph::treeRecurseInternal ( const PerfNode node,
const Functor &  act,
const unsigned int  level,
const bool  heaviest,
unsigned int  current_depth 
) const
private

Definition at line 435 of file PerfGraph.h.

Referenced by treeRecurse().

440 {
441  mooseAssert(_perf_graph_registry.sectionExists(node.id()), "Unable to find section name!");
442 
443  const auto & current_section_info = _perf_graph_registry.readSectionInfo(node.id());
444  if (current_section_info._level <= level)
445  {
446  mooseAssert(!_cumulative_section_info_ptrs.empty(), "update() must be run before treeRecurse!");
447  act(node, current_section_info, current_depth++);
448  }
449 
450  if (heaviest)
451  {
452  const PerfNode * heaviest_child = nullptr;
453  for (const auto & child_it : node.children())
454  {
455  const auto & current_child = *child_it.second;
456 
457  if (!heaviest_child || (current_child.totalTime() > heaviest_child->totalTime()))
458  heaviest_child = &current_child;
459  }
460 
461  if (heaviest_child)
462  treeRecurseInternal(*heaviest_child, act, level, true, current_depth);
463  }
464  else
465  {
466  for (const auto & child_it : node.children())
467  treeRecurseInternal(*child_it.second, act, level, false, current_depth);
468  }
469 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
bool sectionExists(const std::string &section_name) const
Whether or not a section with that name has been registered The name of the section.
std::vector< CumulativeSectionInfo * > _cumulative_section_info_ptrs
Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we...
Definition: PerfGraph.h:381
const std::map< PerfID, std::unique_ptr< PerfNode > > & children() const
Get the children.
Definition: PerfNode.h:106
PerfID id() const
Get the ID of this Node.
Definition: PerfNode.h:35
std::chrono::steady_clock::duration totalTime() const
The time this Node plus all of it&#39;s children took.
Definition: PerfNode.C:22
void treeRecurseInternal(const PerfNode &node, const Functor &act, const unsigned int level, const bool heaviest, unsigned int current_depth) const
Definition: PerfGraph.h:435
const PerfGraphSectionInfo & readSectionInfo(PerfID section_id) const
Special accessor just for PerfGraph so that no locking is needed in PerfGraph.
A node in the PerfGraph.
Definition: PerfNode.h:24

◆ treeTable()

PerfGraph::FullTable PerfGraph::treeTable ( const unsigned int  level,
const bool  heaviest = false 
)
private

Helper for building a VariadicTable that represents the tree.

Parameters
levelThe level to print out below (<=)
heaviestShow only the heaviest branch

Definition at line 343 of file PerfGraph.C.

Referenced by print(), and printHeaviestBranch().

344 {
345  update();
346 
347  FullTable vtable({"Section",
348  "Calls",
349  "Self(s)",
350  "Avg(s)",
351  "%",
352  "Mem(MB)",
353  "Total(s)",
354  "Avg(s)",
355  "%",
356  "Mem(MB)"},
357  10);
358 
359  vtable.setColumnFormat({
360  VariadicTableColumnFormat::AUTO, // Section Name
370  });
371 
372  vtable.setColumnPrecision({
373  1, // Section Name
374  0, // Calls
375  3, // Self
376  3, // Avg.
377  2, // %
378  0, // Memory
379  3, // Total
380  3, // Avg.
381  2, // %
382  0, // Memory
383  });
384 
385  auto act = [this, &vtable](const PerfNode & node,
386  const moose::internal::PerfGraphSectionInfo & section_info,
387  const unsigned int depth)
388  {
389  vtable.addRow(std::string(depth * 2, ' ') + section_info._name, // Section Name
390  node.numCalls(), // Calls
391  node.selfTimeSec(), // Self
392  node.selfTimeAvg(), // Avg.
393  100. * node.selfTimeSec() / _root_node->totalTimeSec(), // %
394  node.selfMemory(), // Memory
395  node.totalTimeSec(), // Total
396  node.totalTimeAvg(), // Avg.
397  100. * node.totalTimeSec() / _root_node->totalTimeSec(), // %
398  node.totalMemory()); // Memory
399  };
400  treeRecurse(act, level, heaviest);
401 
402  return vtable;
403 }
long int totalMemory() const
Get the amount of memory added by this node.
Definition: PerfNode.h:161
Real selfTimeSec() const
Get the time this node took in seconds.
Definition: PerfNode.h:115
long int selfMemory() const
Get the amount of memory added by this node.
Definition: PerfNode.C:41
Real selfTimeAvg() const
The average time this node took in seconds.
Definition: PerfNode.h:119
VariadicTable< std::string, unsigned long int, Real, Real, Real, long int, Real, Real, Real, long int > FullTable
Definition: PerfGraph.h:204
Real totalTimeSec() const
The time this Node plus all of its children took in seconds.
Definition: PerfNode.h:128
Used to hold metadata about the registered sections Note: this is a class instead of a struct because...
void update()
Updates the time section_time and time for all currently running nodes.
Definition: PerfGraph.C:275
unsigned long int numCalls() const
Get the number of times this node was called.
Definition: PerfNode.h:146
void treeRecurse(const Functor &act, const unsigned int level=MOOSE_MAX_STACK_SIZE, const bool heaviest=false) const
Definition: PerfGraph.h:473
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
Real totalTimeAvg() const
The average time this Node plus all of its children took in seconds.
Definition: PerfNode.h:132
A node in the PerfGraph.
Definition: PerfNode.h:24

◆ update()

void PerfGraph::update ( )

Updates the time section_time and time for all currently running nodes.

Definition at line 275 of file PerfGraph.C.

Referenced by dataLoad(), dataStore(), printHeaviestSections(), sectionData(), and treeTable().

276 {
277  // First update all of the currently running nodes
278  auto now = std::chrono::steady_clock::now();
279 
280  MemoryUtils::Stats stats;
282  auto now_memory =
284 
285  for (int i = 0; i <= _current_position; i++)
286  {
287  auto node = _stack[i];
288  node->addTimeAndMemory(now, now_memory);
289  node->setStartTimeAndMemory(now, now_memory);
290  }
291 
292  // Zero out the entries
293  for (auto & section_time_it : _cumulative_section_info)
294  {
295  auto & section_time = section_time_it.second;
296 
297  section_time._num_calls = 0;
298  section_time._self = 0.;
299  section_time._children = 0.;
300  section_time._total = 0.;
301  section_time._self_memory = 0;
302  section_time._children_memory = 0;
303  section_time._total_memory = 0.;
304  }
305 
307 
308  // Update vector pointing to section times
309  // Note: we are doing this _after_ recursively filling
310  // because new entries may have been created
312 
313  for (auto & section_time_it : _cumulative_section_info)
314  {
315  auto id = _perf_graph_registry.sectionID(section_time_it.first);
316 
317  _cumulative_section_info_ptrs[id] = &section_time_it.second;
318  }
319 }
void recursivelyUpdate(const PerfNode &current_node)
Updates the cumulative self/children/total time and memory for each section across all nodes that con...
Definition: PerfGraph.C:322
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
bool getMemoryStats(Stats &stats)
get all memory stats for the current process stats The Stats object to fill with the data ...
Definition: MemoryUtils.C:79
std::size_t _physical_memory
Definition: MemoryUtils.h:23
std::vector< CumulativeSectionInfo * > _cumulative_section_info_ptrs
Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we...
Definition: PerfGraph.h:381
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
std::unordered_map< std::string, CumulativeSectionInfo > _cumulative_section_info
The cumulative time and memory for each section.
Definition: PerfGraph.h:375
int _current_position
The current node position in the stack.
Definition: PerfGraph.h:352
std::array< PerfNode *, MOOSE_MAX_STACK_SIZE > _stack
The full callstack. Currently capped at a depth of 100.
Definition: PerfGraph.h:355
PerfID sectionID(const std::string &section_name) const
Given a name return the PerfID The name of the section.
std::size_t convertBytes(std::size_t bytes, MemUnits unit)
convert bytes to selected unit prefix
Definition: MemoryUtils.C:174

Friends And Related Function Documentation

◆ dataLoad

void dataLoad ( std::istream &  stream,
PerfGraph perf_graph,
void context 
)
friend

Definition at line 504 of file PerfGraph.C.

505 {
506  // Load in all of the recovered sections and register those that do not exist yet
507  std::vector<moose::internal::PerfGraphSectionInfo> recovered_section_info;
508  dataLoad(stream, recovered_section_info, nullptr);
509  for (const auto & info : recovered_section_info)
510  {
511  if (info._live_message.size())
513  info._name, info._level, info._live_message, info._print_dots);
514  else
515  perf_graph._perf_graph_registry.registerSection(info._name, info._level);
516  }
517 
518  // Update the current node time/memory/calls before loading the nodes as the load
519  // will append information to current nodes that exist
520  perf_graph.update();
521 
522  // Recursively load all of the nodes; this will append information to matching nodes
523  // and will create new nodes for section paths that do not exist
524  dataLoad(stream, perf_graph._root_node, &perf_graph);
525 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
MPI_Info info
void update()
Updates the time section_time and time for all currently running nodes.
Definition: PerfGraph.C:275
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
PerfID registerSection(const std::string &section_name, const unsigned int level)
Call to register a named section for timing.
friend void dataLoad(std::istream &, PerfGraph &, void *)
Definition: PerfGraph.C:504

◆ dataStore

void dataStore ( std::ostream &  stream,
PerfGraph perf_graph,
void context 
)
friend

Definition at line 490 of file PerfGraph.C.

491 {
492  // We need to store the registry id -> section info map so that we can add
493  // registered sections that may not be added yet during recover
494  dataStore(stream, perf_graph._perf_graph_registry._id_to_item, nullptr);
495 
496  // Update before serializing the nodes so that the time/memory/calls are correct
497  perf_graph.update();
498 
499  // Recursively serialize all of the nodes
500  dataStore(stream, perf_graph._root_node, nullptr);
501 }
PerfGraphRegistry & _perf_graph_registry
The PerfGraphRegistry.
Definition: PerfGraph.h:337
friend void dataStore(std::ostream &, PerfGraph &, void *)
Definition: PerfGraph.C:490
void update()
Updates the time section_time and time for all currently running nodes.
Definition: PerfGraph.C:275
const std::unique_ptr< PerfNode > _root_node
The root node of the graph.
Definition: PerfGraph.h:349
std::deque< Item > _id_to_item
Vector of IDs to Items.

◆ PerfGraphLivePrint

friend class PerfGraphLivePrint
friend

Definition at line 412 of file PerfGraph.h.

◆ PerfGuard

friend class PerfGuard
friend

Definition at line 411 of file PerfGraph.h.

Member Data Documentation

◆ _active

bool PerfGraph::_active
protected

Whether or not timing is active.

Definition at line 384 of file PerfGraph.h.

Referenced by active(), pop(), push(), and setActive().

◆ _console

const ConsoleStream ConsoleStreamInterface::_console
inherited

An instance of helper class to write streams to the Console objects.

Definition at line 31 of file ConsoleStreamInterface.h.

Referenced by IterationAdaptiveDT::acceptStep(), MeshOnlyAction::act(), SetupDebugAction::act(), MaterialOutputAction::act(), Adaptivity::adaptMesh(), FEProblemBase::adaptMesh(), addToExecutionList(), SimplePredictor::apply(), SystemBase::applyScalingFactors(), MultiApp::backup(), FEProblemBase::backupMultiApps(), CoarsenedPiecewiseLinear::buildCoarsenedGrid(), DefaultSteadyStateConvergence::checkConvergence(), MeshDiagnosticsGenerator::checkElementOverlap(), MeshDiagnosticsGenerator::checkElementTypes(), MeshDiagnosticsGenerator::checkElementVolumes(), FEProblemBase::checkExceptionAndStopSolve(), SolverSystem::checkInvalidSolution(), MeshDiagnosticsGenerator::checkLocalJacobians(), MeshDiagnosticsGenerator::checkNonConformalMesh(), MeshDiagnosticsGenerator::checkNonConformalMeshFromAdaptivity(), MeshDiagnosticsGenerator::checkNonMatchingEdges(), MeshDiagnosticsGenerator::checkNonPlanarSides(), FEProblemBase::checkProblemIntegrity(), ReferenceResidualConvergence::checkRelativeConvergence(), MeshDiagnosticsGenerator::checkSidesetsOrientation(), MeshDiagnosticsGenerator::checkWatertightNodesets(), MeshDiagnosticsGenerator::checkWatertightSidesets(), IterationAdaptiveDT::computeAdaptiveDT(), TransientBase::computeConstrainedDT(), DefaultMultiAppFixedPointConvergence::computeCustomConvergencePostprocessor(), NonlinearSystemBase::computeDamping(), FixedPointIterationAdaptiveDT::computeDT(), IterationAdaptiveDT::computeDT(), IterationAdaptiveDT::computeFailedDT(), IterationAdaptiveDT::computeInitialDT(), IterationAdaptiveDT::computeInterpolationDT(), LinearSystem::computeLinearSystemTags(), FEProblemBase::computeLinearSystemTags(), NonlinearSystemBase::computeScaling(), Problem::console(), IterationAdaptiveDT::constrainStep(), TimeStepper::constrainStep(), MultiApp::createApp(), FEProblemBase::execMultiApps(), FEProblemBase::execMultiAppTransfers(), MFEMSteady::execute(), MessageFromInput::execute(), SteadyBase::execute(), Eigenvalue::execute(), ActionWarehouse::executeActionsWithAction(), ActionWarehouse::executeAllActions(), MeshGeneratorSystem::executeMeshGenerators(), ElementQualityChecker::finalize(), FEProblemBase::finishMultiAppStep(), MeshRepairGenerator::fixOverlappingNodes(), CoarsenBlockGenerator::generate(), MeshGenerator::generateInternal(), VariableCondensationPreconditioner::getDofToCondense(), InversePowerMethod::init(), NonlinearEigen::init(), FEProblemBase::initialAdaptMesh(), DefaultMultiAppFixedPointConvergence::initialize(), EigenExecutionerBase::inversePowerIteration(), FEProblemBase::joinAndFinalize(), TransientBase::keepGoing(), IterationAdaptiveDT::limitDTByFunction(), IterationAdaptiveDT::limitDTToPostprocessorValue(), FEProblemBase::logAdd(), EigenExecutionerBase::makeBXConsistent(), Console::meshChanged(), MooseBaseErrorInterface::mooseDeprecated(), MooseBaseErrorInterface::mooseInfo(), MooseBaseErrorInterface::mooseWarning(), MooseBaseErrorInterface::mooseWarningNonPrefixed(), ReferenceResidualConvergence::nonlinearConvergenceSetup(), ReporterDebugOutput::output(), PerfGraphOutput::output(), SolutionInvalidityOutput::output(), MaterialPropertyDebugOutput::output(), DOFMapOutput::output(), VariableResidualNormsDebugOutput::output(), Console::output(), ControlOutput::outputActiveObjects(), ControlOutput::outputChangedControls(), ControlOutput::outputControls(), Console::outputInput(), Console::outputPostprocessors(), PseudoTimestep::outputPseudoTimestep(), Console::outputReporters(), DefaultMultiAppFixedPointConvergence::outputResidualNorm(), Console::outputScalarVariables(), Console::outputSystemInformation(), FEProblemBase::possiblyRebuildGeomSearchPatches(), EigenExecutionerBase::postExecute(), AB2PredictorCorrector::postSolve(), ActionWarehouse::printActionDependencySets(), BlockRestrictionDebugOutput::printBlockRestrictionMap(), SolutionInvalidity::printDebug(), EigenExecutionerBase::printEigenvalue(), SecantSolve::printFixedPointConvergenceHistory(), SteffensenSolve::printFixedPointConvergenceHistory(), PicardSolve::printFixedPointConvergenceHistory(), FixedPointSolve::printFixedPointConvergenceReason(), PerfGraphLivePrint::printLiveMessage(), MaterialPropertyDebugOutput::printMaterialMap(), PerfGraphLivePrint::printStats(), NEML2Action::printSummary(), AutomaticMortarGeneration::projectPrimaryNodesSinglePair(), AutomaticMortarGeneration::projectSecondaryNodesSinglePair(), CoarsenBlockGenerator::recursiveCoarsen(), SolutionTimeAdaptiveDT::rejectStep(), MultiApp::restore(), FEProblemBase::restoreMultiApps(), FEProblemBase::restoreSolutions(), NonlinearSystemBase::setInitialSolution(), MooseApp::setupOptions(), Checkpoint::shouldOutput(), SubProblem::showFunctorRequestors(), SubProblem::showFunctors(), FullSolveMultiApp::showStatusMessage(), EigenProblem::solve(), FEProblemSolve::solve(), FixedPointSolve::solve(), NonlinearSystem::solve(), LinearSystem::solve(), LStableDirk2::solve(), LStableDirk3::solve(), ImplicitMidpoint::solve(), ExplicitTVDRK2::solve(), LStableDirk4::solve(), AStableDirk4::solve(), ExplicitRK2::solve(), TransientMultiApp::solveStep(), FixedPointSolve::solveStep(), PerfGraphLivePrint::start(), AB2PredictorCorrector::step(), NonlinearEigen::takeStep(), TransientBase::takeStep(), TerminateChainControl::terminate(), Convergence::verboseOutput(), Console::writeTimestepInformation(), Console::writeVariableNorms(), and FEProblemBase::~FEProblemBase().

◆ _cumulative_section_info

std::unordered_map<std::string, CumulativeSectionInfo> PerfGraph::_cumulative_section_info
protected

The cumulative time and memory for each section.

This is updated on update() Note that this is total cumulative time/memory across every place that section is in the graph

I'm making this a map so that we can give out references to the values The three values are: self, children The map is on std::string because we might need to be able to retrieve timing values in a "late binding" situation before the section has been registered.

Definition at line 375 of file PerfGraph.h.

Referenced by recursivelyUpdate(), sectionData(), and update().

◆ _cumulative_section_info_ptrs

std::vector<CumulativeSectionInfo *> PerfGraph::_cumulative_section_info_ptrs
protected

Pointers into _cumulative_section_info indexed on PerfID This is here for convenience and speed so we don't need to iterate over the above map much - and it makes it easier to sort.

Definition at line 381 of file PerfGraph.h.

Referenced by printHeaviestSections(), sectionData(), treeRecurseInternal(), and update().

◆ _current_position

int PerfGraph::_current_position
protected

The current node position in the stack.

Definition at line 352 of file PerfGraph.h.

Referenced by pop(), push(), and update().

◆ _destructing

bool PerfGraph::_destructing
protected

Tell the print thread to teardown.

Definition at line 390 of file PerfGraph.h.

Referenced by disableLivePrint(), and PerfGraphLivePrint::start().

◆ _destructing_mutex

std::mutex PerfGraph::_destructing_mutex
protected

The mutex to use with a condition_variable predicate to guard _destructing.

Definition at line 393 of file PerfGraph.h.

Referenced by disableLivePrint(), and PerfGraphLivePrint::start().

◆ _disable_live_print

bool PerfGraph::_disable_live_print
protected

Whether or not live print is disabled (cannot be turned on again)

Definition at line 334 of file PerfGraph.h.

Referenced by disableLivePrint(), enableLivePrint(), pop(), and push().

◆ _done

std::promise<bool> PerfGraph::_done
protected

The promise to the print thread that will signal when to stop.

Definition at line 387 of file PerfGraph.h.

◆ _execution_list

std::array<SectionIncrement, MAX_EXECUTION_LIST_SIZE> PerfGraph::_execution_list
protected

A circular buffer for holding the execution list, this is read by the printing loop.

Definition at line 358 of file PerfGraph.h.

Referenced by addToExecutionList().

◆ _execution_list_begin

std::atomic<unsigned int> PerfGraph::_execution_list_begin
protected

Where the print thread should start reading the execution list.

Definition at line 361 of file PerfGraph.h.

◆ _execution_list_end

std::atomic<unsigned int> PerfGraph::_execution_list_end
protected

Where the print thread should stop reading the execution list.

Definition at line 364 of file PerfGraph.h.

Referenced by addToExecutionList(), and PerfGraphLivePrint::start().

◆ _finished_section

std::condition_variable PerfGraph::_finished_section
protected

The condition_variable to wake the print thread.

Definition at line 396 of file PerfGraph.h.

Referenced by disableLivePrint(), pop(), and PerfGraphLivePrint::start().

◆ _live_print

const std::unique_ptr<PerfGraphLivePrint> PerfGraph::_live_print
protected

The object that is doing live printing.

Definition at line 405 of file PerfGraph.h.

Referenced by enableLivePrint().

◆ _live_print_all

bool PerfGraph::_live_print_all
protected

Whether or not to put everything in the perf graph.

Definition at line 331 of file PerfGraph.h.

Referenced by PerfGraphLivePrint::iterateThroughExecutionList(), pop(), push(), and setLivePrintAll().

◆ _live_print_mem_limit

std::atomic<unsigned int> PerfGraph::_live_print_mem_limit
protected

The memory limit before a message is printed (in MB)

Definition at line 402 of file PerfGraph.h.

Referenced by setLiveMemoryLimit().

◆ _live_print_time_limit

std::atomic<Real> PerfGraph::_live_print_time_limit
protected

The time limit before a message is printed (in seconds)

Definition at line 399 of file PerfGraph.h.

Referenced by setLiveTimeLimit().

◆ _moose_app

MooseApp& PerfGraph::_moose_app
protected

The MooseApp.

Definition at line 328 of file PerfGraph.h.

Referenced by mooseApp().

◆ _perf_graph_registry

PerfGraphRegistry& PerfGraph::_perf_graph_registry
protected

The PerfGraphRegistry.

Definition at line 337 of file PerfGraph.h.

Referenced by dataLoad(), dataStore(), pop(), printHeaviestSections(), push(), recursivelyUpdate(), sectionData(), treeRecurseInternal(), and update().

◆ _pid

const libMesh::processor_id_type PerfGraph::_pid
protected

This processor id.

Definition at line 340 of file PerfGraph.h.

Referenced by disableLivePrint(), enableLivePrint(), pop(), and push().

◆ _print_thread

std::thread PerfGraph::_print_thread
protected

The thread for printing sections as they execute.

Definition at line 408 of file PerfGraph.h.

Referenced by disableLivePrint(), and enableLivePrint().

◆ _root_name

const std::string PerfGraph::_root_name
protected

Name of the root node.

Definition at line 343 of file PerfGraph.h.

Referenced by sectionData().

◆ _root_node

const std::unique_ptr<PerfNode> PerfGraph::_root_node
protected

The root node of the graph.

Definition at line 349 of file PerfGraph.h.

Referenced by dataLoad(), dataStore(), push(), rootNode(), treeRecurse(), treeTable(), and update().

◆ _root_node_id

const PerfID PerfGraph::_root_node_id
protected

The id for the root node.

Definition at line 346 of file PerfGraph.h.

Referenced by PerfGraph(), printHeaviestSections(), push(), and sectionData().

◆ _stack

std::array<PerfNode *, MOOSE_MAX_STACK_SIZE> PerfGraph::_stack
protected

The full callstack. Currently capped at a depth of 100.

Definition at line 355 of file PerfGraph.h.

Referenced by pop(), push(), and update().


The documentation for this class was generated from the following files: