57 namespace implementation
64 template <enum Backend,
class Matrix>
68 typedef typename Matrix::Scalar
T;
81 template <
class Matrix>
82 struct max<Backend::NATIVE, Matrix>
85 typedef typename Matrix::Scalar
T;
105 REQUIRE(vec.
vlen > 0,
"Vector can not be empty!\n");
117 return *std::max_element(vec, vec+len);
126 template <
class Matrix>
127 struct max<Backend::EIGEN3,Matrix>
130 typedef typename Matrix::Scalar
T;
162 #endif // HAVE_EIGEN3
169 template <
class Matrix>
170 struct max<Backend::VIENNACL,Matrix>
173 typedef typename Matrix::Scalar
T;
177 static viennacl::ocl::kernel& generate_kernel()
179 std::string kernel_name =
"max_" + ocl::get_type_string<T>();
181 if (ocl::kernel_exists(kernel_name))
182 return ocl::get_kernel(kernel_name);
184 std::string source = ocl::generate_kernel_preamble<T>(kernel_name);
188 __kernel void KERNEL_NAME(
189 __global DATATYPE* vec, int size, int offset,
190 __global DATATYPE* result)
192 __local DATATYPE buffer[WORK_GROUP_SIZE_1D];
194 int local_id = get_local_id(0);
196 DATATYPE thread_max = -INFINITY;
197 for (int i=local_id; i<size; i+=WORK_GROUP_SIZE_1D)
199 DATATYPE v = vec[i+offset];
200 thread_max = max(v, thread_max);
203 buffer[local_id] = thread_max;
205 for (int j = WORK_GROUP_SIZE_1D/2; j > 0; j = j>>1)
207 barrier(CLK_LOCAL_MEM_FENCE);
209 buffer[local_id] = max(buffer[local_id], buffer[local_id + j]);
212 barrier(CLK_LOCAL_MEM_FENCE);
214 if (get_global_id(0)==0)
220 viennacl::ocl::kernel& kernel = ocl::compile_kernel(kernel_name, source);
222 kernel.local_work_size(0, OCL_WORK_GROUP_SIZE_1D);
223 kernel.global_work_size(0, OCL_WORK_GROUP_SIZE_1D);
233 static T
compute(CGPUMatrix<T> mat)
235 viennacl::ocl::kernel& kernel = generate_kernel<T>();
237 CGPUVector<T> result(1);
239 viennacl::ocl::enqueue(kernel(mat.vcl_matrix(),
240 cl_int(mat.num_rows*mat.num_cols), cl_int(mat.offset),
241 result.vcl_vector()));
251 static T
compute(CGPUVector<T> vec)
253 viennacl::ocl::kernel& kernel = generate_kernel<T>();
255 CGPUVector<T> result(1);
257 viennacl::ocl::enqueue(kernel(vec.vcl_vector(),
258 cl_int(vec.vlen), cl_int(vec.offset),
259 result.vcl_vector()));
264 #endif // HAVE_VIENNACL
271 #endif // MAX_IMPL_H_
static T compute(SGVector< T > vec)
static T compute(T *vec, index_t len)
Generic class which is specialized for different backends to perform the max operation.
static T compute(SGMatrix< T > mat)
static T compute(Matrix m)
Eigen::Matrix< T, Eigen::Dynamic, 1 > VectorXt
all of classes and functions are contained in the shogun namespace
static T compute(SGMatrix< T > mat)
static T compute(SGVector< T > vec)
Matrix::Scalar max(Matrix m)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > MatrixXt