www.mooseframework.org
PerfGraphInterface.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "Moose.h"
13 #include "PerfGuard.h"
14 
15 #ifndef MOOSE_NO_PERF_GRAPH
16 #define TIME_SECTION1(id) \
17  mooseAssert(!Threads::in_threads, "PerfGraph timing cannot be used within threaded sections"); \
18  PerfGuard time_guard(this->_pg_moose_app.perfGraph(), id);
19 #define CHECK_TIME_SECTION(id, section_name) \
20  mooseAssert(moose::internal::getPerfGraphRegistry().sectionInfo(id)._name == \
21  timedSectionName(section_name), \
22  "PerfGraph section '" + timedSectionName(section_name) + \
23  "' is already registered with name '" + \
24  moose::internal::getPerfGraphRegistry().sectionInfo(id)._name + "'");
25 #else
26 #define TIME_SECTION1(id)
27 #define CHECK_TIME_SECTION(id, section_name)
28 #endif
29 
30 #define TIME_SECTION2(section_name, level) \
31  const PerfID __perf_id = this->registerTimedSection(section_name, level); \
32  CHECK_TIME_SECTION(__perf_id, section_name); \
33  TIME_SECTION1(__perf_id);
34 
35 #define TIME_SECTION3(section_name, level, live_message) \
36  const PerfID __perf_id = this->registerTimedSection(section_name, level, live_message); \
37  CHECK_TIME_SECTION(__perf_id, section_name); \
38  TIME_SECTION1(__perf_id);
39 
40 #define TIME_SECTION4(section_name, level, live_message, print_dots) \
41  const PerfID __perf_id = \
42  this->registerTimedSection(section_name, level, live_message, print_dots); \
43  CHECK_TIME_SECTION(__perf_id, section_name); \
44  TIME_SECTION1(__perf_id);
45 
46 // Overloading solution from https://stackoverflow.com/a/11763277
47 #define GET_MACRO(_1, _2, _3, _4, NAME, ...) NAME
48 #define TIME_SECTION(...) \
49  GET_MACRO(__VA_ARGS__, TIME_SECTION4, TIME_SECTION3, TIME_SECTION2, TIME_SECTION1, )(__VA_ARGS__)
50 
51 class InputParameters;
52 class MooseObject;
53 
60 {
61 public:
65  PerfGraphInterface(const MooseObject * moose_object);
66 
68 
72  PerfGraphInterface(const MooseObject * moose_object, const std::string prefix);
73 
77  PerfGraphInterface(PerfGraph & perf_graph, const std::string prefix = "");
78 
83  PerfGraphInterface(MooseApp & moose_app, const std::string prefix = "");
84 
85  virtual ~PerfGraphInterface() = default;
86 
90  PerfGraph & perfGraph();
91 
92 protected:
100  PerfID registerTimedSection(const std::string & section_name, const unsigned int level) const;
101 
111  PerfID registerTimedSection(const std::string & section_name,
112  const unsigned int level,
113  const std::string & live_message,
114  const bool print_dots = true) const;
115 
121  std::string timedSectionName(const std::string & section_name) const;
122 
125 
127  const std::string _prefix;
128 };
Base class for MOOSE-based applications.
Definition: MooseApp.h:73
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
unsigned int PerfID
Definition: MooseTypes.h:201
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:33
virtual ~PerfGraphInterface()=default
std::string timedSectionName(const std::string &section_name) const
Interface for objects interacting with the PerfGraph.
const std::string _prefix
A prefix to use for all sections.
PerfID registerTimedSection(const std::string &section_name, const unsigned int level) const
Call to register a named section for timing.
static InputParameters validParams()
PerfGraph & perfGraph()
Get the PerfGraph.
PerfGraphInterface(const MooseObject *moose_object)
For objects that are MooseObjects with a default prefix of type()
The PerfGraph will hold the master list of all registered performance segments and the head PerfNode...
Definition: PerfGraph.h:43
MooseApp & _pg_moose_app
The MooseApp that owns the PerfGraph.