Line data Source code
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 InputParameters; 52 : class MooseObject; 53 : 54 : /** 55 : * Interface for objects interacting with the PerfGraph. 56 : * 57 : * Enables getting PerfGraph information and registering PerfGraph timed sections. 58 : */ 59 : class PerfGraphInterface 60 : { 61 : public: 62 : /** 63 : * For objects that _are_ MooseObjects with a default prefix of type() 64 : */ 65 : PerfGraphInterface(const MooseObject * moose_object); 66 : 67 : static InputParameters validParams(); 68 : 69 : /** 70 : * For objects that _are_ MooseObjects 71 : */ 72 : PerfGraphInterface(const MooseObject * moose_object, const std::string prefix); 73 : 74 : /** 75 : * For objects that aren't MooseObjects 76 : */ 77 : PerfGraphInterface(PerfGraph & perf_graph, const std::string prefix = ""); 78 : 79 : /** 80 : * For objects that construct the PerfGraphInterface _before_ the PerfGraph 81 : * is initialized (see MooseApp and OutputWarehouse) 82 : */ 83 : PerfGraphInterface(MooseApp & moose_app, const std::string prefix = ""); 84 : 85 4021844 : virtual ~PerfGraphInterface() = default; 86 : 87 : /** 88 : * Get the PerfGraph 89 : */ 90 : PerfGraph & perfGraph(); 91 : 92 : protected: 93 : /** 94 : * Call to register a named section for timing. 95 : * 96 : * @param section_name The name of the code section to be timed 97 : * @param level The importance of the timer - lower is more important (0 will always come out) 98 : * @return The ID of the section - use when starting timing 99 : */ 100 : PerfID registerTimedSection(const std::string & section_name, const unsigned int level) const; 101 : 102 : /** 103 : * Call to register a named section for timing. 104 : * 105 : * @param section_name The name of the code section to be timed 106 : * @param level The importance of the timer - lower is more important (0 will always come out) 107 : * @param live_message The message to be printed to the screen during execution 108 : * @param print_dots Whether or not progress dots should be printed for this section 109 : * @return The ID of the section - use when starting timing 110 : */ 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 : 116 : /** 117 : * @returns The name of the timed section with the name \p section_name. 118 : * 119 : * Optionally adds a prefix if one is defined. 120 : */ 121 : std::string timedSectionName(const std::string & section_name) const; 122 : 123 : /// The MooseApp that owns the PerfGraph 124 : MooseApp & _pg_moose_app; 125 : 126 : /// A prefix to use for all sections 127 : const std::string _prefix; 128 : };