#include #include #include template struct equal_to_value_pred { T value; equal_to_value_pred(T value) : value(value) {} __host__ __device__ bool operator()(T v) const { return v == value; } }; template struct not_equal_to_value_pred { T value; not_equal_to_value_pred(T value) : value(value) {} __host__ __device__ bool operator()(T v) const { return v != value; } }; template struct less_than_value_pred { T value; less_than_value_pred(T value) : value(value) {} __host__ __device__ bool operator()(T v) const { return v < value; } }; template __global__ void find_kernel(ExecutionPolicy exec, Iterator first, Iterator last, T value, Iterator2 result) { *result = thrust::find(exec, first, last, value); } template void TestFindDevice(ExecutionPolicy exec) { size_t n = 100; thrust::host_vector h_data = unittest::random_integers(n); thrust::device_vector d_data = h_data; typename thrust::host_vector::iterator h_iter; typedef typename thrust::device_vector::iterator iter_type; thrust::device_vector d_result(1); h_iter = thrust::find(h_data.begin(), h_data.end(), int(0)); find_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), int(0), d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); for(size_t i = 1; i < n; i *= 2) { int sample = h_data[i]; h_iter = thrust::find(h_data.begin(), h_data.end(), sample); find_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), sample, d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); } } void TestFindDeviceSeq() { TestFindDevice(thrust::seq); }; DECLARE_UNITTEST(TestFindDeviceSeq); void TestFindDeviceDevice() { TestFindDevice(thrust::device); }; DECLARE_UNITTEST(TestFindDeviceDevice); template __global__ void find_if_kernel(ExecutionPolicy exec, Iterator first, Iterator last, Predicate pred, Iterator2 result) { *result = thrust::find_if(exec, first, last, pred); } template void TestFindIfDevice(ExecutionPolicy exec) { size_t n = 100; thrust::host_vector h_data = unittest::random_integers(n); thrust::device_vector d_data = h_data; typename thrust::host_vector::iterator h_iter; typedef typename thrust::device_vector::iterator iter_type; thrust::device_vector d_result(1); h_iter = thrust::find_if(h_data.begin(), h_data.end(), equal_to_value_pred(0)); find_if_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), equal_to_value_pred(0), d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); for (size_t i = 1; i < n; i *= 2) { int sample = h_data[i]; h_iter = thrust::find_if(h_data.begin(), h_data.end(), equal_to_value_pred(sample)); find_if_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), equal_to_value_pred(sample), d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); } } void TestFindIfDeviceSeq() { TestFindIfDevice(thrust::seq); }; DECLARE_UNITTEST(TestFindIfDeviceSeq); void TestFindIfDeviceDevice() { TestFindIfDevice(thrust::device); }; DECLARE_UNITTEST(TestFindIfDeviceDevice); template __global__ void find_if_not_kernel(ExecutionPolicy exec, Iterator first, Iterator last, Predicate pred, Iterator2 result) { *result = thrust::find_if_not(exec, first, last, pred); } template void TestFindIfNotDevice(ExecutionPolicy exec) { size_t n = 100; thrust::host_vector h_data = unittest::random_integers(n); thrust::device_vector d_data = h_data; typename thrust::host_vector::iterator h_iter; typedef typename thrust::device_vector::iterator iter_type; thrust::device_vector d_result(1); h_iter = thrust::find_if_not(h_data.begin(), h_data.end(), not_equal_to_value_pred(0)); find_if_not_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), not_equal_to_value_pred(0), d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); for(size_t i = 1; i < n; i *= 2) { int sample = h_data[i]; h_iter = thrust::find_if_not(h_data.begin(), h_data.end(), not_equal_to_value_pred(sample)); find_if_not_kernel<<<1,1>>>(exec, d_data.begin(), d_data.end(), not_equal_to_value_pred(sample), d_result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(h_iter - h_data.begin(), (iter_type)d_result[0] - d_data.begin()); } } void TestFindIfNotDeviceSeq() { TestFindIfNotDevice(thrust::seq); }; DECLARE_UNITTEST(TestFindIfNotDeviceSeq); void TestFindIfNotDeviceDevice() { TestFindIfNotDevice(thrust::device); }; DECLARE_UNITTEST(TestFindIfNotDeviceDevice); void TestFindCudaStreams() { thrust::device_vector vec(5); vec[0] = 1; vec[1] = 2; vec[2] = 3; vec[3] = 3; vec[4] = 5; cudaStream_t s; cudaStreamCreate(&s); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 0) - vec.begin(), 5); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 1) - vec.begin(), 0); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 2) - vec.begin(), 1); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 3) - vec.begin(), 2); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 4) - vec.begin(), 5); ASSERT_EQUAL(thrust::find(thrust::cuda::par.on(s), vec.begin(), vec.end(), 5) - vec.begin(), 4); cudaStreamDestroy(s); } DECLARE_UNITTEST(TestFindCudaStreams);