#include #include #include #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA #include #endif using namespace unittest; template struct TuplePlus { __host__ __device__ Tuple operator()(Tuple x, Tuple y) const { using namespace thrust; return make_tuple(get<0>(x) + get<0>(y), get<1>(x) + get<1>(y)); } }; // end TuplePlus template struct TestZipIteratorReduceByKey { void operator()(const size_t n) { using namespace thrust; host_vector h_data0 = unittest::random_integers(n); host_vector h_data1 = unittest::random_integers(n); host_vector h_data2 = unittest::random_integers(n); device_vector d_data0 = h_data0; device_vector d_data1 = h_data1; device_vector d_data2 = h_data2; typedef tuple Tuple; // integer key, tuple value { host_vector h_data3(n,0); host_vector h_data4(n,0); host_vector h_data5(n,0); device_vector d_data3(n,0); device_vector d_data4(n,0); device_vector d_data5(n,0); // run on host reduce_by_key ( h_data0.begin(), h_data0.end(), make_zip_iterator(make_tuple(h_data1.begin(), h_data2.begin())), h_data3.begin(), make_zip_iterator(make_tuple(h_data4.begin(), h_data5.begin())), equal_to(), TuplePlus()); // run on device reduce_by_key ( d_data0.begin(), d_data0.end(), make_zip_iterator(make_tuple(d_data1.begin(), d_data2.begin())), d_data3.begin(), make_zip_iterator(make_tuple(d_data4.begin(), d_data5.begin())), equal_to(), TuplePlus()); ASSERT_EQUAL(h_data3, d_data3); ASSERT_EQUAL(h_data4, d_data4); ASSERT_EQUAL(h_data5, d_data5); } // The tests below get miscompiled on Tesla hw for 8b types #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA if(const CUDATestDriver *driver = dynamic_cast(&UnitTestDriver::s_driver())) { if(typeid(T) == typeid(unittest::uint8_t) && driver->current_device_architecture() < 200) { KNOWN_FAILURE; } // end if } // end if #endif // tuple key, tuple value { host_vector h_data3(n,0); host_vector h_data4(n,0); host_vector h_data5(n,0); host_vector h_data6(n,0); device_vector d_data3(n,0); device_vector d_data4(n,0); device_vector d_data5(n,0); device_vector d_data6(n,0); // run on host reduce_by_key ( make_zip_iterator(make_tuple(h_data0.begin(), h_data0.begin())), make_zip_iterator(make_tuple(h_data0.end(), h_data0.end())), make_zip_iterator(make_tuple(h_data1.begin(), h_data2.begin())), make_zip_iterator(make_tuple(h_data3.begin(), h_data4.begin())), make_zip_iterator(make_tuple(h_data5.begin(), h_data6.begin())), equal_to(), TuplePlus()); // run on device reduce_by_key ( make_zip_iterator(make_tuple(d_data0.begin(), d_data0.begin())), make_zip_iterator(make_tuple(d_data0.end(), d_data0.end())), make_zip_iterator(make_tuple(d_data1.begin(), d_data2.begin())), make_zip_iterator(make_tuple(d_data3.begin(), d_data4.begin())), make_zip_iterator(make_tuple(d_data5.begin(), d_data6.begin())), equal_to(), TuplePlus()); ASSERT_EQUAL(h_data3, d_data3); ASSERT_EQUAL(h_data4, d_data4); ASSERT_EQUAL(h_data5, d_data5); ASSERT_EQUAL(h_data6, d_data6); } } }; VariableUnitTest TestZipIteratorReduceByKeyInstance;