#include #include #include #include #ifdef THRUST_TEST_DEVICE_SIDE template __global__ void is_partitioned_kernel(ExecutionPolicy exec, Iterator first, Iterator last, Predicate pred, Iterator2 result) { *result = thrust::is_partitioned(exec, first, last, pred); } template struct is_even { _CCCL_HOST_DEVICE bool operator()(T x) const { return ((int) x % 2) == 0; } }; template void TestIsPartitionedDevice(ExecutionPolicy exec) { size_t n = 1000; n = ::cuda::std::max(n, 2); thrust::device_vector v = unittest::random_integers(n); thrust::device_vector result(1); v[0] = 1; v[1] = 0; is_partitioned_kernel<<<1, 1>>>(exec, v.begin(), v.end(), is_even(), result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(false, result[0]); thrust::partition(v.begin(), v.end(), is_even()); is_partitioned_kernel<<<1, 1>>>(exec, v.begin(), v.end(), is_even(), result.begin()); { cudaError_t const err = cudaDeviceSynchronize(); ASSERT_EQUAL(cudaSuccess, err); } ASSERT_EQUAL(true, result[0]); } void TestIsPartitionedDeviceSeq() { TestIsPartitionedDevice(thrust::seq); } DECLARE_UNITTEST(TestIsPartitionedDeviceSeq); void TestIsPartitionedDeviceDevice() { TestIsPartitionedDevice(thrust::device); } DECLARE_UNITTEST(TestIsPartitionedDeviceDevice); #endif void TestIsPartitionedCudaStreams() { thrust::device_vector v(4); v[0] = 1; v[1] = 1; v[2] = 1; v[3] = 0; cudaStream_t s; cudaStreamCreate(&s); // empty partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin(), v.begin(), ::cuda::std::identity{})); // one element true partition ASSERT_EQUAL_QUIET( true, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin(), v.begin() + 1, ::cuda::std::identity{})); // just true partition ASSERT_EQUAL_QUIET( true, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin(), v.begin() + 2, ::cuda::std::identity{})); // both true & false partitions ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin(), v.end(), ::cuda::std::identity{})); // one element false partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin() + 3, v.end(), ::cuda::std::identity{})); v[0] = 1; v[1] = 0; v[2] = 1; v[3] = 1; // not partitioned ASSERT_EQUAL_QUIET(false, thrust::is_partitioned(thrust::cuda::par.on(s), v.begin(), v.end(), ::cuda::std::identity{})); cudaStreamDestroy(s); } DECLARE_UNITTEST(TestIsPartitionedCudaStreams); template struct is_even_non_const { _CCCL_HOST_DEVICE bool operator()(T x) // no const { return ((int) x % 2) == 0; } }; void TestIsPartitionedWithNonConstPredicate() { thrust::device_vector partitioned = {0, 2, 4, 1, 3, 5}; thrust::device_vector unpartitioned = {0, 1, 2, 3}; ASSERT_EQUAL_QUIET( true, thrust::is_partitioned(thrust::cuda::par, partitioned.begin(), partitioned.end(), is_even_non_const{})); ASSERT_EQUAL_QUIET( false, thrust::is_partitioned(thrust::cuda::par, unpartitioned.begin(), unpartitioned.end(), is_even_non_const{})); } DECLARE_UNITTEST(TestIsPartitionedWithNonConstPredicate);