31 #ifndef SET_ROWS_CONST_IMPL_H_
32 #define SET_ROWS_CONST_IMPL_H_
46 #endif // HAVE_VIENNACL
54 namespace implementation
60 template <enum Backend,
class Matrix,
class Vector>
64 typedef typename Matrix::Scalar
T;
69 static void compute(Matrix A, Vector v);
75 template <>
template <
class Matrix,
class Vector>
78 typedef typename Matrix::Scalar
T;
90 A_eig.colwise() = v_eig;
98 template <>
template <
class Matrix,
class Vector>
101 typedef typename Matrix::Scalar
T;
105 static viennacl::ocl::kernel& generate_kernel()
107 std::string kernel_name =
"set_rows_const_" + ocl::get_type_string<T>();
109 if (ocl::kernel_exists(kernel_name))
110 return ocl::get_kernel(kernel_name);
112 std::string source = ocl::generate_kernel_preamble<T>(kernel_name);
116 __kernel void KERNEL_NAME(
117 __global DATATYPE* mat, int nrows, int ncols, int offset,
118 __global DATATYPE* vec, int vec_offset)
120 int i = get_global_id(0);
121 int j = get_global_id(1);
123 if (i>=nrows || j>=ncols)
126 mat[offset + i+j*nrows] = vec[i+offset];
131 viennacl::ocl::kernel& kernel = ocl::compile_kernel(kernel_name, source);
133 kernel.local_work_size(0, OCL_WORK_GROUP_SIZE_2D);
134 kernel.local_work_size(1, OCL_WORK_GROUP_SIZE_2D);
142 static void compute(CGPUMatrix<T> A, CGPUVector<T> v)
144 viennacl::ocl::kernel& kernel = generate_kernel<T>();
145 kernel.global_work_size(0, ocl::align_to_multiple_2d(A.num_rows));
146 kernel.global_work_size(1, ocl::align_to_multiple_2d(A.num_cols));
148 viennacl::ocl::enqueue(kernel(A.vcl_matrix(),
149 cl_int(A.num_rows), cl_int(A.num_cols), cl_int(A.offset),
150 v.vcl_vector(), cl_int(v.offset)));
154 #endif // HAVE_VIENNACL
161 #endif // SET_ROWS_CONST_IMPL_H_
void set_rows_const(Matrix A, Vector v)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > MatrixXt
all of classes and functions are contained in the shogun namespace
Eigen::Matrix< T, Eigen::Dynamic, 1 > VectorXt
static void compute(Matrix A, Vector v)
static void compute(SGMatrix< T > A, SGVector< T > v)