#include #include #include #include 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 TestTupleReduce { void operator()(const size_t n) { using namespace thrust; host_vector h_t1 = random_integers(n); host_vector h_t2 = random_integers(n); // zip up the data host_vector< tuple > h_tuples(n); transform(h_t1.begin(), h_t1.end(), h_t2.begin(), h_tuples.begin(), MakeTupleFunctor()); // copy to device device_vector< tuple > d_tuples = h_tuples; tuple zero(0,0); // sum on host tuple h_result = reduce(h_tuples.begin(), h_tuples.end(), zero, SumTupleFunctor()); // sum on device tuple d_result = reduce(d_tuples.begin(), d_tuples.end(), zero, SumTupleFunctor()); ASSERT_EQUAL_QUIET(h_result, d_result); } }; VariableUnitTest TestTupleReduceInstance;