2020
2121namespace boost {
2222namespace compute {
23+ namespace detail {
24+
25+ template <class Iterator , class OutputIterator >
26+ struct reverse_copy_kernel : public meta_kernel
27+ {
28+ reverse_copy_kernel (Iterator first, Iterator last, OutputIterator result)
29+ : meta_kernel(" reverse_copy" )
30+ {
31+ typedef typename std::iterator_traits<Iterator>::value_type value_type;
32+
33+ // store size of the range
34+ m_size = detail::iterator_range_size (first, last);
35+ add_set_arg<const cl_uint>(" size" , static_cast <const cl_uint>(m_size));
36+
37+ *this <<
38+ decl<cl_uint>(" i" ) << " = get_global_id(0);\n " <<
39+ decl<cl_uint>(" j" ) << " = size - get_global_id(0) - 1;\n " <<
40+ result[var<cl_uint>(" j" )] << " =" << first[var<cl_uint>(" i" )] << " ;\n " ;
41+ }
42+
43+ void exec (command_queue &queue)
44+ {
45+ exec_1d (queue, 0 , m_size);
46+ }
47+
48+ size_t m_size;
49+ };
50+
51+ } // end detail namespace
2352
2453// / Copies the elements in the range [\p first, \p last) in reversed
2554// / order to the range beginning at \p result.
@@ -36,11 +65,11 @@ reverse_copy(InputIterator first,
3665
3766 difference_type count = std::distance (first, last);
3867
39- // copy data to result
40- ::boost::compute::copy (first, last, result, queue );
68+ detail::reverse_copy_kernel<InputIterator, OutputIterator>
69+ kernel (first, last, result);
4170
42- // reverse result
43- ::boost::compute::reverse (result, result + count, queue);
71+ // run kernel
72+ kernel. exec ( queue);
4473
4574 // return iterator to the end of result
4675 return result + count;
0 commit comments