Spaces:
Runtime error
Runtime error
// CPP reference implementation | |
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; | |
// 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<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; | |