Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_GpuBuffer.H
Go to the documentation of this file.
1#ifndef AMREX_GPU_DEVICE_BUFFER_H_
2#define AMREX_GPU_DEVICE_BUFFER_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Arena.H>
6#include <AMReX_TypeTraits.H>
7#include <AMReX_GpuDevice.H>
9#include <cstring>
10#include <cstdlib>
11#include <initializer_list>
12#include <memory>
13
14namespace amrex::Gpu {
15
16template <typename T, std::enable_if_t<std::is_trivially_copyable_v<T>,int> = 0>
17class Buffer
18{
19public:
20
21 Buffer (std::initializer_list<T> init) {
22 resize(init.size());
23
24 if (init.size() > 0) {
25 std::memcpy(h_vect.data(), init.begin(), init.size()*sizeof(T));
27 }
28 }
29
30 Buffer (T const* h_p, const std::size_t n) {
31 resize(n);
32
33 if (n > 0 && h_p != nullptr) {
34 std::memcpy(h_vect.data(), h_p, n*sizeof(T));
36 }
37 }
38
39 Buffer (const std::size_t n) {
40 resize(n);
41 }
42
43 Buffer () = default;
44
45 [[nodiscard]] T const* data () const noexcept {
46 return (useDVect() && !d_vect.empty()) ? d_vect.data() : h_vect.data();
47 }
48 [[nodiscard]] T* data () noexcept {
49 return (useDVect() && !d_vect.empty()) ? d_vect.data() : h_vect.data();
50 }
51
52 [[nodiscard]] T const* hostData () const noexcept { return h_vect.data(); }
53 [[nodiscard]] T* hostData () noexcept { return h_vect.data(); }
54
74 [[nodiscard]] T& operator[] (const std::size_t i) noexcept {
75 return h_vect[i];
76 }
77
78 [[nodiscard]] const T& operator[] (const std::size_t i) const noexcept {
79 return h_vect[i];
80 }
81
82 [[nodiscard]] std::size_t size () const noexcept { return h_vect.size(); }
83
84 [[nodiscard]] bool empty () const noexcept { return h_vect.size() == 0; }
85
86 void resize (const std::size_t n) noexcept {
87 h_vect.resize(n);
88 if (useDVect()) {
89 d_vect.resize(n);
90 }
91 }
92
93 void clear () noexcept {
94 h_vect.clear();
95 d_vect.clear();
96 }
97
98 void shrink_to_fit () noexcept {
99 h_vect.shrink_to_fit();
100 d_vect.shrink_to_fit();
101 }
102
103 void reserve (const std::size_t n) noexcept {
104 h_vect.reserve(n);
105 if (useDVect()) {
106 d_vect.reserve(n);
107 }
108 }
109
129 void push_back (const T& value) noexcept {
130 h_vect.push_back(value);
131 }
132
133 T* copyToDeviceAsync () noexcept {
134#ifdef AMREX_USE_GPU
135 if (useDVect() && !h_vect.empty())
136 {
137 d_vect.resize(h_vect.size());
138 Gpu::htod_memcpy_async(d_vect.data(), h_vect.data(), h_vect.size()*sizeof(T));
139 return d_vect.data();
140 }
141#endif
142 return h_vect.data();
143 }
144
145 T* copyToHost () noexcept {
146#ifdef AMREX_USE_GPU
147 if (useDVect() && !d_vect.empty())
148 {
149 h_vect.resize(d_vect.size());
150 Gpu::dtoh_memcpy_async(h_vect.data(), d_vect.data(), d_vect.size()*sizeof(T));
152 }
153#endif
154 return h_vect.data();
155 }
156
157private:
158
159 [[nodiscard]] bool useDVect () const noexcept {
160 return Gpu::inLaunchRegion() /* && !use_unified_gpu_memory */;
161 }
162
165};
166
167}
168
169#endif
Definition AMReX_GpuBuffer.H:18
T const * data() const noexcept
Definition AMReX_GpuBuffer.H:45
void reserve(const std::size_t n) noexcept
Definition AMReX_GpuBuffer.H:103
void push_back(const T &value) noexcept
Adds an element to the back of the host (CPU) vector. Does not update the device (GPU) vector,...
Definition AMReX_GpuBuffer.H:129
Buffer(std::initializer_list< T > init)
Definition AMReX_GpuBuffer.H:21
DeviceVector< T > d_vect
Definition AMReX_GpuBuffer.H:163
T const * hostData() const noexcept
Definition AMReX_GpuBuffer.H:52
T * data() noexcept
Definition AMReX_GpuBuffer.H:48
Buffer(T const *h_p, const std::size_t n)
Definition AMReX_GpuBuffer.H:30
T & operator[](const std::size_t i) noexcept
Changes the value of an element of the host (CPU) vector. Does not update the device (GPU) vector,...
Definition AMReX_GpuBuffer.H:74
void shrink_to_fit() noexcept
Definition AMReX_GpuBuffer.H:98
PinnedVector< T > h_vect
Definition AMReX_GpuBuffer.H:164
T * copyToHost() noexcept
Definition AMReX_GpuBuffer.H:145
bool empty() const noexcept
Definition AMReX_GpuBuffer.H:84
bool useDVect() const noexcept
Definition AMReX_GpuBuffer.H:159
void resize(const std::size_t n) noexcept
Definition AMReX_GpuBuffer.H:86
std::size_t size() const noexcept
Definition AMReX_GpuBuffer.H:82
T * copyToDeviceAsync() noexcept
Definition AMReX_GpuBuffer.H:133
void clear() noexcept
Definition AMReX_GpuBuffer.H:93
Buffer(const std::size_t n)
Definition AMReX_GpuBuffer.H:39
T * hostData() noexcept
Definition AMReX_GpuBuffer.H:53
Definition AMReX_PODVector.H:297
Definition AMReX_BaseFwd.H:52
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:260
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:303
bool inLaunchRegion() noexcept
Definition AMReX_GpuControl.H:92
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:289