#include #include #include using namespace unittest; struct MakeTupleFunctor { template __host__ __device__ thrust::tuple operator()(T1 &lhs, T2 &rhs) { return thrust::make_tuple(lhs, rhs); } }; template struct GetFunctor { template __host__ __device__ typename thrust::access_traits< typename thrust::tuple_element::type >::const_type operator()(const Tuple &t) { return thrust::get(t); } }; template struct TestTupleTransform { 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; device_vector d_t1(n), d_t2(n); // select 0th transform(d_tuples.begin(), d_tuples.end(), d_t1.begin(), GetFunctor<0>()); // select 1st transform(d_tuples.begin(), d_tuples.end(), d_t2.begin(), GetFunctor<1>()); ASSERT_ALMOST_EQUAL(h_t1, d_t1); ASSERT_ALMOST_EQUAL(h_t2, d_t2); ASSERT_EQUAL_QUIET(h_tuples, d_tuples); } }; VariableUnitTest TestTupleTransformInstance;