#include #include #include #include #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA #include #endif 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 TestPairScan { 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_pairs(n); thrust::host_vector

h_output(n); // zip up pairs on the host thrust::transform(h_p1.begin(), h_p1.end(), h_p2.begin(), h_pairs.begin(), make_pair_functor()); thrust::device_vector d_p1 = h_p1; thrust::device_vector d_p2 = h_p2; thrust::device_vector

d_pairs = h_pairs; thrust::device_vector

d_output(n); P init = thrust::make_pair(13,13); // scan with plus thrust::inclusive_scan(h_pairs.begin(), h_pairs.end(), h_output.begin(), add_pairs()); thrust::inclusive_scan(d_pairs.begin(), d_pairs.end(), d_output.begin(), add_pairs()); ASSERT_EQUAL_QUIET(h_output, d_output); // scan with maximum (thrust issue #69) thrust::inclusive_scan(h_pairs.begin(), h_pairs.end(), h_output.begin(), thrust::maximum

()); thrust::inclusive_scan(d_pairs.begin(), d_pairs.end(), d_output.begin(), thrust::maximum

()); ASSERT_EQUAL_QUIET(h_output, d_output); // scan with plus thrust::exclusive_scan(h_pairs.begin(), h_pairs.end(), h_output.begin(), init, add_pairs()); thrust::exclusive_scan(d_pairs.begin(), d_pairs.end(), d_output.begin(), init, add_pairs()); ASSERT_EQUAL_QUIET(h_output, d_output); // scan with maximum (thrust issue #69) thrust::exclusive_scan(h_pairs.begin(), h_pairs.end(), h_output.begin(), init, thrust::maximum

()); thrust::exclusive_scan(d_pairs.begin(), d_pairs.end(), d_output.begin(), init, thrust::maximum

()); ASSERT_EQUAL_QUIET(h_output, d_output); } }; VariableUnitTest > TestPairScanInstance;