#include #include #include #include #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA #include #endif using namespace unittest; struct SumTupleFunctor { template __host__ __device__ Tuple operator()(const Tuple &lhs, const Tuple &rhs) { using thrust::get; return thrust::make_tuple(get<0>(lhs) + get<0>(rhs), get<1>(lhs) + get<1>(rhs)); } }; struct MakeTupleFunctor { template __host__ __device__ thrust::tuple operator()(T1 &lhs, T2 &rhs) { return thrust::make_tuple(lhs, rhs); } }; template struct TestTupleScan { void operator()(const size_t n) { using namespace thrust; host_vector h_t1 = unittest::random_integers(n); host_vector h_t2 = unittest::random_integers(n); // initialize input host_vector< tuple > h_input(n); transform(h_t1.begin(), h_t1.end(), h_t2.begin(), h_input.begin(), MakeTupleFunctor()); device_vector< tuple > d_input = h_input; // allocate output tuple zero(0,0); host_vector < tuple > h_output(n, zero); device_vector< tuple > d_output(n, zero); // inclusive_scan inclusive_scan(h_input.begin(), h_input.end(), h_output.begin(), SumTupleFunctor()); inclusive_scan(d_input.begin(), d_input.end(), d_output.begin(), SumTupleFunctor()); ASSERT_EQUAL_QUIET(h_output, d_output); // exclusive_scan tuple init(13,17); exclusive_scan(h_input.begin(), h_input.end(), h_output.begin(), init, SumTupleFunctor()); exclusive_scan(d_input.begin(), d_input.end(), d_output.begin(), init, SumTupleFunctor()); ASSERT_EQUAL_QUIET(h_output, d_output); } }; VariableUnitTest TestTupleScanInstance;