MUDA
Loading...
Searching...
No Matches
device_buffer.inl
1#include <muda/container/vector.h>
2#include <muda/buffer/buffer_launch.h>
3
4namespace muda
5{
6template <typename T>
7DeviceBuffer<T>::DeviceBuffer(size_t n)
8{
9 BufferLaunch()
10 .alloc(*this, n) //
11 .wait();
12}
13
14template <typename T>
15DeviceBuffer<T>::DeviceBuffer()
16 : m_data(nullptr)
17 , m_size(0)
18 , m_capacity(0)
19{
20}
21
22template <typename T>
23DeviceBuffer<T>::DeviceBuffer(const DeviceBuffer<T>& other)
24{
25 BufferLaunch()
26 .alloc(*this, other.size()) //
27 .copy(view(), other.view()) //
28 .wait();
29}
30
31template <typename T>
32DeviceBuffer<T>::DeviceBuffer(DeviceBuffer<T>&& other) MUDA_NOEXCEPT
33 : m_data(other.m_data),
34 m_size(other.m_size),
35 m_capacity(other.m_capacity)
36{
37 other.m_data = nullptr;
38 other.m_size = 0;
39 other.m_capacity = 0;
40}
41
42template <typename T>
43DeviceBuffer<T>& DeviceBuffer<T>::operator=(const DeviceBuffer<T>& other)
44{
45 if(this == &other)
46 return *this;
47
48 BufferLaunch()
49 .resize(*this, other.size()) //
50 .copy(view(), other.view()) //
51 .wait();
52
53 return *this;
54}
55
56template <typename T>
57DeviceBuffer<T>& DeviceBuffer<T>::operator=(DeviceBuffer<T>&& other)
58{
59 if(this == &other)
60 return *this;
61
62 if(m_data)
63 {
64 BufferLaunch()
65 .free(*this) //
66 .wait();
67 }
68
69 m_data = other.m_data;
70 m_size = other.m_size;
71 m_capacity = other.m_capacity;
72
73 other.m_data = nullptr;
74 other.m_size = 0;
75 other.m_capacity = 0;
76
77 return *this;
78}
79
80template <typename T>
81DeviceBuffer<T>::DeviceBuffer(CBufferView<T> other)
82{
83 BufferLaunch()
84 .alloc(*this, other.size()) //
85 .copy(view(), other) //
86 .wait();
87}
88
89template <typename T>
90DeviceBuffer<T>::DeviceBuffer(const std::vector<T>& host)
91{
92 BufferLaunch()
93 .alloc(*this, host.size()) //
94 .copy(view(), host.data()) //
95 .wait();
96}
97
98template <typename T>
99DeviceBuffer<T>& DeviceBuffer<T>::operator=(CBufferView<T> other)
100{
101 BufferLaunch()
102 .resize(*this, other.size()) //
103 .copy(view(), other) //
104 .wait();
105 return *this;
106}
107
108template <typename T>
109DeviceBuffer<T>& DeviceBuffer<T>::operator=(const std::vector<T>& other)
110{
111 BufferLaunch()
112 .resize(*this, other.size()) //
113 .copy(view(), other.data()) //
114 .wait();
115 return *this;
116}
117
118template <typename T>
119void DeviceBuffer<T>::copy_to(std::vector<T>& host) const
120{
121 host.resize(size());
122 view().copy_to(host.data());
123}
124
125template <typename T>
126void DeviceBuffer<T>::copy_from(const std::vector<T>& host)
127{
128 resize(host.size());
129 view().copy_from(host.data());
130}
131
132template <typename T>
133void DeviceBuffer<T>::resize(size_t new_size)
134{
135 BufferLaunch()
136 .resize(*this, new_size) //
137 .wait();
138}
139
140template <typename T>
141void DeviceBuffer<T>::resize(size_t new_size, const value_type& value)
142{
143 BufferLaunch()
144 .resize(*this, new_size, value) //
145 .wait();
146}
147
148template <typename T>
149void DeviceBuffer<T>::reserve(size_t new_capacity)
150{
151 BufferLaunch()
152 .reserve(*this, new_capacity) //
153 .wait();
154}
155
156template <typename T>
157void DeviceBuffer<T>::clear()
158{
159 BufferLaunch()
160 .clear(*this) //
161 .wait();
162}
163
164template <typename T>
165void DeviceBuffer<T>::shrink_to_fit()
166{
167 BufferLaunch()
168 .shrink_to_fit(*this) //
169 .wait();
170}
171
172template <typename T>
173void DeviceBuffer<T>::fill(const T& v)
174{
175 view().fill(v);
176};
177
178template <typename T>
179Dense1D<T> DeviceBuffer<T>::viewer() MUDA_NOEXCEPT
180{
181 return view().viewer();
182}
183
184template <typename T>
185CDense1D<T> DeviceBuffer<T>::cviewer() const MUDA_NOEXCEPT
186{
187 return view().cviewer();
188}
189
190template <typename T>
191BufferView<T> DeviceBuffer<T>::view(size_t offset, size_t size) MUDA_NOEXCEPT
192{
193 return view().subview(offset, size);
194}
195
196template <typename T>
197BufferView<T> DeviceBuffer<T>::view() MUDA_NOEXCEPT
198{
199 return BufferView<T>{m_data, 0, m_size};
200}
201
202template <typename T>
203CBufferView<T> DeviceBuffer<T>::view(size_t offset, size_t size) const MUDA_NOEXCEPT
204{
205 return view().subview(offset, size);
206}
207
208template <typename T>
209CBufferView<T> DeviceBuffer<T>::view() const MUDA_NOEXCEPT
210{
211 return CBufferView<T>{m_data, 0, m_size};
212}
213
214template <typename T>
215DeviceBuffer<T>::~DeviceBuffer()
216{
217 if(m_data)
218 {
219 BufferLaunch()
220 .free(*this) //
221 .wait();
222 }
223}
224} // namespace muda