https://mooseframework.inl.gov
PerfGraphInterface.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 MooseApp;
52 class InputParameters;
54 class MooseObject;
55 
62 {
63 public:
65 
69  PerfGraphInterface(const MooseObject * moose_object);
70 
74  PerfGraphInterface(const MooseObject * moose_object, const std::string prefix);
75 
79  PerfGraphInterface(PerfGraph & perf_graph, const std::string prefix = "");
80 
85  PerfGraphInterface(MooseApp & moose_app, const std::string prefix = "");
86 
87 #ifdef MOOSE_KOKKOS_ENABLED
88 
92 #endif
93 
94  virtual ~PerfGraphInterface() = default;
95 
99  PerfGraph & perfGraph();
100 
102 
103 protected:
111  PerfID registerTimedSection(const std::string & section_name, const unsigned int level) const;
112 
122  PerfID registerTimedSection(const std::string & section_name,
123  const unsigned int level,
124  const std::string & live_message,
125  const bool print_dots = true) const;
126 
132  std::string timedSectionName(const std::string & section_name) const;
133 
136 
138  const std::string _prefix;
139 };
Base class for MOOSE-based applications.
Definition: MooseApp.h:108
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
unsigned int PerfID
Definition: MooseTypes.h:240
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
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.
Shared storage and allocation logic for linear finite-volume cell gradients for variables in the syst...