Skip to content

Commit f95b1ee

Browse files
committed
Separate kernel for reverse_copy()
Separate kernel for reverse_copy() algorithm improves its performance, new tests for reverse_copy_int
1 parent 0ab1d5f commit f95b1ee

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

include/boost/compute/algorithm/reverse_copy.hpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,35 @@
2020

2121
namespace boost {
2222
namespace 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;

test/test_reverse.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ BOOST_AUTO_TEST_CASE(reverse_copy_int)
6868
bc::reverse_copy(a.begin(), a.end(), b.begin());
6969
BOOST_CHECK(iter == b.end());
7070
CHECK_RANGE_EQUAL(int, 5, b, (4, 3, 2, 1, 0));
71+
72+
iter = bc::reverse_copy(b.begin() + 1, b.end(), a.begin() + 1);
73+
BOOST_CHECK(iter == a.end());
74+
CHECK_RANGE_EQUAL(int, 5, a, (0, 0, 1, 2, 3));
75+
76+
iter = bc::reverse_copy(a.begin(), a.end() - 1, b.begin());
77+
BOOST_CHECK(iter == (b.end() - 1));
78+
CHECK_RANGE_EQUAL(int, 5, b, (2, 1, 0, 0, 0));
7179
}
7280

7381
BOOST_AUTO_TEST_CASE(reverse_copy_counting_iterator)

0 commit comments

Comments
 (0)