| | #include <unittest/unittest.h> |
| |
|
| | #include <thrust/functional.h> |
| | #include <thrust/system/detail/internal/decompose.h> |
| | #include <thrust/system/omp/detail/reduce_intervals.h> |
| |
|
| | |
| | template<typename InputIterator, |
| | typename OutputIterator, |
| | typename BinaryFunction, |
| | typename Decomposition> |
| | void reduce_intervals(InputIterator input, |
| | OutputIterator output, |
| | BinaryFunction binary_op, |
| | Decomposition decomp) |
| | { |
| | typedef typename thrust::iterator_value<OutputIterator>::type OutputType; |
| | typedef typename Decomposition::index_type index_type; |
| |
|
| | |
| | thrust::detail::wrapped_function< |
| | BinaryFunction, |
| | OutputType |
| | > wrapped_binary_op(binary_op); |
| |
|
| | for(index_type i = 0; i < decomp.size(); ++i, ++output) |
| | { |
| | InputIterator begin = input + decomp[i].begin(); |
| | InputIterator end = input + decomp[i].end(); |
| |
|
| | if (begin != end) |
| | { |
| | OutputType sum = *begin; |
| |
|
| | ++begin; |
| |
|
| | while (begin != end) |
| | { |
| | sum = wrapped_binary_op(sum, *begin); |
| | ++begin; |
| | } |
| |
|
| | *output = sum; |
| | } |
| | } |
| | } |
| |
|
| |
|
| | void TestOmpReduceIntervalsSimple(void) |
| | { |
| | typedef int T; |
| | typedef thrust::device_vector<T> Vector; |
| |
|
| | using thrust::system::omp::detail::reduce_intervals; |
| | using thrust::system::detail::internal::uniform_decomposition; |
| |
|
| | Vector input(10, 1); |
| |
|
| | thrust::omp::tag omp_tag; |
| | |
| | { |
| | uniform_decomposition<int> decomp(10, 10, 1); |
| | Vector output(decomp.size()); |
| | reduce_intervals(omp_tag, input.begin(), output.begin(), thrust::plus<T>(), decomp); |
| |
|
| | ASSERT_EQUAL(output[0], 10); |
| | } |
| | |
| | { |
| | uniform_decomposition<int> decomp(10, 6, 2); |
| | Vector output(decomp.size()); |
| | reduce_intervals(omp_tag, input.begin(), output.begin(), thrust::plus<T>(), decomp); |
| |
|
| | ASSERT_EQUAL(output[0], 6); |
| | ASSERT_EQUAL(output[1], 4); |
| | } |
| | } |
| | DECLARE_UNITTEST(TestOmpReduceIntervalsSimple); |
| |
|
| |
|
| | template<typename T> |
| | struct TestOmpReduceIntervals |
| | { |
| | void operator()(const size_t n) |
| | { |
| | using thrust::system::omp::detail::reduce_intervals; |
| | using thrust::system::detail::internal::uniform_decomposition; |
| | |
| | thrust::host_vector<T> h_input = unittest::random_integers<T>(n); |
| | thrust::device_vector<T> d_input = h_input; |
| |
|
| | uniform_decomposition<size_t> decomp(n, 7, 100); |
| |
|
| | thrust::host_vector<T> h_output(decomp.size()); |
| | thrust::device_vector<T> d_output(decomp.size()); |
| | |
| | ::reduce_intervals(h_input.begin(), h_output.begin(), thrust::plus<T>(), decomp); |
| | thrust::system::omp::tag omp_tag; |
| | reduce_intervals(omp_tag, d_input.begin(), d_output.begin(), thrust::plus<T>(), decomp); |
| |
|
| | ASSERT_EQUAL(h_output, d_output); |
| | } |
| | }; |
| | VariableUnitTest<TestOmpReduceIntervals, IntegralTypes> TestOmpReduceIntervalsInstance; |
| |
|
| |
|