#include #include #include #include // CPP reference implementation template void reduce_intervals(InputIterator input, OutputIterator output, BinaryFunction binary_op, Decomposition decomp) { typedef typename thrust::iterator_value::type OutputType; typedef typename Decomposition::index_type index_type; // wrap binary_op 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 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 decomp(10, 10, 1); Vector output(decomp.size()); reduce_intervals(omp_tag, input.begin(), output.begin(), thrust::plus(), decomp); ASSERT_EQUAL(output[0], 10); } { uniform_decomposition decomp(10, 6, 2); Vector output(decomp.size()); reduce_intervals(omp_tag, input.begin(), output.begin(), thrust::plus(), decomp); ASSERT_EQUAL(output[0], 6); ASSERT_EQUAL(output[1], 4); } } DECLARE_UNITTEST(TestOmpReduceIntervalsSimple); template 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 h_input = unittest::random_integers(n); thrust::device_vector d_input = h_input; uniform_decomposition decomp(n, 7, 100); thrust::host_vector h_output(decomp.size()); thrust::device_vector d_output(decomp.size()); ::reduce_intervals(h_input.begin(), h_output.begin(), thrust::plus(), decomp); thrust::system::omp::tag omp_tag; reduce_intervals(omp_tag, d_input.begin(), d_output.begin(), thrust::plus(), decomp); ASSERT_EQUAL(h_output, d_output); } }; VariableUnitTest TestOmpReduceIntervalsInstance;