Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_GpuAllocators.H
Go to the documentation of this file.
1#ifndef AMREX_GPUALLOCATORS_H_
2#define AMREX_GPUALLOCATORS_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Print.H>
6#include <AMReX_Arena.H>
7#include <AMReX_GpuDevice.H>
8
9#ifdef AMREX_USE_CUDA
10#include <cuda.h>
11#include <driver_types.h>
12#include <cuda_runtime.h>
13#endif // AMREX_USE_CUDA
14
15#include <limits>
16#include <map>
17#include <memory>
18#include <type_traits>
19
20namespace amrex {
21
22 template <typename T>
23 struct FatPtr
24 {
25 T* m_ptr = nullptr;
26 std::size_t m_size = 0;
27 [[nodiscard]] constexpr T* ptr () const noexcept { return m_ptr; }
28 [[nodiscard]] constexpr std::size_t size () const noexcept { return m_size; }
29 };
30
31 template <class T, class AR>
33 {
34 using value_type = T;
36
37 constexpr ArenaAllocatorBase () = default;
38 explicit constexpr ArenaAllocatorBase (AR a_ar) : m_ar(a_ar) {}
39
40 [[nodiscard]] T* allocate (std::size_t n)
41 {
42 return (T*) arena()->alloc(n * sizeof(T));
43 }
44
45 [[nodiscard]] FatPtr<T>
46 allocate_in_place (T* p, std::size_t nmin, std::size_t nmax)
47 {
48 auto pn = arena()->alloc_in_place(p, nmin*sizeof(T), nmax*sizeof(T));
49 return FatPtr<T>{(T*)pn.first, pn.second/sizeof(T)};
50 }
51
52 [[nodiscard]] T*
53 shrink_in_place (T* p, std::size_t n)
54 {
55 return (T*) arena()->shrink_in_place(p,n*sizeof(T));
56 }
57
58 void deallocate (T* ptr, std::size_t)
59 {
60 if (ptr != nullptr) { arena()->free(ptr); }
61 }
62
63 [[nodiscard]] Arena* arena () const noexcept {
64 return m_ar.arena();
65 }
66
67 private:
68 AR m_ar{};
69 };
70
71 struct ArenaWrapper {
72 [[nodiscard]] static Arena* arena () noexcept {
73 return The_Arena();
74 }
75 };
76
78 [[nodiscard]] static Arena* arena () noexcept {
79 return The_Device_Arena();
80 }
81 };
82
84 [[nodiscard]] static Arena* arena () noexcept {
85 return The_Pinned_Arena();
86 }
87 };
88
90 [[nodiscard]] static Arena* arena () noexcept {
91 return The_Managed_Arena();
92 }
93 };
94
96 [[nodiscard]] static Arena* arena () noexcept {
97 return The_Async_Arena();
98 }
99 };
100
102 constexpr PolymorphicArenaWrapper () = default;
103 explicit constexpr PolymorphicArenaWrapper (Arena* a_arena)
104 : m_arena(a_arena) {}
105 [[nodiscard]] Arena* arena () const noexcept {
108 if (Arena::IsInitialized()) {
109 return (m_arena) ? m_arena : The_Arena();
110 } else {
111 return The_Null_Arena();
112 }
113 }
114 Arena* m_arena = nullptr;
115 };
116
118 template<typename T>
120 : public ArenaAllocatorBase<T,ArenaWrapper>
121 {
122 };
123
125 template<typename T>
127 : public ArenaAllocatorBase<T,DeviceArenaWrapper>
128 {
129 };
130
132 template<typename T>
134 : public ArenaAllocatorBase<T,PinnedArenaWrapper>
135 {
136 };
137
139 template<typename T>
141 : public ArenaAllocatorBase<T,ManagedArenaWrapper>
142 {
143 };
144
146 template<typename T>
148 : public ArenaAllocatorBase<T,AsyncArenaWrapper>
149 {
150 };
151
153 template<typename T>
155 : public ArenaAllocatorBase<T,PolymorphicArenaWrapper>
156 {
157 public :
158 constexpr PolymorphicArenaAllocator () = default;
159 explicit constexpr PolymorphicArenaAllocator (Arena* a_arena)
161 (PolymorphicArenaWrapper(a_arena))
162 {}
163 void setArena (Arena* a_ar) noexcept
164 {
165 *this = PolymorphicArenaAllocator<T>(a_ar);
166 }
167 };
168
169 template <typename T>
170 struct RunOnGpu : std::false_type {};
171
172 template <class T, class Enable = void>
173 struct IsArenaAllocator : std::false_type {};
174 //
175 template <class T>
177 <T,std::enable_if_t<std::is_base_of_v
178 <ArenaAllocatorBase<typename T::value_type,
179 typename T::arena_wrapper_type>,
180 T>>>
181 : std::true_type {};
182
183 template <typename T>
184 struct IsPolymorphicArenaAllocator : std::false_type {};
185
186 template <typename T>
188
189#ifdef AMREX_USE_GPU
190 template <typename T>
191 struct RunOnGpu<ArenaAllocator<T> > : std::true_type {};
192
193 template <typename T>
194 struct RunOnGpu<DeviceArenaAllocator<T> > : std::true_type {};
195
196 template <typename T>
197 struct RunOnGpu<ManagedArenaAllocator<T> > : std::true_type {};
198
199 template <typename T>
200 struct RunOnGpu<AsyncArenaAllocator<T> > : std::true_type {};
201#endif // AMREX_USE_GPU
202
203#ifdef AMREX_USE_GPU
204 template <class T>
206#else
207 template <class T>
208 using DefaultAllocator = std::allocator<T>;
209#endif // AMREX_USE_GPU
210
211 template <typename A1, typename A2,
212 std::enable_if_t<IsArenaAllocator<A1>::value &&
214 bool operator== (A1 const& a1, A2 const& a2)
215 {
216 return a1.arena() == a2.arena();
217 }
218
219 template <typename A1, typename A2,
220 std::enable_if_t<IsArenaAllocator<A1>::value &&
221 IsArenaAllocator<A2>::value, int> = 0>
222 bool operator!= (A1 const& a1, A2 const& a2)
223 {
224 return a1.arena() != a2.arena();
225 }
226
227} // namespace amrex
228
229#endif // AMREX_GPUALLOCATORS_H_
Definition AMReX_GpuAllocators.H:121
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:132
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 bool IsInitialized()
Definition AMReX_Arena.cpp:799
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
virtual void * shrink_in_place(void *, std::size_t sz)
Shrink allocation size in-place.
Definition AMReX_Arena.H:178
Definition AMReX_GpuAllocators.H:149
Definition AMReX_GpuAllocators.H:128
Definition AMReX_GpuAllocators.H:142
Definition AMReX_GpuAllocators.H:135
Definition AMReX_GpuAllocators.H:156
void setArena(Arena *a_ar) noexcept
Definition AMReX_GpuAllocators.H:163
constexpr PolymorphicArenaAllocator(Arena *a_arena)
Definition AMReX_GpuAllocators.H:159
constexpr PolymorphicArenaAllocator()=default
Arena * The_Managed_Arena()
Definition AMReX_Arena.cpp:835
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_Arena()
Definition AMReX_Arena.cpp:805
Definition AMReX_Amr.cpp:49
Arena * The_Null_Arena()
Definition AMReX_Arena.cpp:875
bool operator!=(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:222
bool operator==(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:214
Definition AMReX_GpuAllocators.H:33
T value_type
Definition AMReX_GpuAllocators.H:34
Arena * arena() const noexcept
Definition AMReX_GpuAllocators.H:63
constexpr ArenaAllocatorBase()=default
AR arena_wrapper_type
Definition AMReX_GpuAllocators.H:35
T * allocate(std::size_t n)
Definition AMReX_GpuAllocators.H:40
T * shrink_in_place(T *p, std::size_t n)
Definition AMReX_GpuAllocators.H:53
constexpr ArenaAllocatorBase(AR a_ar)
Definition AMReX_GpuAllocators.H:38
FatPtr< T > allocate_in_place(T *p, std::size_t nmin, std::size_t nmax)
Definition AMReX_GpuAllocators.H:46
void deallocate(T *ptr, std::size_t)
Definition AMReX_GpuAllocators.H:58
Definition AMReX_GpuAllocators.H:71
static Arena * arena() noexcept
Definition AMReX_GpuAllocators.H:72
Definition AMReX_GpuAllocators.H:95
static Arena * arena() noexcept
Definition AMReX_GpuAllocators.H:96
Definition AMReX_GpuAllocators.H:77
static Arena * arena() noexcept
Definition AMReX_GpuAllocators.H:78
Definition AMReX_GpuAllocators.H:24
constexpr T * ptr() const noexcept
Definition AMReX_GpuAllocators.H:27
std::size_t m_size
Definition AMReX_GpuAllocators.H:26
T * m_ptr
Definition AMReX_GpuAllocators.H:25
constexpr std::size_t size() const noexcept
Definition AMReX_GpuAllocators.H:28
Definition AMReX_GpuAllocators.H:173
Definition AMReX_GpuAllocators.H:184
Definition AMReX_GpuAllocators.H:89
static Arena * arena() noexcept
Definition AMReX_GpuAllocators.H:90
Definition AMReX_GpuAllocators.H:83
static Arena * arena() noexcept
Definition AMReX_GpuAllocators.H:84
Definition AMReX_GpuAllocators.H:101
constexpr PolymorphicArenaWrapper()=default
constexpr PolymorphicArenaWrapper(Arena *a_arena)
Definition AMReX_GpuAllocators.H:103
Arena * arena() const noexcept
Definition AMReX_GpuAllocators.H:105
Arena * m_arena
Definition AMReX_GpuAllocators.H:114
Definition AMReX_GpuAllocators.H:170