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 {
106 return (m_arena) ? m_arena : The_Arena();
107 }
108 Arena* m_arena = nullptr;
109 };
110
112 template<typename T>
114 : public ArenaAllocatorBase<T,ArenaWrapper>
115 {
116 };
117
119 template<typename T>
121 : public ArenaAllocatorBase<T,DeviceArenaWrapper>
122 {
123 };
124
126 template<typename T>
128 : public ArenaAllocatorBase<T,PinnedArenaWrapper>
129 {
130 };
131
133 template<typename T>
135 : public ArenaAllocatorBase<T,ManagedArenaWrapper>
136 {
137 };
138
140 template<typename T>
142 : public ArenaAllocatorBase<T,AsyncArenaWrapper>
143 {
144 };
145
147 template<typename T>
149 : public ArenaAllocatorBase<T,PolymorphicArenaWrapper>
150 {
151 public :
152 constexpr PolymorphicArenaAllocator () = default;
153 explicit constexpr PolymorphicArenaAllocator (Arena* a_arena)
155 (PolymorphicArenaWrapper(a_arena))
156 {}
157 void setArena (Arena* a_ar) noexcept
158 {
159 *this = PolymorphicArenaAllocator<T>(a_ar);
160 }
161 };
162
163 template <typename T>
164 struct RunOnGpu : std::false_type {};
165
166 template <class T, class Enable = void>
167 struct IsArenaAllocator : std::false_type {};
168 //
169 template <class T>
171 <T,std::enable_if_t<std::is_base_of_v
172 <ArenaAllocatorBase<typename T::value_type,
173 typename T::arena_wrapper_type>,
174 T>>>
175 : std::true_type {};
176
177 template <typename T>
178 struct IsPolymorphicArenaAllocator : std::false_type {};
179
180 template <typename T>
182
183#ifdef AMREX_USE_GPU
184 template <typename T>
185 struct RunOnGpu<ArenaAllocator<T> > : std::true_type {};
186
187 template <typename T>
188 struct RunOnGpu<DeviceArenaAllocator<T> > : std::true_type {};
189
190 template <typename T>
191 struct RunOnGpu<ManagedArenaAllocator<T> > : std::true_type {};
192
193 template <typename T>
194 struct RunOnGpu<AsyncArenaAllocator<T> > : std::true_type {};
195#endif // AMREX_USE_GPU
196
197#ifdef AMREX_USE_GPU
198 template <class T>
200#else
201 template <class T>
202 using DefaultAllocator = std::allocator<T>;
203#endif // AMREX_USE_GPU
204
205 template <typename A1, typename A2,
206 std::enable_if_t<IsArenaAllocator<A1>::value &&
208 bool operator== (A1 const& a1, A2 const& a2)
209 {
210 return a1.arena() == a2.arena();
211 }
212
213 template <typename A1, typename A2,
214 std::enable_if_t<IsArenaAllocator<A1>::value &&
215 IsArenaAllocator<A2>::value, int> = 0>
216 bool operator!= (A1 const& a1, A2 const& a2)
217 {
218 return a1.arena() != a2.arena();
219 }
220
221} // namespace amrex
222
223#endif // AMREX_GPUALLOCATORS_H_
Definition AMReX_GpuAllocators.H:115
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:124
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
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:153
virtual void * shrink_in_place(void *, std::size_t sz)
Shrink allocation size in-place.
Definition AMReX_Arena.H:170
Definition AMReX_GpuAllocators.H:143
Definition AMReX_GpuAllocators.H:122
Definition AMReX_GpuAllocators.H:136
Definition AMReX_GpuAllocators.H:129
Definition AMReX_GpuAllocators.H:150
void setArena(Arena *a_ar) noexcept
Definition AMReX_GpuAllocators.H:157
constexpr PolymorphicArenaAllocator(Arena *a_arena)
Definition AMReX_GpuAllocators.H:153
constexpr PolymorphicArenaAllocator()=default
Arena * The_Managed_Arena()
Definition AMReX_Arena.cpp:813
Arena * The_Device_Arena()
Definition AMReX_Arena.cpp:803
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:823
Arena * The_Async_Arena()
Definition AMReX_Arena.cpp:793
Arena * The_Arena()
Definition AMReX_Arena.cpp:783
Definition AMReX_Amr.cpp:49
bool operator!=(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:216
bool operator==(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:208
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:167
Definition AMReX_GpuAllocators.H:178
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:108
Definition AMReX_GpuAllocators.H:164