56 namespace implementation
62 template <enum Backend,
class Matrix>
66 typedef typename Matrix::Scalar
T;
74 template <>
template <
class Matrix>
75 struct max<Backend::EIGEN3,Matrix>
77 typedef typename Matrix::Scalar
T;
101 template <>
template <
class Matrix>
102 struct max<Backend::VIENNACL,Matrix>
104 typedef typename Matrix::Scalar
T;
108 static viennacl::ocl::kernel& generate_kernel()
110 std::string kernel_name =
"max_" + ocl::get_type_string<T>();
112 if (ocl::kernel_exists(kernel_name))
113 return ocl::get_kernel(kernel_name);
115 std::string source = ocl::generate_kernel_preamble<T>(kernel_name);
119 __kernel void KERNEL_NAME(
120 __global DATATYPE* vec, int size, int offset,
121 __global DATATYPE* result)
123 __local DATATYPE buffer[WORK_GROUP_SIZE_1D];
125 int local_id = get_local_id(0);
127 DATATYPE thread_max = -INFINITY;
128 for (int i=local_id; i<size; i+=WORK_GROUP_SIZE_1D)
130 DATATYPE v = vec[i+offset];
131 thread_max = max(v, thread_max);
134 buffer[local_id] = thread_max;
136 for (int j = WORK_GROUP_SIZE_1D/2; j > 0; j = j>>1)
138 barrier(CLK_LOCAL_MEM_FENCE);
140 buffer[local_id] = max(buffer[local_id], buffer[local_id + j]);
143 barrier(CLK_LOCAL_MEM_FENCE);
145 if (get_global_id(0)==0)
151 viennacl::ocl::kernel& kernel = ocl::compile_kernel(kernel_name, source);
153 kernel.local_work_size(0, OCL_WORK_GROUP_SIZE_1D);
154 kernel.global_work_size(0, OCL_WORK_GROUP_SIZE_1D);
160 static T
compute(CGPUMatrix<T> mat)
162 viennacl::ocl::kernel& kernel = generate_kernel<T>();
164 CGPUVector<T> result(1);
166 viennacl::ocl::enqueue(kernel(mat.vcl_matrix(),
167 cl_int(mat.num_rows*mat.num_cols), cl_int(mat.offset),
168 result.vcl_vector()));
174 static T
compute(CGPUVector<T> vec)
176 viennacl::ocl::kernel& kernel = generate_kernel<T>();
178 CGPUVector<T> result(1);
180 viennacl::ocl::enqueue(kernel(vec.vcl_vector(),
181 cl_int(vec.vlen), cl_int(vec.offset),
182 result.vcl_vector()));
187 #endif // HAVE_VIENNACL
194 #endif // MAX_IMPL_H_
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