muda
buffer_view.h
Go to the documentation of this file.
1 /*****************************************************************/
10 #pragma once
11 #include <cuda.h>
12 #include <cuda_runtime.h>
13 #include <cuda_runtime_api.h>
14 #include <cinttypes>
15 #include <muda/type_traits/type_modifier.h>
17 #include <muda/buffer/buffer_fwd.h>
18 #include <muda/view/view_base.h>
19 
20 namespace muda
21 {
22 template <bool IsConst, typename T>
23 class BufferViewBase : public ViewBase<IsConst>
24 {
25  using Base = ViewBase<IsConst>;
26  public:
27  static_assert(!std::is_const_v<T>, "Ty must be non-const");
31 
32  using CViewer = CDense1D<T>;
33  using Viewer = Dense1D<T>;
34  using ThisViewer = std::conditional_t<IsConst, CViewer, Viewer>;
35 
36  template <typename U>
37  using auto_const_t = typename Base::template auto_const_t<U>;
38 
39  protected:
40  auto_const_t<T>* m_data = nullptr;
41  size_t m_offset = ~0;
42  size_t m_size = ~0;
43 
44  public:
45  MUDA_GENERIC BufferViewBase() MUDA_NOEXCEPT = default;
46  MUDA_GENERIC BufferViewBase(auto_const_t<T>* data, size_t offset, size_t size) MUDA_NOEXCEPT
47  : m_data(data),
48  m_offset(offset),
49  m_size(size)
50  {
51  }
52  MUDA_GENERIC BufferViewBase(auto_const_t<T>* data, size_t size) MUDA_NOEXCEPT
53  : BufferViewBase(data, 0, size)
54  {
55  }
56 
57  MUDA_GENERIC ConstView as_const() const MUDA_NOEXCEPT
58  {
59  return ConstView{m_data, m_offset, m_size};
60  }
61 
62  MUDA_GENERIC operator ConstView() const MUDA_NOEXCEPT { return as_const(); }
63 
64  // non-const accessor
65  MUDA_GENERIC auto_const_t<T>* data() MUDA_NOEXCEPT
66  {
67  return m_data + m_offset;
68  }
69 
70  MUDA_GENERIC auto_const_t<T>* data(size_t i) MUDA_NOEXCEPT
71  {
72  i += m_offset;
73  return m_data + i;
74  }
75 
76  MUDA_GENERIC auto_const_t<T>* origin_data() MUDA_NOEXCEPT { return m_data; }
77  MUDA_GENERIC ThisView subview(size_t offset, size_t size = ~0) MUDA_NOEXCEPT;
78  MUDA_GENERIC ThisViewer viewer() MUDA_NOEXCEPT;
79 
80  // const accessor
81 
82  MUDA_GENERIC size_t size() const MUDA_NOEXCEPT { return m_size; }
83  MUDA_GENERIC const T* data() const MUDA_NOEXCEPT
84  {
85  return remove_const(*this).data();
86  }
87  MUDA_GENERIC const T* data(size_t i) const MUDA_NOEXCEPT
88  {
89  return remove_const(*this).data(i);
90  }
91  MUDA_GENERIC const T* origin_data() const MUDA_NOEXCEPT { return m_data; }
92  MUDA_GENERIC size_t offset() const MUDA_NOEXCEPT { return m_offset; }
93 
94  MUDA_GENERIC ConstView subview(size_t offset, size_t size = ~0) const MUDA_NOEXCEPT;
95  MUDA_GENERIC CViewer cviewer() const MUDA_NOEXCEPT;
96 
97 
98  MUDA_GENERIC auto_const_t<T>& operator[](size_t i) MUDA_NOEXCEPT
99  {
100  return *data(i);
101  }
102 
103  MUDA_GENERIC const T& operator[](size_t i) const MUDA_NOEXCEPT
104  {
105  return *data(i);
106  }
107 
108  /**********************************************************************************
109  * BufferView As Iterator
110  ***********************************************************************************/
111 
112  // Random Access Iterator Interface
113  using value_type = T;
114  using reference = T&;
115  using pointer = T*;
116  using iterator_category = std::random_access_iterator_tag;
117  using difference_type = size_t;
118 
119  MUDA_GENERIC ThisView operator+(int i)
120  {
121  return ThisView{m_data, m_offset + i, m_size - i};
122  }
123  MUDA_GENERIC ConstView operator+(int i) const
124  {
125  return remove_const(*this).operator+(i).as_const();
126  }
127  MUDA_GENERIC reference operator*() { return *data(0); }
128  MUDA_GENERIC auto_const_t<T>& operator[](int i) { return *data(i); }
129  MUDA_GENERIC const T& operator[](int i) const { return *data(i); }
130 };
131 
132 template <typename T>
133 class CBufferView : public BufferViewBase<true, T>
134 {
136 
137  public:
138  using Base::Base;
139 
140  MUDA_GENERIC CBufferView(const Base& base)
141  : Base(base)
142  {
143  }
144 
145  MUDA_GENERIC CBufferView<T> subview(size_t offset, size_t size = ~0) const MUDA_NOEXCEPT
146  {
147  return CBufferView{Base::subview(offset, size)};
148  }
149 
150  MUDA_GENERIC CBufferView<T> subview(size_t offset, size_t size = ~0) MUDA_NOEXCEPT
151  {
152  return CBufferView{Base::subview(offset, size)};
153  }
154 
155  MUDA_HOST void copy_to(T* host) const;
156 
157  MUDA_GENERIC auto as_const() const MUDA_NOEXCEPT { return *this; }
158 };
159 
160 template <typename T>
161 class BufferView : public BufferViewBase<false, T>
162 {
164 
165  public:
166  using Base::BufferViewBase;
167  using Base::data;
168  using Base::origin_data;
169 
170  MUDA_GENERIC BufferView(const Base& base)
171  : Base(base)
172  {
173  }
174 
175  MUDA_GENERIC BufferView(const CBufferView<T>&) = delete;
176 
177  MUDA_GENERIC BufferView(Dense1D<T> viewer) MUDA_NOEXCEPT
178  : Base(viewer.data(), 0, (size_t)viewer.total_size())
179  {
180  }
181 
182  MUDA_GENERIC CBufferView<T> as_const() const MUDA_NOEXCEPT
183  {
184  return CBufferView<T>{Base::as_const()};
185  }
186 
187  MUDA_GENERIC operator CBufferView<T>() const MUDA_NOEXCEPT
188  {
189  return as_const();
190  }
191 
192  MUDA_GENERIC BufferView<T> subview(size_t offset, size_t size = ~0) MUDA_NOEXCEPT
193  {
194  return BufferView{Base::subview(offset, size)};
195  }
196 
197  MUDA_GENERIC CBufferView<T> subview(size_t offset, size_t size = ~0) const MUDA_NOEXCEPT
198  {
199  return CBufferView{Base::subview(offset, size)};
200  }
201 
202  MUDA_HOST void fill(const T& v);
203  MUDA_HOST void copy_from(CBufferView<T> other);
204  MUDA_HOST void copy_from(const T* host);
205  MUDA_HOST void copy_to(T* host) const
206  {
207  CBufferView<T>{*this}.copy_to(host);
208  }
209 };
210 
211 template <typename T>
213 {
214  using type = CBufferView<T>;
215 };
216 
217 template <typename T>
219 {
220  using type = BufferView<T>;
221 };
222 } // namespace muda
223 
224 #include "details/buffer_view.inl"
Definition: view_base.h:7
Definition: type_modifier.h:21
Definition: type_modifier.h:27
Definition: buffer_view.h:23
Definition: buffer_fwd.h:12
Definition: assert.h:13
A C/C++ array like viewer for kernel access, with safe checking on any input.
Definition: dense_1d.h:26
Definition: buffer_fwd.h:15