#include #include #include #include #include #include THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_BEGIN template #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA __global__ #endif void simple_copy_on_device(Iterator1 first1, Iterator1 last1, Iterator2 first2) { while(first1 != last1) *(first2++) = *(first1++); } template void simple_copy(Iterator1 first1, Iterator1 last1, Iterator2 first2) { #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA simple_copy_on_device<<<1,1>>>(first1, last1, first2); #else simple_copy_on_device(first1, last1, first2); #endif } void TestDeviceDereferenceDeviceVectorIterator(void) { thrust::device_vector input = unittest::random_integers(100); thrust::device_vector output(input.size(), 0); simple_copy(input.begin(), input.end(), output.begin()); ASSERT_EQUAL(input, output); } DECLARE_UNITTEST(TestDeviceDereferenceDeviceVectorIterator); void TestDeviceDereferenceDevicePtr(void) { thrust::device_vector input = unittest::random_integers(100); thrust::device_vector output(input.size(), 0); thrust::device_ptr _first1 = &input[0]; thrust::device_ptr _last1 = _first1 + input.size(); thrust::device_ptr _first2 = &output[0]; simple_copy(_first1, _last1, _first2); ASSERT_EQUAL(input, output); } DECLARE_UNITTEST(TestDeviceDereferenceDevicePtr); void TestDeviceDereferenceTransformIterator(void) { thrust::device_vector input = unittest::random_integers(100); thrust::device_vector output(input.size(), 0); simple_copy(thrust::make_transform_iterator(input.begin(), thrust::identity()), thrust::make_transform_iterator(input.end (), thrust::identity()), output.begin()); ASSERT_EQUAL(input, output); } DECLARE_UNITTEST(TestDeviceDereferenceTransformIterator); void TestDeviceDereferenceCountingIterator(void) { thrust::counting_iterator first(1); thrust::counting_iterator last(6); thrust::device_vector output(5); simple_copy(first, last, output.begin()); ASSERT_EQUAL(output[0], 1); ASSERT_EQUAL(output[1], 2); ASSERT_EQUAL(output[2], 3); ASSERT_EQUAL(output[3], 4); ASSERT_EQUAL(output[4], 5); } DECLARE_UNITTEST(TestDeviceDereferenceCountingIterator); void TestDeviceDereferenceTransformedCountingIterator(void) { thrust::counting_iterator first(1); thrust::counting_iterator last(6); thrust::device_vector output(5); simple_copy(thrust::make_transform_iterator(first, thrust::negate()), thrust::make_transform_iterator(last, thrust::negate()), output.begin()); ASSERT_EQUAL(output[0], -1); ASSERT_EQUAL(output[1], -2); ASSERT_EQUAL(output[2], -3); ASSERT_EQUAL(output[3], -4); ASSERT_EQUAL(output[4], -5); } DECLARE_UNITTEST(TestDeviceDereferenceTransformedCountingIterator); THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_END