55 namespace implementation
62 template <enum Backend,
class Matrix>
66 typedef typename Matrix::Scalar
T;
79 template <
class Matrix>
80 struct max<Backend::EIGEN3,Matrix>
83 typedef typename Matrix::Scalar
T;
121 template <
class Matrix>
122 struct max<Backend::VIENNACL,Matrix>
125 typedef typename Matrix::Scalar
T;
129 static viennacl::ocl::kernel& generate_kernel()
131 std::string kernel_name =
"max_" + ocl::get_type_string<T>();
133 if (ocl::kernel_exists(kernel_name))
134 return ocl::get_kernel(kernel_name);
136 std::string source = ocl::generate_kernel_preamble<T>(kernel_name);
140 __kernel void KERNEL_NAME(
141 __global DATATYPE* vec, int size, int offset,
142 __global DATATYPE* result)
144 __local DATATYPE buffer[WORK_GROUP_SIZE_1D];
146 int local_id = get_local_id(0);
148 DATATYPE thread_max = -INFINITY;
149 for (int i=local_id; i<size; i+=WORK_GROUP_SIZE_1D)
151 DATATYPE v = vec[i+offset];
152 thread_max = max(v, thread_max);
155 buffer[local_id] = thread_max;
157 for (int j = WORK_GROUP_SIZE_1D/2; j > 0; j = j>>1)
159 barrier(CLK_LOCAL_MEM_FENCE);
161 buffer[local_id] = max(buffer[local_id], buffer[local_id + j]);
164 barrier(CLK_LOCAL_MEM_FENCE);
166 if (get_global_id(0)==0)
172 viennacl::ocl::kernel& kernel = ocl::compile_kernel(kernel_name, source);
174 kernel.local_work_size(0, OCL_WORK_GROUP_SIZE_1D);
175 kernel.global_work_size(0, OCL_WORK_GROUP_SIZE_1D);
185 static T
compute(CGPUMatrix<T> mat)
187 viennacl::ocl::kernel& kernel = generate_kernel<T>();
189 CGPUVector<T> result(1);
191 viennacl::ocl::enqueue(kernel(mat.vcl_matrix(),
192 cl_int(mat.num_rows*mat.num_cols), cl_int(mat.offset),
193 result.vcl_vector()));
203 static T
compute(CGPUVector<T> vec)
205 viennacl::ocl::kernel& kernel = generate_kernel<T>();
207 CGPUVector<T> result(1);
209 viennacl::ocl::enqueue(kernel(vec.vcl_vector(),
210 cl_int(vec.vlen), cl_int(vec.offset),
211 result.vcl_vector()));
216 #endif // HAVE_VIENNACL
223 #endif // MAX_IMPL_H_
Generic class which is specialized for different backends to perform the max operation.
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