@@ -36,7 +36,24 @@ namespace math {
36
36
template <typename Mat, typename Mat_scalar = scalar_type_t <Mat>,
37
37
require_eigen_t <Mat>...>
38
38
inline matrix_cl<Mat_scalar> to_matrix_cl (Mat&& src) {
39
- return matrix_cl<Mat_scalar>(src);
39
+ matrix_cl<Mat_scalar> dst (src.rows (), src.cols ());
40
+ if (src.size () == 0 ) {
41
+ return dst;
42
+ }
43
+ try {
44
+ cl::Event transfer_event;
45
+ cl::CommandQueue& queue = opencl_context.queue ();
46
+ queue.enqueueWriteBuffer (
47
+ dst.buffer (),
48
+ opencl_context.in_order ()
49
+ || std::is_rvalue_reference<Mat_scalar&&>::value,
50
+ 0 , sizeof (Mat_scalar) * src.size (), src.eval ().data (), nullptr ,
51
+ &transfer_event);
52
+ dst.add_write_event (transfer_event);
53
+ } catch (const cl::Error& e) {
54
+ check_opencl_error (" copy Eigen->(OpenCL)" , e);
55
+ }
56
+ return dst;
40
57
}
41
58
42
59
/* *
@@ -50,7 +67,24 @@ inline matrix_cl<Mat_scalar> to_matrix_cl(Mat&& src) {
50
67
template <typename Vec, typename Vec_scalar = scalar_type_t <Vec>,
51
68
require_std_vector_t <Vec>...>
52
69
inline matrix_cl<Vec_scalar> to_matrix_cl (Vec&& src) {
53
- return matrix_cl<Vec_scalar>(src);
70
+ matrix_cl<Vec_scalar> dst (src.size (), 1 );
71
+ if (src.size () == 0 ) {
72
+ return dst;
73
+ }
74
+ try {
75
+ cl::Event transfer_event;
76
+ cl::CommandQueue& queue = opencl_context.queue ();
77
+ queue.enqueueWriteBuffer (
78
+ dst.buffer (),
79
+ opencl_context.in_order ()
80
+ || std::is_rvalue_reference<Vec_scalar&&>::value,
81
+ 0 , sizeof (Vec_scalar) * src.size (), src.data (), nullptr ,
82
+ &transfer_event);
83
+ dst.add_write_event (transfer_event);
84
+ } catch (const cl::Error& e) {
85
+ check_opencl_error (" copy Eigen->(OpenCL)" , e);
86
+ }
87
+ return dst;
54
88
}
55
89
56
90
/* *
@@ -181,7 +215,28 @@ inline matrix_cl<Vec_scalar> packed_copy(Vec&& src, int rows) {
181
215
*/
182
216
template <typename T, typename = require_arithmetic_t <T>>
183
217
inline matrix_cl<T> copy_cl (const matrix_cl<T>& src) {
184
- return matrix_cl<T>(src);
218
+ matrix_cl<T> dst (src.rows (), src.cols (), src.view ());
219
+ if (src.size () == 0 ) {
220
+ return dst;
221
+ }
222
+ try {
223
+ /* *
224
+ * Copies the contents of the src buffer to the dst buffer
225
+ * see the matrix_cl(matrix_cl&) constructor
226
+ * for explanation
227
+ */
228
+ cl::CommandQueue queue = opencl_context.queue ();
229
+ const std::vector<cl::Event> mat_events
230
+ = vec_concat (dst.read_write_events (), src.write_events ());
231
+ cl::Event copy_event;
232
+ queue.enqueueCopyBuffer (src.buffer (), dst.buffer (), 0 , 0 ,
233
+ sizeof (T) * src.size (), &mat_events, ©_event);
234
+ dst.add_write_event (copy_event);
235
+ src.add_read_event (copy_event);
236
+ } catch (const cl::Error& e) {
237
+ check_opencl_error (" copy_cl (OpenCL)->(OpenCL)" , e);
238
+ }
239
+ return dst;
185
240
}
186
241
187
242
/* *
@@ -218,7 +273,23 @@ inline T from_matrix_cl_error_code(const matrix_cl<T>& src) {
218
273
*/
219
274
template <typename T, typename = require_arithmetic_t <std::decay_t <T>>>
220
275
inline matrix_cl<std::decay_t <T>> to_matrix_cl (T&& src) {
221
- return matrix_cl<std::decay_t <T>>(src);
276
+ matrix_cl<std::decay_t <T>> dst (1 , 1 );
277
+ check_size_match (" to_matrix_cl ((OpenCL) -> (OpenCL))" , " src.rows()" ,
278
+ dst.rows (), " dst.rows()" , 1 );
279
+ check_size_match (" to_matrix_cl ((OpenCL) -> (OpenCL))" , " src.cols()" ,
280
+ dst.cols (), " dst.cols()" , 1 );
281
+ try {
282
+ cl::Event copy_event;
283
+ const cl::CommandQueue queue = opencl_context.queue ();
284
+ queue.enqueueWriteBuffer (
285
+ dst.buffer (),
286
+ opencl_context.in_order () || std::is_rvalue_reference<T&&>::value, 0 ,
287
+ sizeof (std::decay_t <T>), &src, &dst.write_events (), ©_event);
288
+ dst.add_write_event (copy_event);
289
+ } catch (const cl::Error& e) {
290
+ check_opencl_error (" to_matrix_cl (OpenCL)->(OpenCL)" , e);
291
+ }
292
+ return dst;
222
293
}
223
294
224
295
} // namespace math
0 commit comments