#include #include #include #include template void sort_by_key(my_system &system, RandomAccessIterator1, RandomAccessIterator1, RandomAccessIterator2) { system.validate_dispatch(); } void TestSortByKeyDispatchExplicit() { thrust::device_vector vec(1); my_system sys(0); thrust::sort_by_key(sys, vec.begin(), vec.begin(), vec.begin()); ASSERT_EQUAL(true, sys.is_valid()); } DECLARE_UNITTEST(TestSortByKeyDispatchExplicit); template void sort_by_key(my_tag, RandomAccessIterator1 keys_first, RandomAccessIterator1, RandomAccessIterator2) { *keys_first = 13; } void TestSortByKeyDispatchImplicit() { thrust::device_vector vec(1); thrust::sort_by_key(thrust::retag(vec.begin()), thrust::retag(vec.begin()), thrust::retag(vec.begin())); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestSortByKeyDispatchImplicit); template void InitializeSimpleKeyValueSortTest(Vector& unsorted_keys, Vector& unsorted_values, Vector& sorted_keys, Vector& sorted_values) { unsorted_keys.resize(7); unsorted_values.resize(7); unsorted_keys[0] = 1; unsorted_values[0] = 0; unsorted_keys[1] = 3; unsorted_values[1] = 1; unsorted_keys[2] = 6; unsorted_values[2] = 2; unsorted_keys[3] = 5; unsorted_values[3] = 3; unsorted_keys[4] = 2; unsorted_values[4] = 4; unsorted_keys[5] = 0; unsorted_values[5] = 5; unsorted_keys[6] = 4; unsorted_values[6] = 6; sorted_keys.resize(7); sorted_values.resize(7); sorted_keys[0] = 0; sorted_values[1] = 0; sorted_keys[1] = 1; sorted_values[3] = 1; sorted_keys[2] = 2; sorted_values[6] = 2; sorted_keys[3] = 3; sorted_values[5] = 3; sorted_keys[4] = 4; sorted_values[2] = 4; sorted_keys[5] = 5; sorted_values[0] = 5; sorted_keys[6] = 6; sorted_values[4] = 6; } template void TestSortByKeySimple(void) { Vector unsorted_keys, unsorted_values; Vector sorted_keys, sorted_values; InitializeSimpleKeyValueSortTest(unsorted_keys, unsorted_values, sorted_keys, sorted_values); thrust::sort_by_key(unsorted_keys.begin(), unsorted_keys.end(), unsorted_values.begin()); ASSERT_EQUAL(unsorted_keys, sorted_keys); ASSERT_EQUAL(unsorted_values, sorted_values); } DECLARE_VECTOR_UNITTEST(TestSortByKeySimple); template void TestSortAscendingKeyValue(const size_t n) { thrust::host_vector h_keys = unittest::random_integers(n); thrust::device_vector d_keys = h_keys; thrust::host_vector h_values = h_keys; thrust::device_vector d_values = d_keys; thrust::sort_by_key(h_keys.begin(), h_keys.end(), h_values.begin(), thrust::less()); thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin(), thrust::less()); ASSERT_EQUAL(h_keys, d_keys); ASSERT_EQUAL(h_values, d_values); } DECLARE_VARIABLE_UNITTEST(TestSortAscendingKeyValue); template void TestSortDescendingKeyValue(const size_t n) { thrust::host_vector h_keys = unittest::random_integers(n); thrust::device_vector d_keys = h_keys; thrust::host_vector h_values = h_keys; thrust::device_vector d_values = d_keys; thrust::sort_by_key(h_keys.begin(), h_keys.end(), h_values.begin(), thrust::greater()); thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin(), thrust::greater()); ASSERT_EQUAL(h_keys, d_keys); ASSERT_EQUAL(h_values, d_values); } DECLARE_VARIABLE_UNITTEST(TestSortDescendingKeyValue); void TestSortByKeyBool(void) { const size_t n = 10027; thrust::host_vector h_keys = unittest::random_integers(n); thrust::host_vector h_values = unittest::random_integers(n); thrust::device_vector d_keys = h_keys; thrust::device_vector d_values = h_values; thrust::sort_by_key(h_keys.begin(), h_keys.end(), h_values.begin()); thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin()); ASSERT_EQUAL(h_keys, d_keys); ASSERT_EQUAL(h_values, d_values); } DECLARE_UNITTEST(TestSortByKeyBool); void TestSortByKeyBoolDescending(void) { const size_t n = 10027; thrust::host_vector h_keys = unittest::random_integers(n); thrust::host_vector h_values = unittest::random_integers(n); thrust::device_vector d_keys = h_keys; thrust::device_vector d_values = h_values; thrust::sort_by_key(h_keys.begin(), h_keys.end(), h_values.begin(), thrust::greater()); thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin(), thrust::greater()); ASSERT_EQUAL(h_keys, d_keys); ASSERT_EQUAL(h_values, d_values); } DECLARE_UNITTEST(TestSortByKeyBoolDescending);