| #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; |
|
|
|
|