ViennaCL - The Vienna Computing Library  1.7.0
Free open-source GPU-accelerated linear algebra and solver library.
scalar_operations.hpp
Go to the documentation of this file.
1 #ifndef VIENNACL_LINALG_OPENCL_SCALAR_OPERATIONS_HPP_
2 #define VIENNACL_LINALG_OPENCL_SCALAR_OPERATIONS_HPP_
3 
4 /* =========================================================================
5  Copyright (c) 2010-2015, 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 manual)
17 
18  License: MIT (X11), see file LICENSE in the base directory
19 ============================================================================= */
20 
25 #include "viennacl/forwards.h"
26 #include "viennacl/ocl/device.hpp"
27 #include "viennacl/ocl/handle.hpp"
28 #include "viennacl/ocl/kernel.hpp"
29 #include "viennacl/tools/tools.hpp"
35 #include "viennacl/traits/size.hpp"
40 
41 namespace viennacl
42 {
43 namespace linalg
44 {
45 namespace opencl
46 {
47 
48 template<typename ScalarT1,
49  typename ScalarT2, typename NumericT>
53  >::type
54 as(ScalarT1 & s1,
55  ScalarT2 const & s2, NumericT const & alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha)
56 {
57  assert( &viennacl::traits::opencl_handle(s1).context() == &viennacl::traits::opencl_handle(s2).context() && bool("Operands not in the same OpenCL context!"));
58 
59  typedef typename viennacl::result_of::cpu_value_type<ScalarT1>::type value_type;
60  viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(s1).context());
62 
63  cl_uint options_alpha = detail::make_options(len_alpha, reciprocal_alpha, flip_sign_alpha);
64 
67  k.local_work_size(0, 1);
68  k.global_work_size(0, 1);
69  viennacl::ocl::enqueue(k(viennacl::traits::opencl_handle(s1),
70  viennacl::traits::opencl_handle(viennacl::tools::promote_if_host_scalar<value_type>(alpha)),
71  options_alpha,
72  viennacl::traits::opencl_handle(s2) )
73  );
74 }
75 
76 
77 template<typename ScalarT1,
78  typename ScalarT2, typename NumericT2,
79  typename ScalarT3, typename NumericT3>
85  >::type
86 asbs(ScalarT1 & s1,
87  ScalarT2 const & s2, NumericT2 const & alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha,
88  ScalarT3 const & s3, NumericT3 const & beta, vcl_size_t len_beta, bool reciprocal_beta, bool flip_sign_beta)
89 {
90  assert( &viennacl::traits::opencl_handle(s1).context() == &viennacl::traits::opencl_handle(s2).context() && bool("Operands not in the same OpenCL context!"));
91  assert( &viennacl::traits::opencl_handle(s2).context() == &viennacl::traits::opencl_handle(s3).context() && bool("Operands not in the same OpenCL context!"));
92 
93  typedef typename viennacl::result_of::cpu_value_type<ScalarT1>::type value_type;
94  viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(s1).context());
96 
97  std::string kernel_name;
100  if (is_cpu_2 && is_cpu_3)
101  kernel_name = "asbs_cpu_cpu";
102  else if (is_cpu_2 && !is_cpu_3)
103  kernel_name = "asbs_cpu_gpu";
104  else if (!is_cpu_2 && is_cpu_3)
105  kernel_name = "asbs_gpu_cpu";
106  else
107  kernel_name = "asbs_gpu_gpu";
108 
109  cl_uint options_alpha = detail::make_options(len_alpha, reciprocal_alpha, flip_sign_alpha);
110  cl_uint options_beta = detail::make_options(len_beta, reciprocal_beta, flip_sign_beta);
111 
113  k.local_work_size(0, 1);
114  k.global_work_size(0, 1);
115  viennacl::ocl::enqueue(k(viennacl::traits::opencl_handle(s1),
116  viennacl::traits::opencl_handle(viennacl::tools::promote_if_host_scalar<value_type>(alpha)),
117  options_alpha,
118  viennacl::traits::opencl_handle(s2),
119  viennacl::traits::opencl_handle(viennacl::tools::promote_if_host_scalar<value_type>(beta)),
120  options_beta,
121  viennacl::traits::opencl_handle(s3) )
122  );
123 }
124 
125 
126 template<typename ScalarT1,
127  typename ScalarT2, typename NumericT2,
128  typename ScalarT3, typename NumericT3>
134  >::type
135 asbs_s(ScalarT1 & s1,
136  ScalarT2 const & s2, NumericT2 const & alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha,
137  ScalarT3 const & s3, NumericT3 const & beta, vcl_size_t len_beta, bool reciprocal_beta, bool flip_sign_beta)
138 {
139  assert( &viennacl::traits::opencl_handle(s1).context() == &viennacl::traits::opencl_handle(s2).context() && bool("Operands not in the same OpenCL context!"));
140  assert( &viennacl::traits::opencl_handle(s2).context() == &viennacl::traits::opencl_handle(s3).context() && bool("Operands not in the same OpenCL context!"));
141 
142  typedef typename viennacl::result_of::cpu_value_type<ScalarT1>::type value_type;
143  viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(s1).context());
145 
146  std::string kernel_name;
148  kernel_name = "asbs_s_cpu_cpu";
150  kernel_name = "asbs_s_cpu_gpu";
152  kernel_name = "asbs_s_gpu_cpu";
153  else
154  kernel_name = "asbs_s_gpu_gpu";
155 
156  cl_uint options_alpha = detail::make_options(len_alpha, reciprocal_alpha, flip_sign_alpha);
157  cl_uint options_beta = detail::make_options(len_beta, reciprocal_beta, flip_sign_beta);
158 
160  k.local_work_size(0, 1);
161  k.global_work_size(0, 1);
162  viennacl::ocl::enqueue(k(viennacl::traits::opencl_handle(s1),
163  viennacl::traits::opencl_handle(viennacl::tools::promote_if_host_scalar<value_type>(alpha)),
164  options_alpha,
165  viennacl::traits::opencl_handle(s2),
166  viennacl::traits::opencl_handle(viennacl::tools::promote_if_host_scalar<value_type>(beta)),
167  options_beta,
168  viennacl::traits::opencl_handle(s3) )
169  );
170 }
171 
172 
178 template<typename ScalarT1, typename ScalarT2>
181  >::type
182 swap(ScalarT1 & s1, ScalarT2 & s2)
183 {
184  assert( &viennacl::traits::opencl_handle(s1).context() == &viennacl::traits::opencl_handle(s2).context() && bool("Operands not in the same OpenCL context!"));
185 
186  typedef typename viennacl::result_of::cpu_value_type<ScalarT1>::type value_type;
187  viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(s1).context());
189 
191  k.local_work_size(0, 1);
192  k.global_work_size(0, 1);
193  viennacl::ocl::enqueue(k(viennacl::traits::opencl_handle(s1),
194  viennacl::traits::opencl_handle(s2))
195  );
196 }
197 
198 
199 
200 } //namespace opencl
201 } //namespace linalg
202 } //namespace viennacl
203 
204 
205 #endif
Simple enable-if variant that uses the SFINAE pattern.
Definition: enable_if.hpp:30
Represents an OpenCL device within ViennaCL.
OpenCL kernel file for scalar operations.
Generic size and resize functionality for different vector and matrix types.
viennacl::enable_if< viennacl::is_scalar< ScalarT1 >::value &&viennacl::is_scalar< ScalarT2 >::value >::type swap(ScalarT1 &s1, ScalarT2 &s2)
Swaps the contents of two scalars, data is copied.
Represents an OpenCL kernel within ViennaCL.
Definition: kernel.hpp:58
Extracts the underlying OpenCL start index handle from a vector, a matrix, an expression etc...
Various little tools used here and there in ViennaCL.
size_type local_work_size(int index=0) const
Returns the local work size at the respective dimension.
Definition: kernel.hpp:742
Manages an OpenCL context and provides the respective convenience functions for creating buffers...
Definition: context.hpp:55
This file provides the forward declarations for the main types used within ViennaCL.
Determines row and column increments for matrices and matrix proxies.
viennacl::scalar< int > s2
viennacl::scalar< float > s1
Common implementations shared by OpenCL-based operations.
float NumericT
Definition: bisect.cpp:40
Main namespace in ViennaCL. Holds all the basic types such as vector, matrix, etc. and defines operations upon them.
Definition: cpu_ram.hpp:34
Main kernel class for generating OpenCL kernels for operations involving viennacl::scalar<>, but not viennacl::vector<> or viennacl::matrix<>.
Definition: scalar.hpp:243
viennacl::enable_if< viennacl::is_scalar< ScalarT1 >::value &&viennacl::is_scalar< ScalarT2 >::value &&viennacl::is_scalar< ScalarT3 >::value &&viennacl::is_any_scalar< NumericT2 >::value &&viennacl::is_any_scalar< NumericT3 >::value >::type asbs_s(ScalarT1 &s1, ScalarT2 const &s2, NumericT2 const &alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha, ScalarT3 const &s3, NumericT3 const &beta, vcl_size_t len_beta, bool reciprocal_beta, bool flip_sign_beta)
Helper struct for checking whether a type is a host scalar type (e.g. float, double) ...
Definition: forwards.h:448
viennacl::ocl::kernel & get_kernel(std::string const &program_name, std::string const &kernel_name)
Convenience function for retrieving the kernel of a program directly from the context.
Definition: context.hpp:605
static void init(viennacl::ocl::context &ctx)
Definition: scalar.hpp:250
Helper struct for checking whether the provided type represents a scalar (either host, from ViennaCL, or a flip-sign proxy)
Definition: forwards.h:469
Implementation of a smart-pointer-like class for handling OpenCL handles.
cl_uint make_options(vcl_size_t length, bool reciprocal, bool flip_sign)
Definition: common.hpp:42
std::size_t vcl_size_t
Definition: forwards.h:75
T::ERROR_CANNOT_DEDUCE_CPU_SCALAR_TYPE_FOR_T type
Definition: result_of.hpp:271
viennacl::enable_if< viennacl::is_scalar< ScalarT1 >::value &&viennacl::is_scalar< ScalarT2 >::value &&viennacl::is_scalar< ScalarT3 >::value &&viennacl::is_any_scalar< NumericT2 >::value &&viennacl::is_any_scalar< NumericT3 >::value >::type asbs(ScalarT1 &s1, ScalarT2 const &s2, NumericT2 const &alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha, ScalarT3 const &s3, NumericT3 const &beta, vcl_size_t len_beta, bool reciprocal_beta, bool flip_sign_beta)
viennacl::enable_if< viennacl::is_scalar< ScalarT1 >::value &&viennacl::is_scalar< ScalarT2 >::value &&viennacl::is_any_scalar< NumericT >::value >::type as(ScalarT1 &s1, ScalarT2 const &s2, NumericT const &alpha, vcl_size_t len_alpha, bool reciprocal_alpha, bool flip_sign_alpha)
All the predicates used within ViennaCL. Checks for expressions to be vectors, etc.
Helper struct for checking whether a type is a viennacl::scalar<>
Definition: forwards.h:455
viennacl::context context(T const &t)
Returns an ID for the currently active memory domain of an object.
Definition: context.hpp:40
void enqueue(KernelType &k, viennacl::ocl::command_queue const &queue)
Enqueues a kernel in the provided queue.
Definition: enqueue.hpp:50
Representation of an OpenCL kernel in ViennaCL.
size_type global_work_size(int index=0) const
Returns the global work size at the respective dimension.
Definition: kernel.hpp:751
Extracts the underlying OpenCL handle from a vector, a matrix, an expression etc. ...
A collection of compile time type deductions.
Simple enable-if variant that uses the SFINAE pattern.