Loading...
Searching...
No Matches
CUDAArrayBase-Impl.hpp
Go to the documentation of this file.
1// This code is based on Jet framework.
2// Copyright (c) 2018 Doyub Kim
3// CubbyFlow is voxel-based fluid simulation engine for computer games.
4// Copyright (c) 2020 CubbyFlow Team
5// Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6// AI Part: Dongheon Cho, Minseo Kim
7// We are making my contributions/submissions to this project solely in our
8// personal capacity and are not conveying any rights to any intellectual
9// property of any third parties.
10
11#ifndef CUBBYFLOW_CUDA_ARRAY_BASE_IMPL_HPP
12#define CUBBYFLOW_CUDA_ARRAY_BASE_IMPL_HPP
13
14#ifdef CUBBYFLOW_USE_CUDA
15
16namespace CubbyFlow
17{
18template <typename T, size_t N, typename Derived>
19size_t CUDAArrayBase<T, N, Derived>::Index(size_t i) const
20{
21 return i;
22}
23
24template <typename T, size_t N, typename Derived>
25template <typename... Args>
26size_t CUDAArrayBase<T, N, Derived>::Index(size_t i, Args... args) const
27{
28 static_assert(sizeof...(args) == N - 1, "Invalid number of indices.");
29 return i + m_size[0] * IndexInternal(1, args...);
30}
31
32template <typename T, size_t N, typename Derived>
33template <size_t... I>
34size_t CUDAArrayBase<T, N, Derived>::Index(
35 const CUDAStdArray<size_t, N>& idx) const
36{
37 return IndexInternal(idx, std::make_index_sequence<N>{});
38}
39
40template <typename T, size_t N, typename Derived>
42{
43 return m_ptr;
44}
45
46template <typename T, size_t N, typename Derived>
48{
49 return m_ptr;
50}
51
52template <typename T, size_t N, typename Derived>
53const CUDAStdArray<size_t, N>& CUDAArrayBase<T, N, Derived>::Size() const
54{
55 return m_size;
56}
57
58template <typename T, size_t N, typename Derived>
59template <size_t M>
60std::enable_if_t<(M > 0), size_t> CUDAArrayBase<T, N, Derived>::Width() const
61{
62 return m_size[0];
63}
64
65template <typename T, size_t N, typename Derived>
66template <size_t M>
67std::enable_if_t<(M > 1), size_t> CUDAArrayBase<T, N, Derived>::Height() const
68{
69 return m_size[1];
70}
71
72template <typename T, size_t N, typename Derived>
73template <size_t M>
74std::enable_if_t<(M > 2), size_t> CUDAArrayBase<T, N, Derived>::Depth() const
75{
76 return m_size[2];
77}
78
79template <typename T, size_t N, typename Derived>
81{
82 size_t l = m_size[0];
83
84 for (size_t i = 1; i < N; ++i)
85 {
86 l *= m_size[i];
87 }
88
89 return l;
90}
91
92#ifdef __CUDA_ARCH__
93template <typename T, size_t N, typename Derived>
95CUDAArrayBase<T, N, Derived>::At(size_t i)
96{
97 return m_ptr[i];
98}
99
100template <typename T, size_t N, typename Derived>
102CUDAArrayBase<T, N, Derived>::At(size_t i) const
103{
104 return m_ptr[i];
105}
106
107template <typename T, size_t N, typename Derived>
108template <typename... Args>
110CUDAArrayBase<T, N, Derived>::At(size_t i, Args... args)
111{
112 return At(Index(i, args...));
113}
114
115template <typename T, size_t N, typename Derived>
116template <typename... Args>
118CUDAArrayBase<T, N, Derived>::At(size_t i, Args... args) const
119{
120 return At(Index(i, args...));
121}
122
123template <typename T, size_t N, typename Derived>
125CUDAArrayBase<T, N, Derived>::At(const CUDAStdArray<size_t, N>& idx)
126{
127 return At(Index(idx));
128}
129
130template <typename T, size_t N, typename Derived>
132CUDAArrayBase<T, N, Derived>::At(const CUDAStdArray<size_t, N>& idx) const
133{
134 return At(Index(idx));
135}
136
137template <typename T, size_t N, typename Derived>
140{
141 return At(i);
142}
143
144template <typename T, size_t N, typename Derived>
147{
148 return At(i);
149}
150
151template <typename T, size_t N, typename Derived>
152template <typename... Args>
155{
156 return At(i, args...);
157}
158
159template <typename T, size_t N, typename Derived>
160template <typename... Args>
163{
164 return At(i, args...);
165}
166
167template <typename T, size_t N, typename Derived>
170{
171 return At(idx);
172}
173
174template <typename T, size_t N, typename Derived>
177 const CUDAStdArray<size_t, N>& idx) const
178{
179 return At(idx);
180}
181#else
182template <typename T, size_t N, typename Derived>
183typename CUDAArrayBase<T, N, Derived>::HostReference
184CUDAArrayBase<T, N, Derived>::At(size_t i)
185{
186 return HostReference(m_ptr + i);
187}
188
189template <typename T, size_t N, typename Derived>
190T CUDAArrayBase<T, N, Derived>::At(size_t i) const
191{
192 return (T)HostReference(m_ptr + i);
193}
194
195template <typename T, size_t N, typename Derived>
196template <typename... Args>
197typename CUDAArrayBase<T, N, Derived>::HostReference
198CUDAArrayBase<T, N, Derived>::At(size_t i, Args... args)
199{
200 return At(Index(i, args...));
201}
202
203template <typename T, size_t N, typename Derived>
204template <typename... Args>
205T CUDAArrayBase<T, N, Derived>::At(size_t i, Args... args) const
206{
207 return At(Index(i, args...));
208}
209
210template <typename T, size_t N, typename Derived>
211typename CUDAArrayBase<T, N, Derived>::HostReference
212CUDAArrayBase<T, N, Derived>::At(const CUDAStdArray<size_t, N>& idx)
213{
214 return At(Index(idx));
215}
216
217template <typename T, size_t N, typename Derived>
218T CUDAArrayBase<T, N, Derived>::At(const CUDAStdArray<size_t, N>& idx) const
219{
220 return At(Index(idx));
221}
222
223template <typename T, size_t N, typename Derived>
224typename CUDAArrayBase<T, N, Derived>::HostReference
226{
227 return At(i);
228}
229
230template <typename T, size_t N, typename Derived>
232{
233 return At(i);
234}
235
236template <typename T, size_t N, typename Derived>
237template <typename... Args>
238typename CUDAArrayBase<T, N, Derived>::HostReference
240{
241 return At(i, args...);
242}
243
244template <typename T, size_t N, typename Derived>
245template <typename... Args>
247{
248 return At(i, args...);
249}
250
251template <typename T, size_t N, typename Derived>
252typename CUDAArrayBase<T, N, Derived>::HostReference
254{
255 return At(idx);
256}
257
258template <typename T, size_t N, typename Derived>
260 const CUDAStdArray<size_t, N>& idx) const
261{
262 return At(idx);
263}
264#endif
265
266template <typename T, size_t N, typename Derived>
267CUDAArrayBase<T, N, Derived>::CUDAArrayBase() : m_size{}
268{
269 // Do nothing
270}
271
272template <typename T, size_t N, typename Derived>
273CUDAArrayBase<T, N, Derived>::CUDAArrayBase(const CUDAArrayBase& other)
274{
275 SetPtrAndSize(other.m_ptr, other.m_size);
276}
277
278template <typename T, size_t N, typename Derived>
279CUDAArrayBase<T, N, Derived>::CUDAArrayBase(CUDAArrayBase&& other) noexcept
280{
281 *this = std::move(other);
282}
283
284template <typename T, size_t N, typename Derived>
285CUDAArrayBase<T, N, Derived>& CUDAArrayBase<T, N, Derived>::operator=(
286 const CUDAArrayBase& other)
287{
288 SetPtrAndSize(other.m_ptr, other.m_size);
289 return *this;
290}
291
292template <typename T, size_t N, typename Derived>
293CUDAArrayBase<T, N, Derived>& CUDAArrayBase<T, N, Derived>::operator=(
294 CUDAArrayBase&& other) noexcept
295{
296 SetPtrAndSize(other.m_ptr, other.m_size);
297 other.SetPtrAndSize(nullptr, CUDAStdArray<size_t, N>{});
298 return *this;
299}
300
301template <typename T, size_t N, typename Derived>
302template <typename... Args>
303void CUDAArrayBase<T, N, Derived>::SetPtrAndSize(Pointer ptr, size_t ni,
304 Args... args)
305{
306 SetPtrAndSize(ptr, CUDAStdArray<size_t, N>{ ni, args... });
307}
308
309template <typename T, size_t N, typename Derived>
310void CUDAArrayBase<T, N, Derived>::SetPtrAndSize(Pointer ptr,
311 CUDAStdArray<size_t, N> size)
312{
313 m_ptr = ptr;
314 m_size = size;
315}
316
317template <typename T, size_t N, typename Derived>
318void CUDAArrayBase<T, N, Derived>::SwapPtrAndSize(CUDAArrayBase& other)
319{
320 CUDASwap(m_ptr, other.m_ptr);
321 CUDASwap(m_size, other.m_size);
322}
323
324template <typename T, size_t N, typename Derived>
325void CUDAArrayBase<T, N, Derived>::ClearPtrAndSize()
326{
327 SetPtrAndSize(nullptr, CUDAStdArray<size_t, N>{});
328}
329
330template <typename T, size_t N, typename Derived>
331template <typename... Args>
332size_t CUDAArrayBase<T, N, Derived>::IndexInternal(size_t d, size_t i,
333 Args... args) const
334{
335 return i + m_size[d] * IndexInternal(d + 1, args...);
336}
337
338template <typename T, size_t N, typename Derived>
339size_t CUDAArrayBase<T, N, Derived>::IndexInternal(size_t, size_t i) const
340{
341 return i;
342}
343
344template <typename T, size_t N, typename Derived>
345template <size_t... I>
346size_t CUDAArrayBase<T, N, Derived>::IndexInternal(
347 const CUDAStdArray<size_t, N>& idx, std::index_sequence<I...>) const
348{
349 return Index(idx[I]...);
350}
351} // namespace CubbyFlow
352
353#endif
354
355#endif
Reference operator()(size_t i, size_t j)
Definition MatrixDenseBase-Impl.hpp:107
ValueType Length() const
Definition MatrixExpression-Impl.hpp:278
T & Reference
Definition Matrix.hpp:40
Pointer data()
Definition Matrix-Impl.hpp:298
Reference operator[](size_t i)
Definition Matrix-Impl.hpp:311
const T & ConstReference
Definition Matrix.hpp:41
Definition pybind11Utils.hpp:21
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738