#include #include #include #include #include template ForwardIterator uninitialized_copy(my_system& system, InputIterator, InputIterator, ForwardIterator result) { system.validate_dispatch(); return result; } void TestUninitializedCopyDispatchExplicit() { thrust::device_vector vec(1); my_system sys(0); thrust::uninitialized_copy(sys, vec.begin(), vec.begin(), vec.begin()); ASSERT_EQUAL(true, sys.is_valid()); } DECLARE_UNITTEST(TestUninitializedCopyDispatchExplicit); template ForwardIterator uninitialized_copy(my_tag, InputIterator, InputIterator, ForwardIterator result) { *result = 13; return result; } void TestUninitializedCopyDispatchImplicit() { thrust::device_vector vec(1); thrust::uninitialized_copy( thrust::retag(vec.begin()), thrust::retag(vec.begin()), thrust::retag(vec.begin())); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestUninitializedCopyDispatchImplicit); template ForwardIterator uninitialized_copy_n(my_system& system, InputIterator, Size, ForwardIterator result) { system.validate_dispatch(); return result; } void TestUninitializedCopyNDispatchExplicit() { thrust::device_vector vec(1); my_system sys(0); thrust::uninitialized_copy_n(sys, vec.begin(), vec.size(), vec.begin()); ASSERT_EQUAL(true, sys.is_valid()); } DECLARE_UNITTEST(TestUninitializedCopyNDispatchExplicit); template ForwardIterator uninitialized_copy_n(my_tag, InputIterator, Size, ForwardIterator result) { *result = 13; return result; } void TestUninitializedCopyNDispatchImplicit() { thrust::device_vector vec(1); thrust::uninitialized_copy_n(thrust::retag(vec.begin()), vec.size(), thrust::retag(vec.begin())); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestUninitializedCopyNDispatchImplicit); template void TestUninitializedCopySimplePOD() { Vector v1{0, 1, 2, 3, 4}; // copy to Vector Vector v2(5); thrust::uninitialized_copy(v1.begin(), v1.end(), v2.begin()); Vector ref{0, 1, 2, 3, 4}; ASSERT_EQUAL(v2, ref); } DECLARE_VECTOR_UNITTEST(TestUninitializedCopySimplePOD); template void TestUninitializedCopyNSimplePOD() { Vector v1{0, 1, 2, 3, 4}; // copy to Vector Vector v2(5); thrust::uninitialized_copy_n(v1.begin(), v1.size(), v2.begin()); Vector ref{0, 1, 2, 3, 4}; ASSERT_EQUAL(v2, ref); } DECLARE_VECTOR_UNITTEST(TestUninitializedCopyNSimplePOD); struct CopyConstructTest { CopyConstructTest() = default; _CCCL_HOST_DEVICE CopyConstructTest(const CopyConstructTest&) { NV_IF_TARGET(NV_IS_DEVICE, (copy_constructed_on_device = true; copy_constructed_on_host = false;), (copy_constructed_on_device = false; copy_constructed_on_host = true;)); } CopyConstructTest& operator=(const CopyConstructTest&) = default; bool copy_constructed_on_host{false}; bool copy_constructed_on_device{false}; }; struct TestUninitializedCopyNonPODDevice { void operator()(const size_t) { using T = CopyConstructTest; thrust::device_vector v1(5), v2(5); T x; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); x = v1[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); thrust::uninitialized_copy(v1.begin(), v1.end(), v2.begin()); x = v2[0]; ASSERT_EQUAL(true, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); } }; DECLARE_UNITTEST(TestUninitializedCopyNonPODDevice); struct TestUninitializedCopyNNonPODDevice { void operator()(const size_t) { using T = CopyConstructTest; thrust::device_vector v1(5), v2(5); T x; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); x = v1[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); thrust::uninitialized_copy_n(v1.begin(), v1.size(), v2.begin()); x = v2[0]; ASSERT_EQUAL(true, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); } }; DECLARE_UNITTEST(TestUninitializedCopyNNonPODDevice); struct TestUninitializedCopyNonPODHost { void operator()(const size_t) { using T = CopyConstructTest; thrust::host_vector v1(5), v2(5); T x; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); x = v1[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); thrust::uninitialized_copy(v1.begin(), v1.end(), v2.begin()); x = v2[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(true, x.copy_constructed_on_host); } }; DECLARE_UNITTEST(TestUninitializedCopyNonPODHost); struct TestUninitializedCopyNNonPODHost { void operator()(const size_t) { using T = CopyConstructTest; thrust::host_vector v1(5), v2(5); T x; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); x = v1[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(false, x.copy_constructed_on_host); thrust::uninitialized_copy_n(v1.begin(), v1.size(), v2.begin()); x = v2[0]; ASSERT_EQUAL(false, x.copy_constructed_on_device); ASSERT_EQUAL(true, x.copy_constructed_on_host); } }; DECLARE_UNITTEST(TestUninitializedCopyNNonPODHost);