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#ifdef AMREX_USE_GPU
8#include <AMReX_GpuControl.H>
9#endif
10
11#ifdef AMREX_TINY_PROFILING
12#include <AMReX_TinyProfiler.H>
13#else
14namespace amrex {
15 struct MemStat {};
16}
17#endif
18
19#include <cstddef>
20#include <cstdlib>
21#include <limits>
22#include <map>
23#include <mutex>
24#include <unordered_map>
25#include <utility>
26
27namespace amrex {
28
33inline std::size_t aligned_size (std::size_t align_requirement, std::size_t size) noexcept
34{
35 return ((size + (align_requirement-1)) / align_requirement) * align_requirement;
36}
37
39inline bool is_aligned (const void* p, std::size_t alignment) noexcept
40{
41 auto* q = const_cast<void*>(p);
42 auto space = alignment;
43 return std::align(alignment, alignment, q, space) == p;
44}
45
46class Arena;
47
50Arena* The_Arena ();
53Arena* The_Async_Arena ();
57Arena* The_Device_Arena ();
61Arena* The_Managed_Arena ();
64Arena* The_Pinned_Arena ();
68Arena* The_Comms_Arena ();
71Arena* The_Cpu_Arena ();
72
76Arena* The_Null_Arena ();
77
79{
80 Long release_threshold = std::numeric_limits<Long>::max();
81 bool use_cpu_memory = false;
83 bool device_set_readonly = false;
86 bool defragmentation = false;
89 return *this;
90 }
94 return *this;
95 }
96 ArenaInfo& SetReadOnly () noexcept {
99 return *this;
100 }
101 ArenaInfo& SetPreferred () noexcept {
104 return *this;
105 }
106 ArenaInfo& SetHostAlloc () noexcept {
109 return *this;
110 }
111 ArenaInfo& SetCpuMemory () noexcept {
112 use_cpu_memory = true;
114 device_set_readonly = false;
115 device_set_preferred = false;
116 device_use_hostalloc = false;
117 return *this;
118 }
119 ArenaInfo& SetDefragmentation (bool b) noexcept {
120 defragmentation = b;
121 return *this;
122 }
123};
124
131class Arena
132{
133public:
134
135 virtual ~Arena () = default;
136 Arena () noexcept = default;
137
138 Arena (const Arena& rhs) = delete;
139 Arena (Arena&& rhs) = delete;
140 Arena& operator= (const Arena& rhs) = delete;
141 Arena& operator= (Arena&& rhs) = delete;
142
148 [[nodiscard]] virtual void* alloc (std::size_t sz) = 0;
149
160 [[nodiscard]] virtual std::pair<void*,std::size_t>
161 alloc_in_place (void* /*pt*/, std::size_t /*szmin*/, std::size_t szmax)
162 {
163 auto* p = alloc(szmax);
164 return std::make_pair(p, szmax);
165 }
166
177 [[nodiscard]] virtual void*
178 shrink_in_place (void* /*pt*/, std::size_t sz)
179 {
180 return alloc(sz);
181 }
182
186 virtual void free (void* pt) = 0;
187
192 virtual std::size_t freeUnused () { return 0; }
193
196 [[nodiscard]] virtual bool isDeviceAccessible () const;
197
200 [[nodiscard]] virtual bool isHostAccessible () const;
201
209 [[nodiscard]] virtual bool isManaged () const;
210
218 [[nodiscard]] virtual bool isDevice () const;
219
227 [[nodiscard]] virtual bool isPinned () const;
228
235 [[nodiscard]] virtual bool hasFreeDeviceMemory (std::size_t sz);
236
241 void registerForProfiling (const std::string& memory_name);
242
248
249#ifdef AMREX_USE_GPU
251 [[nodiscard]] virtual bool isStreamOrderedArena () const { return false; }
252 virtual void streamOrderedFree (void* pt, gpuStream_t stream);
253#endif
254
259 static std::size_t align (std::size_t sz);
260
261 static void Initialize (bool minimal);
262
278 static void PrintUsage (bool print_max_usage=false);
279
291 static void PrintUsageToStream (std::ostream& os, std::string const& space);
292
305 static void PrintUsageToFiles (std::string const& filename, std::string const& message);
306
307 static void Finalize ();
308
309#if 0
310 union Word
311 {
312 void* p;
313 long long ll;
314 long double ld;
315 void (*f) ();
316 };
317 static const std::size_t align_size = sizeof(Word);
318#endif
319
321 static const std::size_t align_size = 16;
322
326 [[nodiscard]] const ArenaInfo& arenaInfo () const { return arena_info; }
327
330 virtual void ResetMaxUsageCounter () {}
331
333 [[nodiscard]] static bool IsInitialized ();
334
335protected:
336
338
339 virtual std::size_t freeUnused_protected () { return 0; }
340 void* allocate_system (std::size_t nbytes);
341 void deallocate_system (void* p, std::size_t nbytes);
342 static void out_of_memory_abort (std::string const& memory_type, std::size_t nbytes,
343 std::string const& error_msg);
344
347 bool m_do_profiling = false;
351 std::map<std::string, MemStat> m_profiling_stats;
353 std::unordered_map<void*, std::pair<MemStat*, std::size_t>> m_currently_allocated;
354
356 ArenaProfiler () noexcept = default;
357 ArenaProfiler (const ArenaProfiler& rhs) = delete;
358 ArenaProfiler (ArenaProfiler&& rhs) = delete;
359 ArenaProfiler& operator= (const ArenaProfiler& rhs) = delete;
360 ArenaProfiler& operator= (ArenaProfiler&& rhs) = delete;
361
362 void profile_alloc (void* ptr, std::size_t nbytes);
363
364 void profile_free (void* ptr);
365
367};
368
369}
370
371#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:132
static void Finalize()
Used internally by amrex.
Definition AMReX_Arena.cpp:739
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:167
Arena() noexcept=default
virtual ~Arena()=default
virtual bool isPinned() const
Check whether it is pinned host memory.
Definition AMReX_Arena.cpp:112
virtual void ResetMaxUsageCounter()
Definition AMReX_Arena.H:330
virtual bool isHostAccessible() const
Definition AMReX_Arena.cpp:76
virtual bool isStreamOrderedArena() const
Is this GPU stream ordered memory allocator?
Definition AMReX_Arena.H:251
static const std::size_t align_size
The alignment of allocated memory.
Definition AMReX_Arena.H:321
static bool IsInitialized()
Definition AMReX_Arena.cpp:799
const ArenaInfo & arenaInfo() const
Return the ArenaInfo object for querying.
Definition AMReX_Arena.H:326
virtual bool isManaged() const
Check whether it is managed GPU memory.
Definition AMReX_Arena.cpp:88
void deregisterFromProfiling()
Remove this Arena from the list of Arenas that are profiled by TinyProfiler. This is equivalent to de...
Definition AMReX_Arena.cpp:154
virtual std::pair< void *, std::size_t > alloc_in_place(void *, std::size_t, std::size_t szmax)
Allocate memory in-place if possible.
Definition AMReX_Arena.H:161
static void out_of_memory_abort(std::string const &memory_type, std::size_t nbytes, std::string const &error_msg)
Definition AMReX_Arena.cpp:711
virtual std::size_t freeUnused_protected()
Definition AMReX_Arena.H:339
virtual void streamOrderedFree(void *pt, gpuStream_t stream)
Definition AMReX_Arena.cpp:130
void registerForProfiling(const std::string &memory_name)
Add this Arena to the list of Arenas that are profiled by TinyProfiler.
Definition AMReX_Arena.cpp:144
static void PrintUsageToFiles(std::string const &filename, std::string const &message)
Print memory usage information of all arenas to given file.
Definition AMReX_Arena.cpp:695
virtual bool isDevice() const
Check whether it is non-managed GPU device memory.
Definition AMReX_Arena.cpp:100
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:123
void deallocate_system(void *p, std::size_t nbytes)
Definition AMReX_Arena.cpp:350
virtual void * shrink_in_place(void *, std::size_t sz)
Shrink allocation size in-place.
Definition AMReX_Arena.H:178
struct amrex::Arena::ArenaProfiler m_profiler
static void Initialize(bool minimal)
Used internally by amrex.
Definition AMReX_Arena.cpp:394
static void PrintUsage(bool print_max_usage=false)
Print memory usage information of all arenas.
Definition AMReX_Arena.cpp:588
virtual std::size_t freeUnused()
Free unused memory back to the system. Return value is the amount memory freed.
Definition AMReX_Arena.H:192
ArenaInfo arena_info
Definition AMReX_Arena.H:337
static void PrintUsageToStream(std::ostream &os, std::string const &space)
Print memory usage information of all arenas to a given output stream.
Definition AMReX_Arena.cpp:651
virtual bool isDeviceAccessible() const
Definition AMReX_Arena.cpp:66
void * allocate_system(std::size_t nbytes)
Definition AMReX_Arena.cpp:173
amrex_long Long
Definition AMReX_INT.H:30
Arena * The_Managed_Arena()
Definition AMReX_Arena.cpp:835
Arena * The_Comms_Arena()
Definition AMReX_Arena.cpp:865
Arena * The_Device_Arena()
Definition AMReX_Arena.cpp:825
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:845
Arena * The_Async_Arena()
Definition AMReX_Arena.cpp:815
Arena * The_Cpu_Arena()
Definition AMReX_Arena.cpp:855
Arena * The_Arena()
Definition AMReX_Arena.cpp:805
Definition AMReX_Amr.cpp:49
Arena * The_Null_Arena()
Definition AMReX_Arena.cpp:875
cudaStream_t gpuStream_t
Definition AMReX_GpuControl.H:83
bool is_aligned(const void *p, std::size_t alignment) noexcept
Return whether the address p is aligned to alignment bytes.
Definition AMReX_Arena.H:39
std::size_t aligned_size(std::size_t align_requirement, std::size_t size) noexcept
Given a minimum required size in bytes, this returns the smallest size greater or equal to size that ...
Definition AMReX_Arena.H:33
Definition AMReX_Arena.H:79
ArenaInfo & SetReadOnly() noexcept
Definition AMReX_Arena.H:96
bool device_set_preferred
Definition AMReX_Arena.H:84
bool device_set_readonly
Definition AMReX_Arena.H:83
bool device_use_hostalloc
Definition AMReX_Arena.H:85
ArenaInfo & SetReleaseThreshold(Long rt) noexcept
Definition AMReX_Arena.H:87
ArenaInfo & SetDefragmentation(bool b) noexcept
Definition AMReX_Arena.H:119
Long release_threshold
Definition AMReX_Arena.H:80
ArenaInfo & SetPreferred() noexcept
Definition AMReX_Arena.H:101
ArenaInfo & SetCpuMemory() noexcept
Definition AMReX_Arena.H:111
bool device_use_managed_memory
Definition AMReX_Arena.H:82
bool use_cpu_memory
Definition AMReX_Arena.H:81
ArenaInfo & SetDeviceMemory() noexcept
Definition AMReX_Arena.H:91
bool defragmentation
Definition AMReX_Arena.H:86
ArenaInfo & SetHostAlloc() noexcept
Definition AMReX_Arena.H:106
Definition AMReX_Arena.H:345
std::map< std::string, MemStat > m_profiling_stats
Data structure used for profiling with TinyProfiler.
Definition AMReX_Arena.H:351
void profile_alloc(void *ptr, std::size_t nbytes)
Definition AMReX_Arena.cpp:896
void profile_free(void *ptr)
Definition AMReX_Arena.cpp:909
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:353
bool m_do_profiling
If this arena is profiled by TinyProfiler.
Definition AMReX_Arena.H:347
std::mutex m_arena_profiler_mutex
Mutex for the profiling.
Definition AMReX_Arena.H:349
ArenaProfiler() noexcept=default
Definition AMReX_Arena.H:15