#include #include #include #include #include struct make_pair_functor { template __host__ __device__ thrust::pair operator()(const T1 &x, const T2 &y) { return thrust::make_pair(x,y); } // end operator()() }; // end make_pair_functor struct add_pairs { template __host__ __device__ Pair1 operator()(const Pair1 &x, const Pair2 &y) { return thrust::make_pair(x.first + y.first, x.second + y.second); } // end operator() }; // end add_pairs template struct TestPairTransform { void operator()(const size_t n) { typedef thrust::pair P; thrust::host_vector h_p1 = unittest::random_integers(n); thrust::host_vector h_p2 = unittest::random_integers(n); thrust::host_vector

h_result(n); thrust::device_vector d_p1 = h_p1; thrust::device_vector d_p2 = h_p2; thrust::device_vector

d_result(n); // zip up pairs on the host thrust::transform(h_p1.begin(), h_p1.end(), h_p2.begin(), h_result.begin(), make_pair_functor()); // zip up pairs on the device thrust::transform(d_p1.begin(), d_p1.end(), d_p2.begin(), d_result.begin(), make_pair_functor()); ASSERT_EQUAL_QUIET(h_result, d_result); // add pairs on the host thrust::transform(h_result.begin(), h_result.end(), h_result.begin(), h_result.begin(), add_pairs()); // add pairs on the device thrust::transform(d_result.begin(), d_result.end(), d_result.begin(), d_result.begin(), add_pairs()); ASSERT_EQUAL_QUIET(h_result, d_result); } }; // end TestPairZip VariableUnitTest > TestPairTransformInstance;