Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_TinyProfiler.H
Go to the documentation of this file.
1#ifndef AMREX_TINY_PROFILER_H_
2#define AMREX_TINY_PROFILER_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_INT.H>
6#include <AMReX_REAL.H>
7
8#include <array>
9#include <deque>
10#include <iosfwd>
11#include <limits>
12#include <map>
13#include <string>
14#include <tuple>
15#include <utility>
16#include <vector>
17
18namespace amrex {
19
20struct MemStat
21{
23 Long nfree = 0;
25 double avgmem = 0.;
27};
28
30class TinyProfiler
31{
32public:
33 explicit TinyProfiler (std::string funcname) noexcept;
34 TinyProfiler (std::string funcname, bool start_) noexcept;
35 explicit TinyProfiler (const char* funcname) noexcept;
36 TinyProfiler (const char* funcname, bool start_) noexcept;
38
39 TinyProfiler (TinyProfiler const&) = delete;
43
44 void start ();
45 void stop ();
46
47 void memory_start () const noexcept;
48 void memory_stop () const noexcept;
49
50 static MemStat* memory_alloc (std::size_t nbytes,
51 std::map<std::string, MemStat>& memstats) noexcept;
52 static void memory_free (std::size_t nbytes, MemStat* stat) noexcept;
53
54 static void Initialize ();
55 static void Finalize (bool bFlushing = false);
56
57 static void MemoryInitialize ();
58 static void MemoryFinalize (bool bFlushing = false);
59
60 static bool RegisterArena (const std::string& memory_name,
61 std::map<std::string, MemStat>& memstats) noexcept;
62
63 static void DeregisterArena (std::map<std::string, MemStat>& memstats) noexcept;
64
65 static void StartRegion (std::string regname) noexcept;
66 static void StopRegion (const std::string& regname) noexcept;
67
68 static void PrintCallStack (std::ostream& os);
69
81 [[nodiscard]] static const char* CurrentName () noexcept;
82
83 static void PrintMemoryUsage (std::ostream* os, bool only_local) noexcept;
84
85private:
86 struct Stats
87 {
88 Stats () noexcept = default;
89 int depth{0};
90 Long n{0L};
91 double dtin{0.0};
92 double dtex{0.0};
93 };
94
96 struct ProcStats
97 {
98
99 Long nmin{std::numeric_limits<Long>::max()};
100 Long navg{0L}, nmax{0L};
101 double dtinmin{std::numeric_limits<double>::max()};
102 double dtinavg{0.0}, dtinmax{0.0};
103 double dtexmin{std::numeric_limits<double>::max()};
104 double dtexavg{0.0}, dtexmax{0.0};
105 bool do_print{true};
106 std::string fname;
107 static bool compex (const ProcStats& lhs, const ProcStats& rhs) {
108 return lhs.dtexmax > rhs.dtexmax;
109 }
110 static bool compin (const ProcStats& lhs, const ProcStats& rhs) {
111 return lhs.dtinmax > rhs.dtinmax;
112 }
113 };
114
115 struct MemProcStats
116 {
117 Long nalloc = 0;
118 Long nfree = 0;
119 Long curmem_max = 0;
120 Long avgmem_min = std::numeric_limits<Long>::max();
121 Long avgmem_avg = 0;
122 Long avgmem_max = 0;
123 Long maxmem_min = std::numeric_limits<Long>::max();
124 Long maxmem_avg = 0;
125 Long maxmem_max = 0;
126 std::string fname;
127 static bool compmem (const MemProcStats& lhs, const MemProcStats& rhs) {
128 return lhs.maxmem_max > rhs.maxmem_max;
129 }
130 };
131
132 std::string fname;
133 bool in_parallel_region = false;
134 int global_depth = -1;
135 std::vector<Stats*> stats;
137 const char* prev_name = nullptr;
138
139 static std::deque<const TinyProfiler*> mem_stack;
140
141#ifdef AMREX_USE_OMP
142 struct aligned_deque {
143 // align thread-private data to cache lines to prevent false sharing
144 alignas(64) std::deque<const TinyProfiler*> deque;
145 };
146
147 static std::vector<aligned_deque> mem_stack_thread_private;
148#endif
149 static std::vector<std::map<std::string, MemStat>*> all_memstats;
150 static std::vector<std::string> all_memnames;
151
152 static std::vector<std::string> regionstack;
153 static std::vector<std::pair<std::string,bool> > regionstartstack;
154 static std::deque<std::tuple<double,double,std::string*> > ttstack;
155 static std::map<std::string,std::map<std::string, Stats> > statsmap;
156 static double t_init;
157 static double t_memory_init;
158 static bool device_synchronize_around_region;
159 static int n_print_tabs;
160 static int verbose;
161 static double print_threshold;
162 static bool enabled;
163 static bool memprof_enabled;
164 static std::string output_file;
165
166 static std::string const& get_output_file ();
167 static void PrintStats (std::map<std::string,Stats>& regstats, double dt_max,
168 std::ostream* os);
169 static void PrintMemStats (std::map<std::string, MemStat>& memstats,
170 std::string const& memname, double dt_max,
171 double t_final, std::ostream* os, bool only_local);
172};
173
175{
176public:
177 explicit TinyProfileRegion (std::string a_regname) noexcept;
178 explicit TinyProfileRegion (const char* a_regname) noexcept;
184private:
185 std::string regname;
186 TinyProfiler tprof;
187};
188
189}
190#endif
Definition AMReX_TinyProfiler.H:175
~TinyProfileRegion()
Definition AMReX_TinyProfiler.cpp:1028
TinyProfileRegion & operator=(TinyProfileRegion const &)=delete
TinyProfileRegion(TinyProfileRegion const &)=delete
TinyProfileRegion(TinyProfileRegion &&)=delete
A simple profiler that returns basic performance information (e.g. min, max, and average running time...
Definition AMReX_BLProfiler.H:601
static void Initialize()
Definition AMReX_TinyProfiler.cpp:359
static bool RegisterArena(const std::string &memory_name, std::map< std::string, MemStat > &memstats) noexcept
Definition AMReX_TinyProfiler.cpp:526
static void PrintMemoryUsage(std::ostream *os, bool only_local) noexcept
Definition AMReX_TinyProfiler.cpp:1054
void start()
Definition AMReX_TinyProfiler.cpp:135
TinyProfiler(TinyProfiler const &)=delete
TinyProfiler & operator=(TinyProfiler const &)=delete
static MemStat * memory_alloc(std::size_t nbytes, std::map< std::string, MemStat > &memstats) noexcept
Definition AMReX_TinyProfiler.cpp:315
static void PrintCallStack(std::ostream &os)
Definition AMReX_TinyProfiler.cpp:1035
void stop()
Definition AMReX_TinyProfiler.cpp:202
static void MemoryInitialize()
Definition AMReX_TinyProfiler.cpp:389
void memory_start() const noexcept
Definition AMReX_TinyProfiler.cpp:276
void memory_stop() const noexcept
Definition AMReX_TinyProfiler.cpp:293
static void StartRegion(std::string regname) noexcept
Definition AMReX_TinyProfiler.cpp:985
~TinyProfiler()
Definition AMReX_TinyProfiler.cpp:129
static void StopRegion(const std::string &regname) noexcept
Definition AMReX_TinyProfiler.cpp:998
static void memory_free(std::size_t nbytes, MemStat *stat) noexcept
Definition AMReX_TinyProfiler.cpp:344
static void MemoryFinalize(bool bFlushing=false)
Definition AMReX_TinyProfiler.cpp:497
TinyProfiler(TinyProfiler &&)=delete
static void DeregisterArena(std::map< std::string, MemStat > &memstats) noexcept
Definition AMReX_TinyProfiler.cpp:537
static const char * CurrentName() noexcept
Without the tiny profiler, there is no active profiler.
Definition AMReX_BLProfiler.H:604
amrex_long Long
Definition AMReX_INT.H:30
Definition AMReX_Amr.cpp:50
void Finalize()
Convenience overload that finalizes the instance at the top of the stack.
Definition AMReX.cpp:835
Definition AMReX_Arena.H:21
Long currentmem
amount of currently used memory in bytes
Definition AMReX_TinyProfiler.H:24
Long maxmem
running maximum of currentmem
Definition AMReX_TinyProfiler.H:26
Long nalloc
number of allocations
Definition AMReX_TinyProfiler.H:22
Long nfree
number of frees
Definition AMReX_TinyProfiler.H:23
double avgmem
memory used (bytes) times time in use (seconds)
Definition AMReX_TinyProfiler.H:25