Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_CArena.H
Go to the documentation of this file.
1#ifndef BL_CARENA_H
2#define BL_CARENA_H
3#include <AMReX_Config.H>
4
5#include <AMReX_Arena.H>
6
7#include <cstddef>
8#include <functional>
9#include <iosfwd>
10#include <map>
11#include <mutex>
12#include <set>
13#include <string>
14#include <unordered_set>
15#include <vector>
16
17namespace amrex {
18
25class CArena
26 :
27 public Arena
28{
29public:
35 CArena (std::size_t hunk_size = 0, ArenaInfo info = ArenaInfo());
36
37 CArena (const CArena& rhs) = delete;
38 CArena (CArena&& rhs) = delete;
39 CArena& operator= (const CArena& rhs) = delete;
40 CArena& operator= (CArena&& rhs) = delete;
41
43 ~CArena () override;
44
46 [[nodiscard]] void* alloc (std::size_t nbytes) final;
47
51 [[nodiscard]] std::pair<void*,std::size_t>
52 alloc_in_place (void* pt, std::size_t szmin, std::size_t szmax) final;
53
57 [[nodiscard]] void*
58 shrink_in_place (void* pt, std::size_t new_size) final;
59
64 void free (void* vp) final;
65
66 std::size_t freeUnused () final;
67
69 [[nodiscard]] std::size_t freeableMemory () const;
70
77 [[nodiscard]] bool hasFreeDeviceMemory (std::size_t sz) final;
78
80 std::size_t heap_space_used () const noexcept;
81
83 std::size_t heap_space_actually_used () const noexcept;
84
86 std::size_t sizeOf (void* p) const noexcept;
87
88 void PrintUsage (std::string const& name, bool print_max_usage) const;
89
90 void PrintUsage (std::ostream& os, std::string const& name, std::string const& space) const;
91
92 void ResetMaxUsageCounter () final {
94 }
95
97 constexpr static std::size_t DefaultHunkSize = 1024*1024*8;
98
99protected:
100
101 void* alloc_protected (std::size_t nbytes);
102
103 std::size_t freeUnused_protected () final;
104
106 class Node
107 {
108 public:
109 Node (void* a_block, void* a_owner, std::size_t a_size, MemStat* a_stat=nullptr) noexcept
110 :
111 m_block(a_block), m_owner(a_owner), m_size(a_size), m_stat(a_stat) {}
112
114 bool operator< (const Node& rhs) const noexcept
115 {
116 return std::less<>{}(m_block, rhs.m_block);
117 }
118
120 bool operator== (const Node& rhs) const noexcept
121 {
122 return m_block == rhs.m_block;
123 }
124
126 [[nodiscard]] void* block () const noexcept { return m_block; }
127
129 void block (void* blk) noexcept { m_block = blk; }
130
132 [[nodiscard]] std::size_t size () const noexcept { return m_size; }
133
135 void size (std::size_t sz) noexcept { m_size = sz; }
136
137 [[nodiscard]] void* owner () const noexcept { return m_owner; }
138
139 [[nodiscard]] bool coalescable (const Node& rhs) const noexcept {
140 return m_owner == rhs.m_owner;
141 }
142
144 [[nodiscard]] MemStat* mem_stat () const { return m_stat; }
145
147 void mem_stat (MemStat* a_stat) noexcept { m_stat = a_stat; }
148
149 struct hash {
150 std::size_t operator() (const Node& n) const noexcept {
151 return std::hash<void*>{}(n.m_block);
152 }
153 };
154
155 private:
157 void* m_block;
159 void* m_owner;
161 std::size_t m_size;
164 };
165
167 std::vector<std::pair<void*,std::size_t> > m_alloc;
168
173 using NL = std::set<Node>;
174
180
185// NL m_busylist;
186 std::unordered_set<Node, Node::hash> m_busylist;
188 std::size_t m_hunk;
190 std::size_t m_used{0};
192 std::size_t m_max_used{0};
194 std::size_t m_actually_used{0};
196 std::size_t m_max_actually_used{0};
197
198 std::mutex carena_mutex;
199
200 friend std::ostream& operator<< (std::ostream& os, const CArena& arena);
201};
202
203}
204
205#endif /*BL_CARENA_H*/
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:105
The nodes in our free list and block list.
Definition AMReX_CArena.H:107
MemStat * m_stat
Used for profiling if this Node represents a user allocated block of memory.
Definition AMReX_CArena.H:163
std::size_t size() const noexcept
The size of the memory block.
Definition AMReX_CArena.H:132
std::size_t m_size
The size of the block we represent.
Definition AMReX_CArena.H:161
void block(void *blk) noexcept
Set block address.
Definition AMReX_CArena.H:129
void size(std::size_t sz) noexcept
Set size.
Definition AMReX_CArena.H:135
void * owner() const noexcept
Definition AMReX_CArena.H:137
void * m_owner
The starting address of the original allocation.
Definition AMReX_CArena.H:159
MemStat * mem_stat() const
Get the MemStat object of the function where this block was allocated.
Definition AMReX_CArena.H:144
void mem_stat(MemStat *a_stat) noexcept
Set MemStat.
Definition AMReX_CArena.H:147
void * m_block
The block of memory we reference.
Definition AMReX_CArena.H:157
bool coalescable(const Node &rhs) const noexcept
Definition AMReX_CArena.H:139
void * block() const noexcept
The block address.
Definition AMReX_CArena.H:126
Node(void *a_block, void *a_owner, std::size_t a_size, MemStat *a_stat=nullptr) noexcept
Definition AMReX_CArena.H:109
A Concrete Class for Dynamic Memory Management using first fit. This is a coalescing memory manager....
Definition AMReX_CArena.H:28
NL m_freelist
The free list of allocated but not currently used blocks. Maintained in lo to hi memory sorted order.
Definition AMReX_CArena.H:179
std::size_t sizeOf(void *p) const noexcept
Return the amount of memory in this pointer. Return 0 for unknown pointer.
Definition AMReX_CArena.cpp:468
CArena(const CArena &rhs)=delete
static constexpr std::size_t DefaultHunkSize
The default memory hunk size to grab from the heap.
Definition AMReX_CArena.H:97
void * shrink_in_place(void *pt, std::size_t new_size) final
Definition AMReX_CArena.cpp:209
std::mutex carena_mutex
Definition AMReX_CArena.H:198
std::size_t freeUnused_protected() final
Definition AMReX_CArena.cpp:377
std::size_t m_max_actually_used
The max amount of memory given out via alloc().
Definition AMReX_CArena.H:196
std::size_t heap_space_actually_used() const noexcept
Return the total amount of memory given out via alloc.
Definition AMReX_CArena.cpp:462
std::size_t heap_space_used() const noexcept
The current amount of heap space used by the CArena object.
Definition AMReX_CArena.cpp:456
std::pair< void *, std::size_t > alloc_in_place(void *pt, std::size_t szmin, std::size_t szmax) final
Definition AMReX_CArena.cpp:136
CArena & operator=(const CArena &rhs)=delete
friend std::ostream & operator<<(std::ostream &os, const CArena &arena)
Definition AMReX_CArena.cpp:520
void ResetMaxUsageCounter() final
Definition AMReX_CArena.H:92
std::set< Node > NL
The type of our freelist and blocklist. We use a set sorted from lo to hi memory addresses.
Definition AMReX_CArena.H:173
std::size_t m_hunk
The minimal size of hunks to request from system.
Definition AMReX_CArena.H:188
std::size_t freeUnused() final
Free unused memory back to the system. Return value is the amount memory freed.
Definition AMReX_CArena.cpp:357
std::size_t m_used
The amount of heap space currently allocated.
Definition AMReX_CArena.H:190
std::unordered_set< Node, Node::hash > m_busylist
The list of busy blocks. A block is either on the freelist or on the blocklist, but not on both.
Definition AMReX_CArena.H:186
void * alloc(std::size_t nbytes) final
Allocate some memory.
Definition AMReX_CArena.cpp:29
CArena(CArena &&rhs)=delete
void free(void *vp) final
Free up allocated memory. Merge neighboring free memory chunks into largest possible chunk.
Definition AMReX_CArena.cpp:267
~CArena() override
The destructor.
Definition AMReX_CArena.cpp:21
bool hasFreeDeviceMemory(std::size_t sz) final
Does the device have enough free memory for allocating this much memory? For CPU builds,...
Definition AMReX_CArena.cpp:418
void * alloc_protected(std::size_t nbytes)
Definition AMReX_CArena.cpp:37
void PrintUsage(std::string const &name, bool print_max_usage) const
Definition AMReX_CArena.cpp:483
std::vector< std::pair< void *, std::size_t > > m_alloc
The list of blocks allocated.
Definition AMReX_CArena.H:167
std::size_t freeableMemory() const
Return the amount of memory that can be freed.
Definition AMReX_CArena.cpp:364
std::size_t m_max_used
The max amount of heap space currently allocated.
Definition AMReX_CArena.H:192
std::size_t m_actually_used
The amount of memory given out via alloc().
Definition AMReX_CArena.H:194
Definition AMReX_Amr.cpp:49
bool operator==(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:202
Definition AMReX_Arena.H:53
Definition AMReX_CArena.H:149
Definition AMReX_Arena.H:12