ViennaCL - The Vienna Computing Library  1.5.2
kernel.hpp
Go to the documentation of this file.
1 #ifndef VIENNACL_OCL_KERNEL_HPP_
2 #define VIENNACL_OCL_KERNEL_HPP_
3 
4 /* =========================================================================
5  Copyright (c) 2010-2014, Institute for Microelectronics,
6  Institute for Analysis and Scientific Computing,
7  TU Wien.
8  Portions of this software are copyright by UChicago Argonne, LLC.
9 
10  -----------------
11  ViennaCL - The Vienna Computing Library
12  -----------------
13 
14  Project Head: Karl Rupp rupp@iue.tuwien.ac.at
15 
16  (A list of authors and contributors can be found in the PDF manual)
17 
18  License: MIT (X11), see file LICENSE in the base directory
19 ============================================================================= */
20 
25 #ifdef __APPLE__
26 #include <OpenCL/cl.h>
27 #else
28 #include <CL/cl.h>
29 #endif
30 
31 #include "viennacl/ocl/forwards.h"
32 #include "viennacl/ocl/handle.hpp"
33 #include "viennacl/ocl/program.hpp"
34 #include "viennacl/ocl/device.hpp"
36 #include "viennacl/ocl/infos.hpp"
37 
38 namespace viennacl
39 {
40  namespace ocl
41  {
47  {
49  cl_uint start;
51  cl_uint stride;
53  cl_uint size;
55  cl_uint internal_size;
56  };
57 
59  class kernel
60  {
61  template <typename KernelType>
62  friend void enqueue(KernelType & k, viennacl::ocl::command_queue const & queue);
63 
64  template<cl_kernel_info param>
65  friend typename detail::return_type<cl_kernel, param>::Result info(viennacl::ocl::kernel & k);
66 
67  template<cl_kernel_info param>
68  friend typename detail::return_type<cl_kernel, param>::Result info(viennacl::ocl::kernel & k, viennacl::ocl::device const & d);
69 
70 
71  public:
73 
74  kernel() : handle_(), p_program_(NULL), p_context_(NULL), name_()
75  {
76  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
77  std::cout << "ViennaCL: Creating kernel object (default CTOR)" << std::endl;
78  #endif
79  }
80 
81  kernel(cl_kernel kernel_handle, viennacl::ocl::program const & kernel_program, viennacl::ocl::context const & kernel_context, std::string const & name)
82  : handle_(kernel_handle, kernel_context), p_program_(&kernel_program), p_context_(&kernel_context), name_(name)
83  {
84  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
85  std::cout << "ViennaCL: Creating kernel object (full CTOR)" << std::endl;
86  #endif
87  set_work_size_defaults();
88  }
89 
90  kernel(kernel const & other)
91  : handle_(other.handle_), p_program_(other.p_program_), p_context_(other.p_context_), name_(other.name_)
92  {
93  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
94  std::cout << "ViennaCL: Creating kernel object (Copy CTOR)" << std::endl;
95  #endif
96  local_work_size_[0] = other.local_work_size_[0];
97  local_work_size_[1] = other.local_work_size_[1];
98  local_work_size_[2] = other.local_work_size_[2];
99 
100  global_work_size_[0] = other.global_work_size_[0];
101  global_work_size_[1] = other.global_work_size_[1];
102  global_work_size_[2] = other.global_work_size_[2];
103  }
104 
106  {
107  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
108  std::cout << "ViennaCL: Assigning kernel object" << std::endl;
109  #endif
110  handle_ = other.handle_;
111  p_program_ = other.p_program_;
112  p_context_ = other.p_context_;
113  name_ = other.name_;
114  local_work_size_[0] = other.local_work_size_[0];
115  local_work_size_[1] = other.local_work_size_[1];
116  local_work_size_[2] = other.local_work_size_[2];
117  global_work_size_[0] = other.global_work_size_[0];
118  global_work_size_[1] = other.global_work_size_[1];
119  global_work_size_[2] = other.global_work_size_[2];
120  return *this;
121  }
122 
124  void arg(unsigned int pos, cl_char val)
125  {
126  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
127  std::cout << "ViennaCL: Setting char kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
128  #endif
129  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_char), (void*)&val);
130  VIENNACL_ERR_CHECK(err);
131  }
132 
134  void arg(unsigned int pos, cl_uchar val)
135  {
136  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
137  std::cout << "ViennaCL: Setting unsigned char kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
138  #endif
139  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_uchar), (void*)&val);
140  VIENNACL_ERR_CHECK(err);
141  }
142 
144  void arg(unsigned int pos, cl_short val)
145  {
146  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
147  std::cout << "ViennaCL: Setting short kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
148  #endif
149  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_short), (void*)&val);
150  VIENNACL_ERR_CHECK(err);
151  }
152 
154  void arg(unsigned int pos, cl_ushort val)
155  {
156  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
157  std::cout << "ViennaCL: Setting unsigned short kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
158  #endif
159  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_ushort), (void*)&val);
160  VIENNACL_ERR_CHECK(err);
161  }
162 
163 
165  void arg(unsigned int pos, cl_uint val)
166  {
167  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
168  std::cout << "ViennaCL: Setting unsigned int kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
169  #endif
170  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_uint), (void*)&val);
171  VIENNACL_ERR_CHECK(err);
172  }
173 
175  void arg(unsigned int pos, packed_cl_uint val)
176  {
177  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
178  std::cout << "ViennaCL: Setting packed_cl_uint kernel argument (" << val.start << ", " << val.stride << ", " << val.size << ", " << val.internal_size << ") at pos " << pos << " for kernel " << name_ << std::endl;
179  #endif
180  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(packed_cl_uint), (void*)&val);
181  VIENNACL_ERR_CHECK(err);
182  }
183 
185  void arg(unsigned int pos, float val)
186  {
187  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
188  std::cout << "ViennaCL: Setting floating point kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
189  #endif
190  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(float), (void*)&val);
191  VIENNACL_ERR_CHECK(err);
192  }
193 
195  void arg(unsigned int pos, double val)
196  {
197  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
198  std::cout << "ViennaCL: Setting double precision kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
199  #endif
200  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(double), (void*)&val);
201  VIENNACL_ERR_CHECK(err);
202  }
203 
205  void arg(unsigned int pos, cl_int val)
206  {
207  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
208  std::cout << "ViennaCL: Setting int precision kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
209  #endif
210  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_int), (void*)&val);
211  VIENNACL_ERR_CHECK(err);
212  }
213 
215  void arg(unsigned int pos, cl_ulong val)
216  {
217  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
218  std::cout << "ViennaCL: Setting ulong precision kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
219  #endif
220  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_ulong), (void*)&val);
221  VIENNACL_ERR_CHECK(err);
222  }
223 
225  void arg(unsigned int pos, cl_long val)
226  {
227  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
228  std::cout << "ViennaCL: Setting long precision kernel argument " << val << " at pos " << pos << " for kernel " << name_ << std::endl;
229  #endif
230  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_long), (void*)&val);
231  VIENNACL_ERR_CHECK(err);
232  }
233 
234  //generic handling: call .handle() member
236  template<class VCL_TYPE>
237  void arg(unsigned int pos, VCL_TYPE const & val)
238  {
239  assert(&val.handle().opencl_handle().context() == &handle_.context() && bool("Kernel and memory object not in the same context!"));
240 
241  cl_mem temp = val.handle().opencl_handle().get();
242  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
243  std::cout << "ViennaCL: Setting generic kernel argument " << temp << " at pos " << pos << " for kernel " << name_ << std::endl;
244  #endif
245  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(cl_mem), (void*)&temp);
246  VIENNACL_ERR_CHECK(err);
247  }
248 
249  //forward handles directly:
251  template<class CL_TYPE>
252  void arg(unsigned int pos, viennacl::ocl::handle<CL_TYPE> const & h)
253  {
254  CL_TYPE temp = h.get();
255  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
256  std::cout << "ViennaCL: Setting handle kernel argument " << temp << " at pos " << pos << " for kernel " << name_ << std::endl;
257  #endif
258  cl_int err = clSetKernelArg(handle_.get(), pos, sizeof(CL_TYPE), (void*)&temp);
259  VIENNACL_ERR_CHECK(err);
260  }
261 
262 
263  //local buffer argument:
265  void arg(unsigned int pos, const local_mem & mem)
266  {
267  cl_uint size = static_cast<cl_uint>(mem.size());
268  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
269  std::cout << "ViennaCL: Setting local memory kernel argument of size " << size << " bytes at pos " << pos << " for kernel " << name_ << std::endl;
270  #endif
271  cl_int err = clSetKernelArg(handle_.get(), pos, size, 0);
272  VIENNACL_ERR_CHECK(err);
273  }
274 
275 
276 
278  template <typename T0>
279  kernel & operator()(T0 const & t0)
280  {
281  arg(0, t0);
282  return *this;
283  }
284 
286  template <typename T0, typename T1>
287  kernel & operator()(T0 const & t0, T1 const & t1)
288  {
289  arg(0, t0); arg(1, t1);
290  return *this;
291  }
292 
294  template <typename T0, typename T1, typename T2>
295  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2)
296  {
297  arg(0, t0); arg(1, t1); arg(2, t2);
298  return *this;
299  }
300 
302  template <typename T0, typename T1, typename T2, typename T3>
303  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3)
304  {
305  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3);
306  return *this;
307  }
308 
310  template <typename T0, typename T1, typename T2, typename T3, typename T4>
311  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
312  {
313  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4);
314  return *this;
315  }
316 
318  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
319  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
320  {
321  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
322  return *this;
323  }
324 
326  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
327  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
328  {
329  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5); arg(6, t6);
330  return *this;
331  }
332 
334  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
335  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
336  {
337  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5); arg(6, t6); arg(7, t7);
338  return *this;
339  }
340 
342  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
343  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
344  {
345  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5); arg(6, t6); arg(7, t7); arg(8, t8);
346  return *this;
347  }
348 
350  template <typename T0, typename T1, typename T2, typename T3, typename T4,
351  typename T5, typename T6, typename T7, typename T8, typename T9>
352  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4,
353  T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
354  {
355  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5); arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9);
356  return *this;
357  }
358 
360  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
361  typename T6, typename T7, typename T8, typename T9, typename T10>
362  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
363  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
364  {
365  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5); arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10);
366  return *this;
367  }
368 
370  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
371  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
372  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
373  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
374  {
375  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
376  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
377  return *this;
378  }
379 
381  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
382  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
383  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
384  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
385  {
386  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
387  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11); arg(12, t12);
388  return *this;
389  }
390 
392  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
393  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
394  typename T12, typename T13>
395  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
396  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
397  T12 const & t12, T13 const & t13)
398  {
399  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
400  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
401  arg(12, t12); arg(13, t13);
402  return *this;
403  }
404 
406  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
407  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
408  typename T12, typename T13, typename T14>
409  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
410  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
411  T12 const & t12, T13 const & t13, T14 const & t14)
412  {
413  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
414  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
415  arg(12, t12); arg(13, t13); arg(14, t14);
416  return *this;
417  }
418 
420  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
421  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
422  typename T12, typename T13, typename T14, typename T15>
423  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
424  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
425  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
426  {
427  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
428  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
429  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15);
430  return *this;
431  }
432 
434  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
435  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
436  typename T12, typename T13, typename T14, typename T15, typename T16>
437  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
438  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
439  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16)
440  {
441  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
442  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
443  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16);
444  return *this;
445  }
446 
448  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
449  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
450  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17>
451  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
452  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
453  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17)
454  {
455  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
456  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
457  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
458  return *this;
459  }
460 
462  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
463  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
464  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
465  typename T18>
466  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
467  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
468  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
469  T18 const & t18
470  )
471  {
472  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
473  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
474  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
475  arg(18, t18);
476  return *this;
477  }
478 
480  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
481  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
482  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
483  typename T18, typename T19>
484  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
485  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
486  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
487  T18 const & t18, T19 const & t19
488  )
489  {
490  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
491  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
492  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
493  arg(18, t18); arg(19, t19);
494  return *this;
495  }
496 
498  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
499  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
500  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
501  typename T18, typename T19, typename T20>
502  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
503  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
504  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
505  T18 const & t18, T19 const & t19, T20 const & t20
506  )
507  {
508  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
509  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
510  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
511  arg(18, t18); arg(19, t19); arg(20, t20);
512  return *this;
513  }
514 
516  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
517  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
518  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
519  typename T18, typename T19, typename T20, typename T21>
520  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
521  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
522  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
523  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21
524  )
525  {
526  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
527  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
528  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
529  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21);
530  return *this;
531  }
532 
534  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
535  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
536  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
537  typename T18, typename T19, typename T20, typename T21, typename T22>
538  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
539  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
540  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
541  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22
542  )
543  {
544  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
545  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
546  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
547  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22);
548  return *this;
549  }
550 
552  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
553  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
554  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
555  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23>
556  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
557  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
558  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
559  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23
560  )
561  {
562  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
563  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
564  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
565  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
566  return *this;
567  }
568 
570  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
571  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
572  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
573  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
574  typename T24>
575  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
576  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
577  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
578  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
579  T24 const & t24
580  )
581  {
582  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
583  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
584  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
585  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
586  arg(24, t24);
587  return *this;
588  }
589 
591  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
592  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
593  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
594  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
595  typename T24, typename T25>
596  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
597  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
598  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
599  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
600  T24 const & t24, T25 const & t25
601  )
602  {
603  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
604  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
605  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
606  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
607  arg(24, t24); arg(25, t25);
608  return *this;
609  }
610 
612  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
613  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
614  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
615  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
616  typename T24, typename T25, typename T26>
617  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
618  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
619  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
620  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
621  T24 const & t24, T25 const & t25, T26 const & t26
622  )
623  {
624  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
625  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
626  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
627  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
628  arg(24, t24); arg(25, t25); arg(26, t26);
629  return *this;
630  }
631 
633  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
634  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
635  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
636  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
637  typename T24, typename T25, typename T26, typename T27>
638  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
639  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
640  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
641  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
642  T24 const & t24, T25 const & t25, T26 const & t26, T27 const & t27
643  )
644  {
645  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
646  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
647  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
648  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
649  arg(24, t24); arg(25, t25); arg(26, t26); arg(27, t27);
650  return *this;
651  }
652 
654  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
655  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
656  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
657  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
658  typename T24, typename T25, typename T26, typename T27, typename T28>
659  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
660  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
661  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
662  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
663  T24 const & t24, T25 const & t25, T26 const & t26, T27 const & t27, T28 const & t28
664  )
665  {
666  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
667  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
668  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
669  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
670  arg(24, t24); arg(25, t25); arg(26, t26); arg(27, t27); arg(28, t28);
671  return *this;
672  }
673 
675  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
676  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
677  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
678  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
679  typename T24, typename T25, typename T26, typename T27, typename T28, typename T29>
680  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
681  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
682  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
683  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
684  T24 const & t24, T25 const & t25, T26 const & t26, T27 const & t27, T28 const & t28, T29 const & t29
685  )
686  {
687  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
688  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
689  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
690  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
691  arg(24, t24); arg(25, t25); arg(26, t26); arg(27, t27); arg(28, t28); arg(29, t29);
692  return *this;
693  }
694 
696  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
697  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
698  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
699  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
700  typename T24, typename T25, typename T26, typename T27, typename T28, typename T29,
701  typename T30>
702  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
703  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
704  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
705  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
706  T24 const & t24, T25 const & t25, T26 const & t26, T27 const & t27, T28 const & t28, T29 const & t29,
707  T30 const & t30
708  )
709  {
710  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
711  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
712  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
713  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
714  arg(24, t24); arg(25, t25); arg(26, t26); arg(27, t27); arg(28, t28); arg(29, t29);
715  arg(30, t30);
716  return *this;
717  }
718 
720  template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
721  typename T6, typename T7, typename T8, typename T9, typename T10, typename T11,
722  typename T12, typename T13, typename T14, typename T15, typename T16, typename T17,
723  typename T18, typename T19, typename T20, typename T21, typename T22, typename T23,
724  typename T24, typename T25, typename T26, typename T27, typename T28, typename T29,
725  typename T30, typename T31>
726  kernel & operator()(T0 const & t0, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5,
727  T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11,
728  T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15, T16 const & t16, T17 const & t17,
729  T18 const & t18, T19 const & t19, T20 const & t20, T21 const & t21, T22 const & t22, T23 const & t23,
730  T24 const & t24, T25 const & t25, T26 const & t26, T27 const & t27, T28 const & t28, T29 const & t29,
731  T30 const & t30, T31 const & t31
732  )
733  {
734  arg(0, t0); arg(1, t1); arg(2, t2); arg(3, t3); arg(4, t4); arg(5, t5);
735  arg(6, t6); arg(7, t7); arg(8, t8); arg(9, t9); arg(10, t10); arg(11, t11);
736  arg(12, t12); arg(13, t13); arg(14, t14); arg(15, t15); arg(16, t16); arg(17, t17);
737  arg(18, t18); arg(19, t19); arg(20, t20); arg(21, t21); arg(22, t22); arg(23, t23);
738  arg(24, t24); arg(25, t25); arg(26, t26); arg(27, t27); arg(28, t28); arg(29, t29);
739  arg(30, t30); arg(31, t31);
740  return *this;
741  }
742 
743 
744 
745 
750  size_type local_work_size(int index = 0) const
751  {
752  assert(index < 3 && bool("Work size index out of bounds"));
753  return local_work_size_[index];
754  }
759  size_type global_work_size(int index = 0) const
760  {
761  assert(index < 3 && bool("Work size index out of bounds"));
762  return global_work_size_[index];
763  }
764 
770  void local_work_size(int index, size_type s)
771  {
772  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
773  std::cout << "ViennaCL: Setting local work size to " << s << " at index " << index << " for kernel " << name_ << std::endl;
774  #endif
775  assert(index < 3 && bool("Work size index out of bounds"));
776  local_work_size_[index] = s;
777  }
783  void global_work_size(int index, size_type s)
784  {
785  #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
786  std::cout << "ViennaCL: Setting global work size to " << s << " at index " << index << " for kernel " << name_ << std::endl;
787  #endif
788  assert(index < 3 && bool("Work size index out of bounds"));
789  global_work_size_[index] = s;
790  }
791 
792  std::string const & name() const { return name_; }
793 
794  viennacl::ocl::handle<cl_kernel> const & handle() const { return handle_; }
795 
796  viennacl::ocl::context const & context() const { return *p_context_; }
797 
798  private:
799 
800  inline void set_work_size_defaults(); //see context.hpp for implementation
801 
803  viennacl::ocl::program const * p_program_;
804  viennacl::ocl::context const * p_context_;
805  std::string name_;
806  size_type local_work_size_[3];
807  size_type global_work_size_[3];
808  };
809 
814  template<cl_kernel_info param>
815  typename detail::return_type<cl_kernel, param>::Result info(viennacl::ocl::kernel & k)
816  {
817  typedef typename detail::return_type<cl_kernel, param>::Result res_t;
818  return detail::get_info_impl<res_t>()(k.handle_.get(),param);
819  }
820 
826  template<cl_kernel_info param>
827  typename detail::return_type<cl_kernel, param>::Result info(viennacl::ocl::kernel & k, viennacl::ocl::device const & d)
828  {
829  typedef typename detail::return_type<cl_kernel, param>::Result res_t;
830  return detail::get_info_impl<res_t>()(k.handle_.get(),d.id(),param);
831  }
832 
833  } //namespace ocl
834 } //namespace viennacl
835 
836 #endif
void arg(unsigned int pos, packed_cl_uint val)
Sets four packed unsigned integers as argument at the provided position.
Definition: kernel.hpp:175
vcl_size_t size() const
Returns size in bytes.
Definition: local_mem.hpp:39
void arg(unsigned int pos, cl_char val)
Sets a char argument at the provided position.
Definition: kernel.hpp:124
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10)
Convenience function for setting eleven kernel parameters.
Definition: kernel.hpp:362
void arg(unsigned int pos, const local_mem &mem)
Sets an OpenCL local memory object at the provided position.
Definition: kernel.hpp:265
This file provides the forward declarations for the OpenCL layer of ViennaCL.
std::size_t vcl_size_t
Definition: forwards.h:58
Helper class for packing four cl_uint numbers into a uint4 type for access inside an OpenCL kernel...
Definition: kernel.hpp:46
Represents an OpenCL device within ViennaCL.
friend void enqueue(KernelType &k, viennacl::ocl::command_queue const &queue)
Enqueues a kernel in the provided queue.
Definition: enqueue.hpp:48
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12)
Convenience function for setting thirteen kernel parameters.
Definition: kernel.hpp:383
detail::return_type< cl_device_id, param >::Result info(cl_device_id const &handle)
Definition: infos.hpp:231
vcl_size_t size_type
Definition: kernel.hpp:72
Represents an OpenCL kernel within ViennaCL.
Definition: kernel.hpp:59
std::string const & name() const
Definition: kernel.hpp:792
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2)
Convenience function for setting three kernel parameters.
Definition: kernel.hpp:295
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21)
Convenience function for setting twentytwo kernel parameters.
Definition: kernel.hpp:520
Manages an OpenCL context and provides the respective convenience functions for creating buffers...
Definition: context.hpp:51
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20)
Convenience function for setting twentyone kernel parameters.
Definition: kernel.hpp:502
viennacl::ocl::context const & context() const
Definition: kernel.hpp:796
A class representing a compute device (e.g. a GPU)
Definition: device.hpp:49
cl_uint start
Starting value of the integer stride.
Definition: kernel.hpp:49
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26, T27 const &t27, T28 const &t28, T29 const &t29, T30 const &t30, T31 const &t31)
Convenience function for setting 32 kernel parameters.
Definition: kernel.hpp:726
A class representing a command queue.
Definition: command_queue.hpp:45
void local_work_size(int index, size_type s)
Sets the local work size at the respective dimension.
Definition: kernel.hpp:770
void arg(unsigned int pos, cl_int val)
Sets an int argument at the provided position.
Definition: kernel.hpp:205
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25)
Convenience function for setting 26 kernel parameters.
Definition: kernel.hpp:596
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5)
Convenience function for setting six kernel parameters.
Definition: kernel.hpp:319
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18)
Convenience function for setting nineteen kernel parameters.
Definition: kernel.hpp:466
kernel & operator()(T0 const &t0)
Convenience function for setting one kernel parameter.
Definition: kernel.hpp:279
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23)
Convenience function for setting 24 kernel parameters.
Definition: kernel.hpp:556
#define VIENNACL_ERR_CHECK(err)
Definition: error.hpp:655
void arg(unsigned int pos, cl_ulong val)
Sets an unsigned long argument at the provided position.
Definition: kernel.hpp:215
void arg(unsigned int pos, VCL_TYPE const &val)
Sets an OpenCL memory object at the provided position.
Definition: kernel.hpp:237
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26, T27 const &t27)
Convenience function for setting 28 kernel parameters.
Definition: kernel.hpp:638
vcl_size_t size(VectorType const &vec)
Generic routine for obtaining the size of a vector (ViennaCL, uBLAS, etc.)
Definition: size.hpp:144
A class representing local (shared) OpenCL memory. Typically used as kernel argument.
Definition: local_mem.hpp:33
Implementation of convenience functions to get infos.
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26, T27 const &t27, T28 const &t28)
Convenience function for setting 29 kernel parameters.
Definition: kernel.hpp:659
const OCL_TYPE & get() const
Definition: handle.hpp:189
cl_device_id id() const
Returns the OpenCL device id.
Definition: device.hpp:981
Implements an OpenCL program class for ViennaCL.
void arg(unsigned int pos, cl_ushort val)
Sets a argument of type unsigned short at the provided position.
Definition: kernel.hpp:154
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9)
Convenience function for setting ten kernel parameters.
Definition: kernel.hpp:352
friend detail::return_type< cl_kernel, param >::Result info(viennacl::ocl::kernel &k)
Queries information about a kernel.
Definition: kernel.hpp:815
kernel(kernel const &other)
Definition: kernel.hpp:90
Implementation of a smart-pointer-like class for handling OpenCL handles.
kernel()
Definition: kernel.hpp:74
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26, T27 const &t27, T28 const &t28, T29 const &t29, T30 const &t30)
Convenience function for setting 31 kernel parameters.
Definition: kernel.hpp:702
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3)
Convenience function for setting four kernel parameters.
Definition: kernel.hpp:303
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22)
Convenience function for setting 23 kernel parameters.
Definition: kernel.hpp:538
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17)
Convenience function for setting eighteen kernel parameters.
Definition: kernel.hpp:451
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6)
Convenience function for setting seven kernel parameters.
Definition: kernel.hpp:327
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26)
Convenience function for setting 27 kernel parameters.
Definition: kernel.hpp:617
void arg(unsigned int pos, double val)
Sets a double precision floating point argument at the provided position.
Definition: kernel.hpp:195
Wrapper class for an OpenCL program.
Definition: program.hpp:40
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11)
Convenience function for setting twelve kernel parameters.
Definition: kernel.hpp:372
void arg(unsigned int pos, cl_short val)
Sets a argument of type short at the provided position.
Definition: kernel.hpp:144
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14)
Convenience function for setting fifteen kernel parameters.
Definition: kernel.hpp:409
viennacl::ocl::kernel & operator=(const kernel &other)
Definition: kernel.hpp:105
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15)
Convenience function for setting sixteen kernel parameters.
Definition: kernel.hpp:423
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13)
Convenience function for setting fourteen kernel parameters.
Definition: kernel.hpp:395
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16)
Convenience function for setting seventeen kernel parameters.
Definition: kernel.hpp:437
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24)
Convenience function for setting 25 kernel parameters.
Definition: kernel.hpp:575
void arg(unsigned int pos, viennacl::ocl::handle< CL_TYPE > const &h)
Sets an OpenCL object at the provided position.
Definition: kernel.hpp:252
void global_work_size(int index, size_type s)
Sets the global work size at the respective dimension.
Definition: kernel.hpp:783
void arg(unsigned int pos, cl_uint val)
Sets an unsigned integer argument at the provided position.
Definition: kernel.hpp:165
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19)
Convenience function for setting twenty kernel parameters.
Definition: kernel.hpp:484
void arg(unsigned int pos, cl_long val)
Sets an unsigned long argument at the provided position.
Definition: kernel.hpp:225
cl_uint stride
Increment between integers.
Definition: kernel.hpp:51
void arg(unsigned int pos, cl_uchar val)
Sets a char argument at the provided position.
Definition: kernel.hpp:134
kernel(cl_kernel kernel_handle, viennacl::ocl::program const &kernel_program, viennacl::ocl::context const &kernel_context, std::string const &name)
Definition: kernel.hpp:81
void arg(unsigned int pos, float val)
Sets a single precision floating point argument at the provided position.
Definition: kernel.hpp:185
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8)
Convenience function for setting nine kernel parameters.
Definition: kernel.hpp:343
size_type global_work_size(int index=0) const
Returns the global work size at the respective dimension.
Definition: kernel.hpp:759
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4)
Convenience function for setting five kernel parameters.
Definition: kernel.hpp:311
viennacl::ocl::context const & context() const
Definition: handle.hpp:191
size_type local_work_size(int index=0) const
Returns the local work size at the respective dimension.
Definition: kernel.hpp:750
cl_uint size
Number of values in the stride.
Definition: kernel.hpp:53
viennacl::ocl::handle< cl_kernel > const & handle() const
Definition: kernel.hpp:794
A local (shared) memory object for OpenCL.
kernel & operator()(T0 const &t0, T1 const &t1)
Convenience function for setting two kernel parameters.
Definition: kernel.hpp:287
Handle class the effectively represents a smart pointer for OpenCL handles.
Definition: forwards.h:51
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7)
Convenience function for setting eight kernel parameters.
Definition: kernel.hpp:335
kernel & operator()(T0 const &t0, T1 const &t1, T2 const &t2, T3 const &t3, T4 const &t4, T5 const &t5, T6 const &t6, T7 const &t7, T8 const &t8, T9 const &t9, T10 const &t10, T11 const &t11, T12 const &t12, T13 const &t13, T14 const &t14, T15 const &t15, T16 const &t16, T17 const &t17, T18 const &t18, T19 const &t19, T20 const &t20, T21 const &t21, T22 const &t22, T23 const &t23, T24 const &t24, T25 const &t25, T26 const &t26, T27 const &t27, T28 const &t28, T29 const &t29)
Convenience function for setting 30 kernel parameters.
Definition: kernel.hpp:680
cl_uint internal_size
Internal length of the buffer. Might be larger than 'size' due to padding.
Definition: kernel.hpp:55