Hex  1.0
Hydrogen-electron collision solver
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
opencl.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
2  * *
3  * / / / / __ \ \ / / *
4  * / /__ / / / _ \ \ \/ / *
5  * / ___ / | |/_/ / /\ \ *
6  * / / / / \_\ / / \ \ *
7  * *
8  * Jakub Benda (c) 2014 *
9  * Charles University in Prague *
10  * *
11 \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12 
13 #ifndef HEX_OPENCL
14 #define HEX_OPENCL
15 
16 #ifndef NO_OPENCL
17 
18 #include <CL/cl.h>
19 
20 #include "arrays.h"
21 
29 template <class T> class CLArrayView : public ArrayView<T>
30 {
31  protected:
32 
34  cl_mem cl_handle_;
35 
36  public:
37 
38  //
39  // aliases
40  //
41 
42  typedef T DataType;
43  typedef T * iterator;
44  typedef T const * const_iterator;
45 
46  //
47  // basic constructors
48  //
49 
51  : ArrayView<T>(), cl_handle_(nullptr) { /*std::cout << "Init Default\n";*/ }
52  CLArrayView (size_t n, T const * ptr)
53  : ArrayView<T>(n, const_cast<T*>(ptr)), cl_handle_(nullptr) { /*std::cout << "Init from ptr.\n";*/ }
54  CLArrayView (ArrayView<T> v, size_t i = 0, size_t n = 0)
55  : ArrayView<T>(v, i, n), cl_handle_(nullptr) { /*std::cout << "Init from ArrayView\n";*/ }
57  : ArrayView<T>(v), cl_handle_(v.cl_handle_) { /*std::cout << "Init from CLArrayView\n";*/ }
59  : ArrayView<T>(), cl_handle_(nullptr)
60  {
61  std::swap (ArrayView<T>::array_, v.ArrayView<T>::array_);
62  std::swap (ArrayView<T>::N_, v.ArrayView<T>::N_ );
63  std::swap (cl_handle_, v.cl_handle_ );
64  }
65 
66  //
67  // destructor
68  //
69 
70  virtual ~CLArrayView ()
71  {
72  }
73 
74  //
75  // STL interface (except changes in size -- we don't want to bother with GPU reallocation)
76  //
77 
78  size_t size () const { return ArrayView<T>::size(); }
79  T const & operator [] (size_t i) const { return ArrayView<T>::operator[](i); }
80  T & operator [] (size_t i) { return ArrayView<T>::operator[](i); }
81  T const * data () const { return ArrayView<T>::data(); }
82  T * data () { return ArrayView<T>::data(); }
83  const_iterator begin () const { return ArrayView<T>::begin(); }
85  const_iterator end () const { return ArrayView<T>::end(); }
86  iterator end () { return ArrayView<T>::end(); }
87  T const & front (size_t i = 0) const { return ArrayView<T>::front(i); }
88  T & front (size_t i = 0) { return ArrayView<T>::front(i); }
89  T const & back (size_t i = 0) const { return ArrayView<T>::back(i); }
90  T & back (size_t i = 0) { return ArrayView<T>::back(i); }
91 
92  //
93  // OpenCL intrinsics
94  //
95 
96  bool is_connected () const
97  {
98  return cl_handle_ != nullptr;
99  }
100 
101  void connect (cl_context context, cl_mem_flags flags)
102  {
103  // release previous allocation prior to creating a new buffer !
104  if (cl_handle_ != nullptr)
105  throw exception ("[clArray::connect] Release the buffer before connecting!");
106 
107  // allocate memory on GPU
108  cl_handle_ = clCreateBuffer (context, flags, size() * sizeof(T), data(), nullptr);
109  }
110 
111  void disconnect ()
112  {
113  // release previous allocations
114  if (cl_handle_ != nullptr)
115  clReleaseMemObject(cl_handle_);
116 
117  // clear pointer
118  cl_handle_ = nullptr;
119  }
120 
121  cl_int EnqueueUpload (cl_command_queue queue)
122  {
123  return clEnqueueWriteBuffer (queue, cl_handle_, CL_TRUE, 0, size() * sizeof(T), data(), 0, nullptr, nullptr);
124  }
125 
126  cl_int EnqueueDownload (cl_command_queue queue)
127  {
128  return clEnqueueReadBuffer (queue, cl_handle_, CL_TRUE, 0, size() * sizeof(T), data(), 0, nullptr, nullptr);
129  }
130 
131  cl_mem const & handle () const
132  {
133  return cl_handle_;
134  }
135 };
136 
151 #ifndef NO_ALIGN
152 #define CL_ALIGNMENT 4096
153 template <class T, class Alloc = AlignedAllocator<T,CL_ALIGNMENT>> class CLArray : public CLArrayView<T>
154 #else
155 template <class T, class Alloc = PlainAllocator<T>> class CLArray : public CLArrayView<T>
156 #endif
157 {
158  public:
159 
160  //
161  // aliases
162  //
163 
164  typedef T DataType;
165  typedef T * iterator;
166  typedef T const * const_iterator;
167 
168  //
169  // basic constructors
170  //
171 
173  : CLArrayView<T>() {}
174  CLArray (size_t n, T x = T(0))
175  : CLArrayView<T>(n, Alloc::alloc(n)) { for (size_t i = 0; i < n; i++) (*this)[i] = x; }
176  CLArray (ArrayView<T> v, size_t i = 0, size_t n = 0)
177  : CLArrayView<T>(((n == 0) ? v.size() : n), Alloc::alloc((n == 0) ? v.size() : n)) { for (size_t j = 0; j < size(); j++) (*this)[j] = v[i+j]; }
178  CLArray (std::initializer_list<T> list)
179  : CLArrayView<T>(list.size(), Alloc::alloc(list.size())) { size_t i = 0; for (auto it = list.begin(); it != list.end(); it++) (*this)[i++] = *it; }
181  : CLArrayView<T>(std::move(rvrf)) {}
182 
183  //
184  // destructor
185  //
186 
187  virtual ~CLArray ()
188  {
189  // free GPU memory
190  disconnect();
191 
192  // free RAM memory
193  Alloc::free(data());
194  }
195 
196  //
197  // STL interface (except changes in size -- we don't want to bother with GPU reallocation)
198  //
199 
200  size_t size () const { return CLArrayView<T>::size(); }
201  T const & operator [] (size_t i) const { return CLArrayView<T>::operator[](i); }
202  T & operator [] (size_t i) { return CLArrayView<T>::operator[](i); }
203  T const * data () const { return CLArrayView<T>::data(); }
204  T * data () { return CLArrayView<T>::data(); }
207  const_iterator end () const { return CLArrayView<T>::end(); }
209  T const & front (size_t i = 0) const { return CLArrayView<T>::front(i); }
210  T & front (size_t i = 0) { return CLArrayView<T>::front(i); }
211  T const & back (size_t i = 0) const { return CLArrayView<T>::back(i); }
212  T & back (size_t i = 0) { return CLArrayView<T>::back(i); }
213 
214  //
215  // OpenCL intrinsics
216  //
217 
218  bool is_connected () const
219  {
221  }
222 
223  void connect (cl_context context, cl_mem_flags flags = CL_MEM_COPY_HOST_PTR | CL_MEM_READ_WRITE)
224  {
225  CLArrayView<T>::connect(context, flags);
226  }
227 
228  void disconnect ()
229  {
231  }
232 
233  cl_int EnqueueDownload (cl_command_queue queue)
234  {
235  return CLArrayView<T>::EnqueueDownload(queue);
236  }
237 
238  cl_int EnqueueUpload (cl_command_queue queue)
239  {
240  return CLArrayView<T>::EnqueueUpload(queue);
241  }
242 
243  cl_mem const & handle () const
244  {
245  return CLArrayView<T>::handle();
246  }
247 };
248 
249 #endif
250 
251 #endif
OpenCL array wrapper.
Definition: opencl.h:155
Array view.
Definition: arrays.h:186
T & back(size_t i=0)
Definition: opencl.h:90
cl_int EnqueueUpload(cl_command_queue queue)
Definition: opencl.h:121
cl_mem const & handle() const
Definition: opencl.h:131
CLArray(CLArray< T, Alloc > &&rvrf)
Definition: opencl.h:180
T const & front(size_t i=0) const
Definition: opencl.h:87
T const * const_iterator
Definition: arrays.h:193
iterator begin()
Definition: opencl.h:84
T & back(int i=0)
Definition: arrays.h:294
cl_int EnqueueDownload(cl_command_queue queue)
Definition: opencl.h:233
T const * const_iterator
Definition: opencl.h:166
void connect(cl_context context, cl_mem_flags flags)
Definition: opencl.h:101
cl_mem cl_handle_
Memory handle to the data copy on the GPU.
Definition: opencl.h:34
T const & operator[](size_t i) const
Definition: opencl.h:79
CLArrayView(CLArrayView< T > &&v)
Definition: opencl.h:58
const_iterator begin() const
Definition: opencl.h:83
virtual ~CLArray()
Definition: opencl.h:187
T * array_
Pointer to the array.
Definition: arrays.h:201
void disconnect()
Definition: opencl.h:111
T const * data() const
Definition: opencl.h:203
iterator begin()
Definition: arrays.h:288
size_t size() const
Definition: opencl.h:78
T DataType
Definition: opencl.h:42
T DataType
Definition: opencl.h:164
T * iterator
Definition: arrays.h:192
virtual ~CLArrayView()
Definition: opencl.h:70
T * data()
Pointer to the data.
Definition: opencl.h:204
iterator begin()
Definition: opencl.h:206
T & front(size_t i=0)
Definition: opencl.h:88
T * iterator
Definition: opencl.h:43
CLArray(ArrayView< T > v, size_t i=0, size_t n=0)
Definition: opencl.h:176
CLArrayView(CLArrayView< T > const &v)
Definition: opencl.h:56
T & back(size_t i=0)
Definition: opencl.h:212
T & operator[](size_t i)
Element-wise access (non-const).
Definition: arrays.h:249
cl_int EnqueueUpload(cl_command_queue queue)
Definition: opencl.h:238
size_t size() const
Length of the array (number of elements).
Definition: arrays.h:276
void connect(cl_context context, cl_mem_flags flags=CL_MEM_COPY_HOST_PTR|CL_MEM_READ_WRITE)
Definition: opencl.h:223
T & front(int i=0)
Definition: arrays.h:292
const_iterator begin() const
Definition: opencl.h:205
void disconnect()
Definition: opencl.h:228
cl_int EnqueueDownload(cl_command_queue queue)
Definition: opencl.h:126
T const & operator[](size_t i) const
Definition: opencl.h:201
size_t N_
Number of elements in the array.
Definition: arrays.h:198
CLArrayView exception
iterator end()
Definition: opencl.h:86
cl_mem const & handle() const
Definition: opencl.h:243
iterator end()
Definition: opencl.h:208
CLArray(std::initializer_list< T > list)
Definition: opencl.h:178
ArrayView()
Definition: arrays.h:206
virtual T * data()
Pointer to the data.
Definition: arrays.h:280
CLArray()
Definition: opencl.h:172
T const & back(size_t i=0) const
Definition: opencl.h:89
CLArrayView(size_t n, T const *ptr)
Definition: opencl.h:52
const_iterator end() const
Definition: opencl.h:85
T const * const_iterator
Definition: opencl.h:44
T const & back(size_t i=0) const
Definition: opencl.h:211
T & front(size_t i=0)
Definition: opencl.h:210
T * iterator
Definition: opencl.h:165
iterator end()
Definition: arrays.h:290
T const * data() const
Definition: opencl.h:81
bool is_connected() const
Definition: opencl.h:218
T const & front(size_t i=0) const
Definition: opencl.h:209
size_t size() const
Definition: opencl.h:200
T * data()
Pointer to the data.
Definition: opencl.h:82
CLArrayView()
Definition: opencl.h:50
bool is_connected() const
Definition: opencl.h:96
const_iterator end() const
Definition: opencl.h:207
OpenCL array wrapper.
Definition: opencl.h:29
CLArrayView(ArrayView< T > v, size_t i=0, size_t n=0)
Definition: opencl.h:54