Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_Arena.H
Go to the documentation of this file.
1#ifndef AMREX_ARENA_H_
2#define AMREX_ARENA_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_BLassert.H>
6#include <AMReX_INT.H>
7
8#ifdef AMREX_TINY_PROFILING
10#else
11namespace amrex {
12 struct MemStat {};
13}
14#endif
15
16#include <cstddef>
17#include <cstdlib>
18#include <limits>
19#include <map>
20#include <mutex>
21#include <unordered_map>
22#include <utility>
23
24namespace amrex {
25
30inline std::size_t aligned_size (std::size_t align_requirement, std::size_t size) noexcept
31{
32 return ((size + (align_requirement-1)) / align_requirement) * align_requirement;
33}
34
35inline bool is_aligned (const void* p, std::size_t alignment) noexcept
36{
37 auto* q = const_cast<void*>(p);
38 auto space = alignment;
39 return std::align(alignment, alignment, q, space) == p;
40}
41
42class Arena;
43
44Arena* The_Arena ();
45Arena* The_Async_Arena ();
46Arena* The_Device_Arena ();
47Arena* The_Managed_Arena ();
48Arena* The_Pinned_Arena ();
49Arena* The_Comms_Arena ();
50Arena* The_Cpu_Arena ();
51
53{
54 Long release_threshold = std::numeric_limits<Long>::max();
55 bool use_cpu_memory = false;
57 bool device_set_readonly = false;
60 bool defragmentation = false;
61 ArenaInfo& SetReleaseThreshold (Long rt) noexcept {
63 return *this;
64 }
68 return *this;
69 }
70 ArenaInfo& SetReadOnly () noexcept {
73 return *this;
74 }
75 ArenaInfo& SetPreferred () noexcept {
78 return *this;
79 }
80 ArenaInfo& SetHostAlloc () noexcept {
83 return *this;
84 }
85 ArenaInfo& SetCpuMemory () noexcept {
86 use_cpu_memory = true;
88 device_set_readonly = false;
91 return *this;
92 }
93 ArenaInfo& SetDefragmentation (bool b) noexcept {
95 return *this;
96 }
97};
98
104class Arena
105{
106public:
107
108 virtual ~Arena () = default;
109 Arena () noexcept = default;
110
111 Arena (const Arena& rhs) = delete;
112 Arena (Arena&& rhs) = delete;
113 Arena& operator= (const Arena& rhs) = delete;
114 Arena& operator= (Arena&& rhs) = delete;
115
121 [[nodiscard]] virtual void* alloc (std::size_t sz) = 0;
122
126 [[nodiscard]] virtual std::pair<void*,std::size_t>
127 alloc_in_place (void* /*pt*/, std::size_t /*szmin*/, std::size_t szmax)
128 {
129 auto* p = alloc(szmax);
130 return std::make_pair(p, szmax);
131 }
132
136 [[nodiscard]] virtual void*
137 shrink_in_place (void* /*pt*/, std::size_t sz)
138 {
139 return alloc(sz);
140 }
141
145 virtual void free (void* pt) = 0;
146
151 virtual std::size_t freeUnused () { return 0; }
152
153 // isDeviceAccessible and isHostAccessible can both be true.
154 [[nodiscard]] virtual bool isDeviceAccessible () const;
155 [[nodiscard]] virtual bool isHostAccessible () const;
156
157 // Note that isManaged, isDevice and isPinned are mutually exclusive.
158 // For memory allocated by cudaMalloc* etc., one of them returns true.
159 // Otherwise, neither is true.
160 [[nodiscard]] virtual bool isManaged () const;
161 [[nodiscard]] virtual bool isDevice () const;
162 [[nodiscard]] virtual bool isPinned () const;
163
170 [[nodiscard]] virtual bool hasFreeDeviceMemory (std::size_t sz);
171
176 void registerForProfiling (const std::string& memory_name);
177
183
184#ifdef AMREX_USE_GPU
186 [[nodiscard]] virtual bool isStreamOrderedArena () const { return false; }
187#endif
188
193 static std::size_t align (std::size_t sz);
194
195 static void Initialize (bool minimal);
196 static void PrintUsage (bool print_max_usage=false);
197 static void PrintUsageToFiles (std::string const& filename, std::string const& message);
198 static void Finalize ();
199
200#if 0
201 union Word
202 {
203 void* p;
204 long long ll;
205 long double ld;
206 void (*f) ();
207 };
208 static const std::size_t align_size = sizeof(Word);
209#endif
210
211 static const std::size_t align_size = 16;
212
216 [[nodiscard]] const ArenaInfo& arenaInfo () const { return arena_info; }
217
218 virtual void ResetMaxUsageCounter () {}
219
220protected:
221
223
224 virtual std::size_t freeUnused_protected () { return 0; }
225 void* allocate_system (std::size_t nbytes);
226 void deallocate_system (void* p, std::size_t nbytes);
227
230 bool m_do_profiling = false;
234 std::map<std::string, MemStat> m_profiling_stats;
236 std::unordered_map<void*, std::pair<MemStat*, std::size_t>> m_currently_allocated;
237
239 ArenaProfiler () noexcept = default;
240 ArenaProfiler (const ArenaProfiler& rhs) = delete;
241 ArenaProfiler (ArenaProfiler&& rhs) = delete;
242 ArenaProfiler& operator= (const ArenaProfiler& rhs) = delete;
243 ArenaProfiler& operator= (ArenaProfiler&& rhs) = delete;
244
245 void profile_alloc (void* ptr, std::size_t nbytes);
246
247 void profile_free (void* ptr);
248
250};
251
252}
253
254#endif /*BL_ARENA_H*/
#define BL_ASSERT(EX)
Definition AMReX_BLassert.H:39
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:105
static void Finalize()
Definition AMReX_Arena.cpp:645
virtual void free(void *pt)=0
A pure virtual function for deleting the arena pointed to by pt.
virtual void * alloc(std::size_t sz)=0
static std::size_t align(std::size_t sz)
Given a minimum required arena size of sz bytes, this returns the next largest arena size that will a...
Definition AMReX_Arena.cpp:153
Arena() noexcept=default
virtual ~Arena()=default
virtual bool isPinned() const
Definition AMReX_Arena.cpp:113
virtual void ResetMaxUsageCounter()
Definition AMReX_Arena.H:218
virtual bool isHostAccessible() const
Definition AMReX_Arena.cpp:77
virtual bool isStreamOrderedArena() const
Is this GPU stream ordered memory allocator?
Definition AMReX_Arena.H:186
static const std::size_t align_size
Definition AMReX_Arena.H:211
const ArenaInfo & arenaInfo() const
Return the ArenaInfo object for querying.
Definition AMReX_Arena.H:216
virtual bool isManaged() const
Definition AMReX_Arena.cpp:89
void deregisterFromProfiling()
Remove this Arena from the list of Arenas that are profiled by TinyProfiler. This is equivalent to de...
Definition AMReX_Arena.cpp:140
virtual std::pair< void *, std::size_t > alloc_in_place(void *, std::size_t, std::size_t szmax)
Definition AMReX_Arena.H:127
virtual std::size_t freeUnused_protected()
Definition AMReX_Arena.H:224
void registerForProfiling(const std::string &memory_name)
Add this Arena to the list of Arenas that are profiled by TinyProfiler.
Definition AMReX_Arena.cpp:130
static void PrintUsageToFiles(std::string const &filename, std::string const &message)
Definition AMReX_Arena.cpp:591
virtual bool isDevice() const
Definition AMReX_Arena.cpp:101
virtual bool hasFreeDeviceMemory(std::size_t sz)
Does the device have enough free memory for allocating this much memory? For CPU builds,...
Definition AMReX_Arena.cpp:124
void deallocate_system(void *p, std::size_t nbytes)
Definition AMReX_Arena.cpp:286
virtual void * shrink_in_place(void *, std::size_t sz)
Definition AMReX_Arena.H:137
struct amrex::Arena::ArenaProfiler m_profiler
static void Initialize(bool minimal)
Definition AMReX_Arena.cpp:337
static void PrintUsage(bool print_max_usage=false)
Definition AMReX_Arena.cpp:528
virtual std::size_t freeUnused()
Free unused memory back to the system. Return value is the amount memory freed.
Definition AMReX_Arena.H:151
ArenaInfo arena_info
Definition AMReX_Arena.H:222
virtual bool isDeviceAccessible() const
Definition AMReX_Arena.cpp:67
void * allocate_system(std::size_t nbytes)
Definition AMReX_Arena.cpp:159
Definition AMReX_Amr.cpp:49
bool is_aligned(const void *p, std::size_t alignment) noexcept
Definition AMReX_Arena.H:35
Arena * The_Managed_Arena()
Definition AMReX_Arena.cpp:735
Arena * The_Comms_Arena()
Definition AMReX_Arena.cpp:765
Arena * The_Device_Arena()
Definition AMReX_Arena.cpp:725
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:745
Arena * The_Async_Arena()
Definition AMReX_Arena.cpp:715
std::size_t aligned_size(std::size_t align_requirement, std::size_t size) noexcept
Given a minimum required size of size bytes, this returns the next largest arena size that will align...
Definition AMReX_Arena.H:30
Arena * The_Cpu_Arena()
Definition AMReX_Arena.cpp:755
Arena * The_Arena()
Definition AMReX_Arena.cpp:705
Definition AMReX_Arena.H:53
ArenaInfo & SetReadOnly() noexcept
Definition AMReX_Arena.H:70
bool device_set_preferred
Definition AMReX_Arena.H:58
bool device_set_readonly
Definition AMReX_Arena.H:57
bool device_use_hostalloc
Definition AMReX_Arena.H:59
ArenaInfo & SetReleaseThreshold(Long rt) noexcept
Definition AMReX_Arena.H:61
ArenaInfo & SetDefragmentation(bool b) noexcept
Definition AMReX_Arena.H:93
Long release_threshold
Definition AMReX_Arena.H:54
ArenaInfo & SetPreferred() noexcept
Definition AMReX_Arena.H:75
ArenaInfo & SetCpuMemory() noexcept
Definition AMReX_Arena.H:85
bool device_use_managed_memory
Definition AMReX_Arena.H:56
bool use_cpu_memory
Definition AMReX_Arena.H:55
ArenaInfo & SetDeviceMemory() noexcept
Definition AMReX_Arena.H:65
bool defragmentation
Definition AMReX_Arena.H:60
ArenaInfo & SetHostAlloc() noexcept
Definition AMReX_Arena.H:80
Definition AMReX_Arena.H:228
std::map< std::string, MemStat > m_profiling_stats
Data structure used for profiling with TinyProfiler.
Definition AMReX_Arena.H:234
void profile_alloc(void *ptr, std::size_t nbytes)
Definition AMReX_Arena.cpp:789
void profile_free(void *ptr)
Definition AMReX_Arena.cpp:802
std::unordered_map< void *, std::pair< MemStat *, std::size_t > > m_currently_allocated
Track the currently allocated memory, not used by CArena.
Definition AMReX_Arena.H:236
bool m_do_profiling
If this arena is profiled by TinyProfiler.
Definition AMReX_Arena.H:230
std::mutex m_arena_profiler_mutex
Mutex for the profiling.
Definition AMReX_Arena.H:232
ArenaProfiler() noexcept=default
Definition AMReX_Arena.H:12