3#include <AMReX_Config.H>
16#ifdef AMREX_TINY_PROFILING
29#include <unordered_map>
38inline std::size_t
aligned_size (std::size_t align_requirement, std::size_t size)
noexcept
40 return ((size + (align_requirement-1)) / align_requirement) * align_requirement;
45inline bool is_aligned (
const void* p, std::size_t alignment)
noexcept
47 auto* q =
const_cast<void*
>(p);
48 auto space = alignment;
49 return std::align(alignment, alignment, q, space) == p;
169 [[nodiscard]] virtual
void*
alloc (std::
size_t sz) = 0;
185 [[nodiscard]] virtual std::pair<
void*,std::
size_t>
189 auto* p =
alloc(szmax);
190 return std::make_pair(p, szmax);
205 [[nodiscard]]
virtual void*
213 virtual void free (
void* pt) = 0;
243 [[nodiscard]]
virtual bool isManaged ()
const;
252 [[nodiscard]]
virtual bool isDevice ()
const;
261 [[nodiscard]]
virtual bool isPinned ()
const;
293 static std::size_t
align (std::size_t sz);
316 static void PrintUsage (
bool print_max_usage=
false);
343 static void PrintUsageToFiles (std::string
const& filename, std::string
const& message);
377 std::string
const& error_msg);
380 struct ArenaProfiler {
382 bool m_do_profiling =
false;
384 std::mutex m_arena_profiler_mutex;
386 std::map<std::string, MemStat> m_profiling_stats;
388 std::unordered_map<void*, std::pair<MemStat*, std::size_t>> m_currently_allocated;
391 ArenaProfiler () noexcept = default;
392 ArenaProfiler (const ArenaProfiler& rhs) = delete;
393 ArenaProfiler (ArenaProfiler&& rhs) = delete;
394 ArenaProfiler& operator= (const ArenaProfiler& rhs) = delete;
395 ArenaProfiler& operator= (ArenaProfiler&& rhs) = delete;
397 void profile_alloc (
void* ptr, std::
size_t nbytes);
399 void profile_free (
void* ptr);
Assertion macros used across AMReX for runtime consistency checks.
#define BL_ASSERT(EX)
Definition AMReX_BLassert.H:39
Abstract base class for memory arenas.
Definition AMReX_Arena.H:153
virtual std::size_t largestFreeBlock() const
Return the largest free memory block already held by this Arena.
Definition AMReX_Arena.H:226
static void Finalize()
Used internally by amrex.
Definition AMReX_Arena.cpp:754
virtual void free(void *pt)=0
Free a previously allocated block pointed to by pt.
virtual void * alloc(std::size_t sz)=0
Allocate sz bytes from this arena.
virtual std::pair< void *, std::size_t > alloc_in_place(void *pt, std::size_t szmin, std::size_t szmax)
Allocate memory in-place if possible.
Definition AMReX_Arena.H:186
static std::size_t align(std::size_t sz)
Return the smallest multiple of Arena::align_size that is >= sz bytes.
Definition AMReX_Arena.cpp:167
virtual bool isPinned() const
Check whether it is pinned host memory.
Definition AMReX_Arena.cpp:112
virtual void ResetMaxUsageCounter()
Definition AMReX_Arena.H:364
virtual bool isHostAccessible() const
Definition AMReX_Arena.cpp:76
virtual bool isStreamOrderedArena() const
Is this GPU stream ordered memory allocator?
Definition AMReX_Arena.H:286
static const std::size_t align_size
Definition AMReX_Arena.H:355
static bool IsInitialized()
Definition AMReX_Arena.cpp:814
const ArenaInfo & arenaInfo() const
Return the ArenaInfo object for querying.
Definition AMReX_Arena.H:360
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
static void out_of_memory_abort(std::string const &memory_type, std::size_t nbytes, std::string const &error_msg)
Definition AMReX_Arena.cpp:726
virtual std::size_t freeUnused_protected()
Definition AMReX_Arena.H:373
virtual void * shrink_in_place(void *pt, std::size_t sz)
Shrink allocation size in-place.
Definition AMReX_Arena.H:206
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:710
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:360
static void Initialize(bool minimal)
Initialize the Arena subsystem (used internally by AMReX).
Definition AMReX_Arena.cpp:409
static void PrintUsage(bool print_max_usage=false)
Print memory usage information of all arenas.
Definition AMReX_Arena.cpp:603
virtual std::size_t freeUnused()
Release unused cached memory back to the system.
Definition AMReX_Arena.H:219
ArenaInfo arena_info
Definition AMReX_Arena.H:371
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:666
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
bool is_aligned(const void *p, std::size_t alignment) noexcept
Definition AMReX_Arena.H:45
Arena * The_Managed_Arena()
Definition AMReX_Arena.cpp:850
Arena * The_Comms_Arena()
Definition AMReX_Arena.cpp:880
Arena * The_Device_Arena()
Definition AMReX_Arena.cpp:840
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:860
Arena * The_Async_Arena()
Definition AMReX_Arena.cpp:830
std::size_t aligned_size(std::size_t align_requirement, std::size_t size) noexcept
Return the smallest multiple of align_requirement that is >= size.
Definition AMReX_Arena.H:38
Arena * The_Cpu_Arena()
Definition AMReX_Arena.cpp:870
Arena * The_Arena()
Definition AMReX_Arena.cpp:820
Definition AMReX_Amr.cpp:50
__host__ __device__ void ignore_unused(const Ts &...)
No-op helper that marks variables as intentionally unused.
Definition AMReX.H:259
Arena * The_Null_Arena()
Definition AMReX_Arena.cpp:890
cudaStream_t gpuStream_t
Definition AMReX_GpuControl.H:79
Configuration options for constructing an Arena.
Definition AMReX_Arena.H:91
ArenaInfo & SetReadOnly() noexcept
Advise the runtime that the managed memory will be read-only on the device.
Definition AMReX_Arena.H:111
bool device_set_preferred
Advise the runtime to prefer the device for managed memory.
Definition AMReX_Arena.H:96
bool device_set_readonly
Advise the runtime that the managed memory is read-only on the device.
Definition AMReX_Arena.H:95
bool device_use_hostalloc
Use host-pinned memory (cudaMallocHost/hipHostMalloc).
Definition AMReX_Arena.H:97
ArenaInfo & SetReleaseThreshold(Long rt) noexcept
Set the usage threshold that triggers release of cached unused blocks before growing.
Definition AMReX_Arena.H:100
ArenaInfo & SetDefragmentation(bool b) noexcept
Enable or disable defragmentation in the arena.
Definition AMReX_Arena.H:138
Long release_threshold
When usage would exceed this, cached unused blocks are released first.
Definition AMReX_Arena.H:92
ArenaInfo & SetPreferred() noexcept
Advise the runtime to prefer device residence for the managed memory.
Definition AMReX_Arena.H:117
ArenaInfo & SetCpuMemory() noexcept
Configure the arena to use CPU (host) memory.
Definition AMReX_Arena.H:129
bool device_use_managed_memory
Use CUDA/HIP managed (unified) memory for GPU allocations.
Definition AMReX_Arena.H:94
bool use_cpu_memory
Allocate CPU (host) memory instead of GPU memory.
Definition AMReX_Arena.H:93
ArenaInfo & SetDeviceMemory() noexcept
Configure the arena to use non-managed GPU device memory.
Definition AMReX_Arena.H:105
bool defragmentation
Definition AMReX_Arena.H:98
ArenaInfo & SetHostAlloc() noexcept
Configure the arena to use host-pinned memory.
Definition AMReX_Arena.H:123
Definition AMReX_Arena.H:20