Introduction TODO
Thrust is not CUDA specific, it does not allow the programmers to interfere CUDA specific details (the number of threads, cudaStream_t parameters etc.). Because of that, the primitives can not be configured for a specific GPU architecture.
Overview TODO
Architecture TODO
APIs TODO
Containers TODO
Algorithms TODO
Copying Gathering Reference Page
thrust::gather 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 template <typename DerivedPolicy, typename InputIterator, typename RandomAccessIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::gather (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator map_first, InputIterator map_last, RandomAccessIterator input_first, OutputIterator result) ;template <typename InputIterator, typename RandomAccessIterator, typename OutputIterator> OutputIterator thrust::gather (InputIterator map_first, InputIterator map_last, RandomAccessIterator input_first, OutputIterator result) ;
thrust::gather_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator, typename RandomAccessIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::gather (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator map_first, InputIterator map_last, RandomAccessIterator input_first, OutputIterator result) ;template <typename InputIterator, typename RandomAccessIterator, typename OutputIterator> OutputIterator thrust::gather (InputIterator map_first, InputIterator map_last, RandomAccessIterator input_first, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename RandomAccessIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::gather_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename RandomAccessIterator, typename OutputIterator> OutputIterator thrust::gather_if (InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename RandomAccessIterator, typename OutputIterator, typename Predicate> __host__ __device__ OutputIterator thrust::gather_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename RandomAccessIterator, typename OutputIterator, typename Predicate> OutputIterator thrust::gather_if (InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result, Predicate pred) ;
Scattering Reference Page
thrust::scatter thrust::scatter
copies elements from a source range into an output array according to a map. For each iterator i
in the range [first, last)
, the value *i
is assigned to output[*(map + (i - first))]
. The output iterator must permit random access. If the same index appears more than once in the range [map, map + (last - first))
, the result is undefined.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename RandomAccessIterator> __host__ __device__ void thrust::scatter (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 map, RandomAccessIterator result) ;template <typename InputIterator1, typename InputIterator2, typename RandomAccessIterator> void thrust::scatter (InputIterator1 first, InputIterator1 last, InputIterator2 map, RandomAccessIterator result) ;
The following code demonstrates how to use thrust::scatter
to reorder a range using the thrust::device
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <thrust/scatter.h> #include <thrust/device_vector.h> #include <thrust/execution_policy.h> int values[10 ] = {1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 };thrust::device_vector<int > d_values (values, values + 10 ) ;int map[10 ] = {0 , 5 , 1 , 6 , 2 , 7 , 3 , 8 , 4 , 9 };thrust::device_vector<int > d_map (map, map + 10 ) ;thrust::device_vector<int > d_output (10 ) ;thrust::scatter (thrust::device, d_values.begin (), d_values.end (), d_map.begin (), d_output.begin ());
thrust::scatter_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename RandomAccessIterator> __host__ __device__ void thrust::scatter_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 map, InputIterator3 stencil, RandomAccessIterator output) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename RandomAccessIterator> void thrust::scatter_if (InputIterator1 first, InputIterator1 last, InputIterator2 map, InputIterator3 stencil, RandomAccessIterator output) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename RandomAccessIterator, typename Predicate> __host__ __device__ void thrust::scatter_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 map, InputIterator3 stencil, RandomAccessIterator output, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename RandomAccessIterator, typename Predicate> void thrust::scatter_if (InputIterator1 first, InputIterator1 last, InputIterator2 map, InputIterator3 stencil, RandomAccessIterator output, Predicate pred) ;
Copying Reference Page
thrust::copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result) ;template <typename InputIterator, typename OutputIterator> OutputIterator thrust::copy (InputIterator first, InputIterator last, OutputIterator result) ;
thrust::copy_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename InputIterator, typename Size, typename OutputIterator> __host__ __device__ OutputIterator thrust::copy_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, Size n, OutputIterator result) ;template <typename InputIterator, typename Size, typename OutputIterator> OutputIterator thrust::copy_n (InputIterator first, Size n, OutputIterator result) ;
thrust::swap_ranges thrust::swap_ranges
swaps each of the elements in the range [first1, last1)
with the corresponding element in the range [first2, first2 + (last1 - first1))
. That is, for each integer n
such that 0 <= n < (last1 - first1)
, it swaps *(first1 + n)
and *(first2 + n)
. The return value is first2 + (lsat1 - first1)
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator1, typename ForwardIterator2> __host__ __device__ ForwardIterator2 thrust::swap_ranges (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2) ;template <typename ForwardIterator1, typename ForwardIterator2> ForwardIterator2 thrust::swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2) ;
The following code snippet demonstrates how to use swap_ranges
to swap the contents of two thrust::device_vectors
using the thrust::device
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <thrust/swap.h> #include <thrust/device_vector.h> #include <thrust/execution_policy.h> thrust::device_vector<int > v1 (2 ) , v2 (2 ) ;v1[0 ] = 1 ; v1[1 ] = 2 ; v2[0 ] = 3 ; v2[1 ] = 4 ; thrust::swap_ranges (thrust::device, v1.begin (), v1.end (), v2.begin ());
thrust::uninitialized_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::uninitialized_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, ForwardIterator result) ;template <typename InputIterator, typename ForwardIterator> ForwardIterator thrust::uninitialized_copy (InputIterator first, InputIterator last, ForwardIterator result) ;
thrust::uninitialized_copy_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename InputIterator, typename Size, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::uninitialized_copy_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, Size n, ForwardIterator result) ;template <typename InputIterator, typename Size, typename ForwardIterator> ForwardIterator thrust::uninitialized_copy_n (InputIterator first, Size n, ForwardIterator result) ;
Merging Reference Page
thrust::merge thrust::merge
combines two sorted ranges [first1, last1)
and [first2, last2)
into a single sorted range. That is, it copies from [first1, last1)
and [first2, last2)
into [result, result + (last1 - first1) + (last2 - first2))
such taht the resulting range is in ascending order. merge
is stable, meaning both that the relative order of elements within each input range is preserved, and that for equivalent elements in both input ranges the element from the first range precedes the element from the second. The return value is result + (last1 - first1) + (last2 - first2)
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::merge (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::merge (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> __host__ __device__ OutputIterator thrust::merge (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> OutputIterator thrust::merge (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;
The following code snippet demonstrates how to use merge
to compute the merger of two sorted sets of integers using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <thrust/merge.h> #include <thrust/execution_policy.h> int A1[6 ] = {1 , 3 , 5 , 7 , 9 , 11 };int A2[7 ] = {1 , 1 , 2 , 3 , 5 , 8 , 13 };int result[13 ];int *result_end = thrust::merge (thrust::host, A1, A1 + 6 , A2, A2 + 7 , result);
thrust::merge_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::merge_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::merge_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename Compare> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::merge_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, Compare comp) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> thrust::pair< OutputIterator1, OutputIterator2 > thrust::merge_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;
Prefix Sums Segmented Prefix Sums Reference Page
thrust::inclusive_scan_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::inclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::inclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryPredicate> __host__ __device__ OutputIterator thrust::inclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryPredicate binary_pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryPredicate> OutputIterator thrust::inclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryPredicate binary_pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryPredicate, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::inclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryPredicate binary_pred, AssociativeOperator binary_op) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryPredicate, typename AssociativeOperator> OutputIterator thrust::inclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryPredicate binary_pred, AssociativeOperator binary_op) ;
thrust::exclusive_scan_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::exclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::exclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T> __host__ __device__ OutputIterator thrust::exclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T> OutputIterator thrust::exclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T, typename BinaryPredicate> __host__ __device__ OutputIterator thrust::exclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init, BinaryPredicate binary_pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T, typename BinaryPredicate> OutputIterator thrust::exclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init, BinaryPredicate binary_pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T, typename BinaryPredicate, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::exclusive_scan_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init, BinaryPredicate binary_pred, AssociativeOperator binary_op) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename T, typename BinaryPredicate, typename AssociativeOperator> OutputIterator thrust::exclusive_scan_by_key (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, T init, BinaryPredicate binary_pred, AssociativeOperator binary_op) ;
Reference Page
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename UnaryFunction, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::transform_inclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, UnaryFunction unary_op, AssociativeOperator binary_op) ;template <typename InputIterator, typename OutputIterator, typename UnaryFunction, typename AssociativeOperator> OutputIterator thrust::transform_inclusive_scan (InputIterator first, InputIterator last, OutputIterator result, UnaryFunction unary_op, AssociativeOperator binary_op) ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename UnaryFunction, typename T, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::transform_exclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, UnaryFunction unary_op, T init, AssociativeOperator binary_op) ;template <typename InputIterator, typename OutputIterator, typename UnaryFunction, typename T, typename AssociativeOperator> OutputIterator thrust::transform_exclusive_scan (InputIterator first, InputIterator last, OutputIterator result, UnaryFunction unary_op, T init, AssociativeOperator binary_op) ;
Group Prefix Sums Reference Page
thrust::inclusive_scan inclusive_scan
computes an inclusive prefix sum operation. The term ‘inclusive’ means each result includes the corresponding input operand in the partial sum. More precisely, *first
is assigned to *result
and the sum of *first
and *(first ~ 1)
is assigned to *(result + 1)
, and so on.thrust::inclusive_scan
is similar to std::partial_sum
in the STL. The primary difference between the two functions is that std::parital_sum
guarantees a serial summation order, while thrust::inclusive_scan
requires associativity of the binary operation to parallelize the prefix sum. Results are not deterministic for pseudo-associative operators (e.g. addition of floating-point types). Results for pseudo-associative operators may vary from run to run. The algorithm’s execution is parallelized as determined by exec
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::inclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result) ;template <typename InputIterator, typename OutputIterator> OutputIterator thrust::inclusive_scan (InputIterator first, InputIterator last, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::inclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, AssociativeOperator binary_op) ;template <typename InputIterator, typename OutputIterator, typename AssociativeOperator> OutputIterator thrust::inclusive_scan (InputIterator first, InputIterator last, OutputIterator result, AssociativeOperator binary_op) ;
The following code snippet demonstrates how to use inclusive_scan
to compute an in-place p
thrust::exclusive_scan 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::exclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result) ;template <typename InputIterator, typename OutputIterator> OutputIterator thrust::exclusive_scan (InputIterator first, InputIterator last, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename T> __host__ __device__ OutputIterator thrust::exclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, T init) ;template <typename InputIterator, typename OutputIterator, typename T> OutputIterator thrust::exclusive_scan (InputIterator first, InputIterator last, OutputIterator result, T init) ;template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename T, typename AssociativeOperator> __host__ __device__ OutputIterator thrust::exclusive_scan (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, T init, AssociativeOperator binary_op) ;template <typename InputIterator, typename OutputIterator, typename T, typename AssociativeOperator> OutputIterator thrust::exclusive_scan (InputIterator first, InputIterator last, OutputIterator result, T init, AssociativeOperator binary_op) ;
Reductions Comparisons Reference Page
thrust::equal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2> __host__ __device__ bool thrust::equal (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) ;template <typename InputIterator1, typename InputIterator2> bool thrust::equal (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename BinaryPredicate> __host__ __device__ bool thrust::equal (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred) ;template <typename InputIterator1, typename InputIterator2, typename BinaryPredicate> bool thrust::equal (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred) ;
Counting Reference Page
thrust::count 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename EqualityComparable> __host__ __device__ thrust::iterator_traits< InputIterator >::difference_type thrust::count (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, const EqualityComparable & value) ;template <typename InputIterator, typename EqualityComparable> thrust::iterator_traits< InputIterator >::difference_type thrust::count (InputIterator first, InputIterator last, const EqualityComparable & value) ;
thrust::count_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ thrust::iterator_traits< InputIterator >::difference_type thrust::count_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> thrust::iterator_traits< InputIterator >::difference_type thrust::count_if (InputIterator first, InputIterator last, Predicate pred) ;
Extrema Reference Page
thrust::min_element 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::min_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>ForwardIterator thrust::min_element (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename BinaryPredicate> __host__ __device__ ForwardIterator thrust::min_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;template <typename ForwardIterator, typename BinaryPredicate> ForwardIterator thrust::min_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;
thrust::max_element 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::max_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>ForwardIterator thrust::max_element (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename BinaryPredicate> __host__ __device__ ForwardIterator thrust::max_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;template <typename ForwardIterator, typename BinaryPredicate> ForwardIterator thrust::max_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;
thrust::minmax_element 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ thrust::pair< ForwardIterator, ForwardIterator > thrust::minmax_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>thrust::pair< ForwardIterator, ForwardIterator > thrust::minmax_element (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename BinaryPredicate> __host__ __device__ thrust::pair< ForwardIterator, ForwardIterator > thrust::minmax_element (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;template <typename ForwardIterator, typename BinaryPredicate> thrust::pair< ForwardIterator, ForwardIterator > thrust::minmax_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp) ;
Logical Reference Page
thrust::all_of 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ bool thrust::all_of (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> bool thrust::all_of (InputIterator first, InputIterator last, Predicate pred) ;
thrust::any_of 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ bool thrust::any_of (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> bool thrust::any_of (InputIterator first, InputIterator last, Predicate pred) ;
thrust::none_of 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ bool thrust::none_of (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> bool thrust::none_of (InputIterator first, InputIterator last, Predicate pred) ;
Predicates Reference Page
thrust::is_partitioned thrust::is_partitioned
returns true
if the given range is partitioned with respect to a predicate, and false
otherwise. 是否所有满足predicates的元素都出现在不满足 predicates的元素前面。 Specifically, thrust::is_partitioned
returns true
if [first, last)
is empty of if [first, last)
is partitioned by pred
, i.e. if all elements that satisfy pred
appear before those that do not.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ bool thrust::is_partitioned (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> bool thrust::is_partitioned (InputIterator first, InputIterator last, Predicate pred) ;
The following code demonstrates how to use thrust::is_partitioned
:
1 2 3 4 5 6 7 8 9 10 11 12 #include <thrust/partition.h> #include <thrust/execution_policy.h> struct is_even { __host__ __device__ bool operator () (const int &x) { return (x % 2 ) == 0 ; }}; int A[] = {2 , 4 , 6 , 8 , 19 , 1 , 3 , 5 , 7 , 9 };int B[] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };thrust::is_partitioned (thrust::host, A, A + 10 , is_even ()); thrust::is_partitioned (thrust::host, B, B + 10 , is_even ());
thrust::is_sorted thrust::is_sorted
returns true
if the range [first, last)
is sorted in ascending order, and false
otherwise.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ bool thrust::is_sorted (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>bool thrust::is_sorted (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename Compare> __host__ __device__ bool thrust::is_sorted (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Compare comp) ;template <typename ForwardIterator, typename Compare> bool thrust::is_sorted (ForwardIterator first, ForwardIterator last, Compare comp) ;
The following code demonstrates how to use thrust::is_sorted
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <thrust/sort.h> #include <thrust/device_vector.h> #include <thrust/sort.h> #include <thrust/execution_policy.h> thrust::device_vector<int > v (6 ) ;v[0 ] = 1 ; v[1 ] = 4 ; v[2 ] = 2 ; v[3 ] = 8 ; v[4 ] = 5 ; v[5 ] = 7 ; bool result = thrust::is_sorted (thrust::device, v.begin (), v.end ());thrust::sort (v.begin (), v.end ()); result = thrust::is_sorted (thrust::device, v.begin (), v.end ());
thrust::is_sorted_until 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::is_sorted_until (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>ForwardIterator thrust::is_sorted_until (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename Compare> __host__ __device__ ForwardIterator thrust::is_sorted_until (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Compare comp) ;template <typename ForwardIterator, typename Compare> ForwardIterator thrust::is_sorted_until (ForwardIterator first, ForwardIterator last, Compare comp) ;
Reference Page
thrust::inner_product 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputType> __host__ __device__ OutputType thrust::inner_product (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputType init) ;template <typename InputIterator1, typename InputIterator2, typename OutputType> OutputType thrust::inner_product (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputType init) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputType, typename BinaryFunction1, typename BinaryFunction2> __host__ __device__ OutputType thrust::inner_product (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputType init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2) ;template <typename InputIterator1, typename InputIterator2, typename OutputType, typename BinaryFunction1, typename BinaryFunction2> OutputType thrust::inner_product (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputType init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2) ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 template <typename DerivedPolicy, typename InputIterator, typename UnaryFunction, typename OutputType, typename BinaryFunction> __host__ __device__ OutputType thrust::transform_reduce (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, UnaryFunction unary_op, OutputType init, BinaryFunction binary_op) ;template <typename InputIterator, typename UnaryFunction, typename OutputType, typename BinaryFunction> OutputType thrust::transform_reduce (InputIterator first, InputIterator last, UnaryFunction unary_op, OutputType init, BinaryFunction binary_op) ;
Reductions Reference Page
thrust::reduce 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator> __host__ __device__ thrust::iterator_traits< InputIterator >::value_type thrust::reduce (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last) ;template <typename InputIterator>thrust::iterator_traits< InputIterator >::value_type thrust::reduce (InputIterator first, InputIterator last) ;template <typename DerivedPolicy, typename InputIterator, typename T> __host__ __device__ T thrust::reduce (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, T init) ;template <typename InputIterator, typename T> T thrust::reduce (InputIterator first, InputIterator last, T init) ;template <typename DerivedPolicy, typename InputIterator, typename T, typename BinaryFunction> __host__ __device__ T thrust::reduce (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, T init, BinaryFunction binary_op) ;template <typename InputIterator, typename T, typename BinaryFunction> T thrust::reduce (InputIterator first, InputIterator last, T init, BinaryFunction binary_op) ;
thrust::reduce_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output, BinaryPredicate binary_pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output, BinaryPredicate binary_pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate, typename BinaryFunction> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output, BinaryPredicate binary_pred, BinaryFunction binary_op) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate, typename BinaryFunction> thrust::pair< OutputIterator1, OutputIterator2 > thrust::reduce_by_key (InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_output, OutputIterator2 values_output, BinaryPredicate binary_pred, BinaryFunction binary_op) ;
Reordering Partitioning Reference Page
thrust::partition 根据 Predicate 的结果来重新排列元素(true 元素在前,其余元素在后面).thrust::partition
reorders the elements [first, last)
based on the function object pred
applied to a stencil range [stencil, stencil + (last - first))
, such that all the elements whose corresponding stencil element satisfies pred
precede all the elements whose corresponding stencil element failed
Preconditions : The ranges [first, last)
and [stencil, tencil + (last - first))
shall not overlap.
Returns : An iterator referring to the first element of the second partition, that is, the sequence of the elements whose stencil elements do not satisfy pred
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::partition (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename ForwardIterator, typename Predicate> ForwardIterator thrust::partition (ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::partition (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;template <typename ForwardIterator, typename InputIterator, typename Predicate> ForwardIterator thrust::partition (ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;
thrust::partition_copy thrust::partition_copy
differs from partition
only in that the reordered sequence is written to difference output sequences, rather than in place.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename Predicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::partition_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename Predicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::partition_copy (InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename Predicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::partition_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename Predicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::partition_copy (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;
thrust::stable_partition 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::stable_partition (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename ForwardIterator, typename Predicate> ForwardIterator thrust::stable_partition (ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::stable_partition (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;template <typename ForwardIterator, typename InputIterator, typename Predicate> ForwardIterator thrust::stable_partition (ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;
thrust::stable_partition_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename Predicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::stable_partition_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename Predicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::stable_partition_copy (InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename Predicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::stable_partition_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename Predicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::stable_partition_copy (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred) ;
Shuffling Reference Page
thrust::shuffle 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename RandomIterator, typename URBG> __host__ __device__ void thrust::shuffle (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomIterator first, RandomIterator last, URBG && g) ;template <typename RandomIterator, typename URBG> __host__ __device__ void thrust::shuffle (RandomIterator first, RandomIterator last, URBG && g) ;
thrust::shuffle_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 template <typename DerivedPolicy, typename RandomIterator, typename OutputIterator, typename URBG> __host__ __device__ void thrust::shuffle_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomIterator first, RandomIterator last, OutputIterator result, URBG && g) ;template <typename RandomIterator, typename OutputIterator, typename URBG> __host__ __device__ void thrust::shuffle_copy (RandomIterator first, RandomIterator last, OutputIterator result, URBG && g) ;
Stream Compaction Reference Page
thrust::copy_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename Predicate> __host__ __device__ OutputIterator thrust::copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, Predicate pred) ;template <typename InputIterator, typename OutputIterator, typename Predicate> OutputIterator thrust::copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate> __host__ __device__ OutputIterator thrust::copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate> OutputIterator thrust::copy_if (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred) ;
thrust::remove 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ ForwardIterator thrust::remove (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value) ;template <typename ForwardIterator, typename T> ForwardIterator thrust::remove (ForwardIterator first, ForwardIterator last, const T & value) ;
thrust::remove_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename T> __host__ __device__ OutputIterator thrust::remove_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, const T & value) ;template <typename InputIterator, typename OutputIterator, typename T> OutputIterator thrust::remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T & value) ;
thrust::remove_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 template <typename DerivedPolicy, typename ForwardIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::remove_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename ForwardIterator, typename Predicate> ForwardIterator thrust::remove_if (ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename ForwardIterator, typename InputIterator, typename Predicate> ForwardIterator thrust::remove_if (ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::remove_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred) ;
thrust::remove_copy_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename Predicate> __host__ __device__ OutputIterator thrust::remove_copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, Predicate pred) ;template <typename InputIterator, typename OutputIterator, typename Predicate> OutputIterator thrust::remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate> __host__ __device__ OutputIterator thrust::remove_copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate> OutputIterator thrust::remove_copy_if (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred) ;
thrust::unique 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ ForwardIterator thrust::unique (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>ForwardIterator thrust::unique (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename BinaryPredicate> __host__ __device__ ForwardIterator thrust::unique (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred) ;template <typename ForwardIterator, typename BinaryPredicate> ForwardIterator thrust::unique (ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred) ;
thrust::unique_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::unique_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result) ;template <typename InputIterator, typename OutputIterator> OutputIterator thrust::unique_copy (InputIterator first, InputIterator last, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename BinaryPredicate> __host__ __device__ OutputIterator thrust::unique_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred) ;template <typename InputIterator, typename OutputIterator, typename BinaryPredicate> OutputIterator thrust::unique_copy (InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred) ;
thrust::unique_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator1, typename ForwardIterator2> __host__ __device__ thrust::pair< ForwardIterator1, ForwardIterator2 > thrust::unique_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator1 keys_first, ForwardIterator1 keys_last, ForwardIterator2 values_first) ;template <typename ForwardIterator1, typename ForwardIterator2> thrust::pair< ForwardIterator1, ForwardIterator2 > thrust::unique_by_key (ForwardIterator1 keys_first, ForwardIterator1 keys_last, ForwardIterator2 values_first) ;template <typename DerivedPolicy, typename ForwardIterator1, typename ForwardIterator2, typename BinaryPredicate> __host__ __device__ thrust::pair< ForwardIterator1, ForwardIterator2 > thrust::unique_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator1 keys_first, ForwardIterator1 keys_last, ForwardIterator2 values_first, BinaryPredicate binary_pred) ;template <typename ForwardIterator1, typename ForwardIterator2, typename BinaryPredicate> thrust::pair< ForwardIterator1, ForwardIterator2 > thrust::unique_by_key (ForwardIterator1 keys_first, ForwardIterator1 keys_last, ForwardIterator2 values_first, BinaryPredicate binary_pred) ;
thrust::unique_by_key_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::unique_by_key_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::unique_by_key_copy (InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::unique_by_key_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_result, OutputIterator2 values_result, BinaryPredicate binary_pred) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator1, typename OutputIterator2, typename BinaryPredicate> thrust::pair< OutputIterator1, OutputIterator2 > thrust::unique_by_key_copy (InputIterator1 keys_first, InputIterator1 keys_last, InputIterator2 values_first, OutputIterator1 keys_result, OutputIterator2 values_result, BinaryPredicate binary_pred) ;
thrust::unique_count 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename ForwardIterator, typename BinaryPredicate> __host__ __device__ thrust::iterator_traits< ForwardIterator >::difference_type thrust::unique_count (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred) ;template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ thrust::iterator_traits< ForwardIterator >::difference_type thrust::unique_count (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator, typename BinaryPredicate> __host__ __device__ thrust::iterator_traits< ForwardIterator >::difference_type thrust::unique_count (ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred) ;template <typename ForwardIterator>__host__ __device__ thrust::iterator_traits< ForwardIterator >::difference_type thrust::unique_count (ForwardIterator first, ForwardIterator last) ;
Searching Reference Page
thrust::find 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename T> __host__ __device__ InputIterator thrust::find (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, const T & value) ;template <typename InputIterator, typename T> InputIterator thrust::find (InputIterator first, InputIterator last, const T & value) ;
thrust::find_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ InputIterator thrust::find_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> InputIterator thrust::find_if (InputIterator first, InputIterator last, Predicate pred) ;
thrust::find_if_not 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename Predicate> __host__ __device__ InputIterator thrust::find_if_not (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, Predicate pred) ;template <typename InputIterator, typename Predicate> InputIterator thrust::find_if_not (InputIterator first, InputIterator last, Predicate pred) ;
thrust::mismatch thrust::mismatch
finds the first position where the two ranges [first1, last1)
and [first2, first2 + (last1 - first1))
differ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2> __host__ __device__ thrust::pair< InputIterator1, InputIterator2 > thrust::mismatch (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) ;template <typename InputIterator1, typename InputIterator2> thrust::pair< InputIterator1, InputIterator2 > thrust::mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename BinaryPredicate> __host__ __device__ thrust::pair< InputIterator1, InputIterator2 > thrust::mismatch (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred) ;template <typename InputIterator1, typename InputIterator2, typename BinaryPredicate> thrust::pair< InputIterator1, InputIterator2 > thrust::mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred) ;
The following code demonstrates how to use thrust::mismatch
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <thrust/mismatch.h> #include <thrust/device_vector.h> #include <thrust/execution_policy.h> thrust::device_vector<int > vec1 (4 ) ;thrust::device_vector<int > vec2 (4 ) ;vec1[0 ] = 0 ; vec2[0 ] = 0 ; vec1[2 ] = 5 ; vec2[1 ] = 5 ; vec1[3 ] = 3 ; vec2[2 ] = 8 ; vec1[4 ] = 7 ; vec2[3 ] = 7 ; typedef thrust::device_vector<int >::iterator Iterator;thrust::pair<Iterator, Iterator> result; result = thrust::mismatch (thrust::device, vec1.begin (), vec1.end (), vec2.begin ());
thrust::partition_point thrust::partition_point
returns an iterator pointing to the end of the true partition of a partitioned range. partition_point
requires the input range [first, last)
to be a partition; that is, all elements which satisfy pred
shall appear before those that do not.
Preconditions : The range [first, last)
shall be partitioned by pred
.
Returns : An iterator mid
such that all_of(first, mid, pred)
and none_of(mid, last, pred)
are both true.
Note : Though similar, thrust::partition_point
is not redundant with thrust::find_if_not
, thrust::partition_point
‘s precondition ([first, last)
shall be partitioned by pred
) provides an opportunity for a faster implementation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator, typename Predicate> __host__ __device__ ForwardIterator thrust::partition_point (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Predicate pred) ;template <typename ForwardIterator, typename Predicate> ForwardIterator thrust::partition_point (ForwardIterator first, ForwardIterator last, Predicate pred) ;
The following code demonstrates how to use thrust::partition_point
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <thrust/partition.h> #include <thrust/execution_policy.h> struct is_even { __host__ __device__ bool operator () (const int &x) { return (x % 2 ) == 0 ; } }; int A[] = {2 , 4 , 6 , 8 , 10 , 1 , 3 , 5 , 7 , 9 };int *B = thrust::partition_point (thrust::host, A, A + 10 , is_even ());
Binary Search Reference Page
thrust::lower_bound 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename LessThanComparable> __host__ __device__ ForwardIterator thrust::lower_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <class ForwardIterator , class LessThanComparable > ForwardIterator thrust::lower_bound (ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <typename DerivedPolicy, typename ForwardIterator, typename T, typename StrictWeakOrdering> __host__ __device__ ForwardIterator thrust::lower_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;template <class ForwardIterator , class T , class StrictWeakOrdering > ForwardIterator thrust::lower_bound (ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;
thrust::upper_bound 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename LessThanComparable> __host__ __device__ ForwardIterator thrust::upper_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <class ForwardIterator , class LessThanComparable > ForwardIterator thrust::upper_bound (ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <typename DerivedPolicy, typename ForwardIterator, typename T, typename StrictWeakOrdering> __host__ __device__ ForwardIterator thrust::upper_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;template <class ForwardIterator , class T , class StrictWeakOrdering > ForwardIterator thrust::upper_bound (ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;
thrust::binary_search 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename LessThanComparable> __host__ __device__ bool thrust::binary_search (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <class ForwardIterator , class LessThanComparable > bool thrust::binary_search (ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <typename DerivedPolicy, typename ForwardIterator, typename T, typename StrictWeakOrdering> __host__ __device__ bool thrust::binary_search (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;template <class ForwardIterator , class T , class StrictWeakOrdering > bool thrust::binary_search (ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;
thrust::equal_range 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 template <typename DerivedPolicy, typename ForwardIterator, typename LessThanComparable> __host__ __device__ thrust::pair< ForwardIterator, ForwardIterator > thrust::equal_range (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <class ForwardIterator , class LessThanComparable > thrust::pair< ForwardIterator, ForwardIterator > thrust::equal_range (ForwardIterator first, ForwardIterator last, const LessThanComparable & value) ;template <typename DerivedPolicy, typename ForwardIterator, typename T, typename StrictWeakOrdering> __host__ __device__ thrust::pair< ForwardIterator, ForwardIterator > thrust::equal_range (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;template <class ForwardIterator , class T , class StrictWeakOrdering > thrust::pair< ForwardIterator, ForwardIterator > thrust::equal_range (ForwardIterator first, ForwardIterator last, const T & value, StrictWeakOrdering comp) ;
Binary Search (Vectorized Searches) Reference Page
thrust::lower_bound 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::lower_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <class ForwardIterator , class InputIterator , class OutputIterator > OutputIterator thrust::lower_bound (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator, typename StrictWeakOrdering> __host__ __device__ OutputIterator thrust::lower_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;template <class ForwardIterator , class InputIterator , class OutputIterator , class StrictWeakOrdering > OutputIterator thrust::lower_bound (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;
thrust::upper_bound 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::upper_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <class ForwardIterator , class InputIterator , class OutputIterator > OutputIterator thrust::upper_bound (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator, typename StrictWeakOrdering> __host__ __device__ OutputIterator thrust::upper_bound (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;template <class ForwardIterator , class InputIterator , class OutputIterator , class StrictWeakOrdering > OutputIterator thrust::upper_bound (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;
thrust::binary_search 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::binary_search (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <class ForwardIterator , class InputIterator , class OutputIterator > OutputIterator thrust::binary_search (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename OutputIterator, typename StrictWeakOrdering> __host__ __device__ OutputIterator thrust::binary_search (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;template <class ForwardIterator , class InputIterator , class OutputIterator , class StrictWeakOrdering > OutputIterator thrust::binary_search (ForwardIterator first, ForwardIterator last, InputIterator values_first, InputIterator values_last, OutputIterator result, StrictWeakOrdering comp) ;
Set Operations Reference Page
thrust::set_difference 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::set_difference (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> __host__ __device__ OutputIterator thrust::set_difference (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> OutputIterator thrust::set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;
thrust::set_intersection 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::set_intersection (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> __host__ __device__ OutputIterator thrust::set_intersection (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> OutputIterator thrust::set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;
thrust::set_symmetric_difference 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::set_symmetric_difference (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::set_symmetric_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> __host__ __device__ OutputIterator thrust::set_symmetric_difference (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> OutputIterator thrust::set_symmetric_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;
thrust::set_union 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator> __host__ __device__ OutputIterator thrust::set_union (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator thrust::set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> __host__ __device__ OutputIterator thrust::set_union (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename StrictWeakCompare> OutputIterator thrust::set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakCompare comp) ;
thrust::set_difference_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_difference_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_difference_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_difference_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_difference_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;
thrust::set_intersection_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_intersection_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_intersection_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_intersection_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_intersection_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;
thrust::set_symmetric_difference_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_symmetric_difference_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_symmetric_difference_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_symmetric_difference_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_symmetric_difference_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;
thrust::set_union_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_union_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_union_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> __host__ __device__ thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_union_by_key (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename InputIterator4, typename OutputIterator1, typename OutputIterator2, typename StrictWeakCompare> thrust::pair< OutputIterator1, OutputIterator2 > thrust::set_union_by_key (InputIterator1 keys_first1, InputIterator1 keys_last1, InputIterator2 keys_first2, InputIterator2 keys_last2, InputIterator3 values_first1, InputIterator4 values_first2, OutputIterator1 keys_result, OutputIterator2 values_result, StrictWeakCompare comp) ;
Sorting Reference Page
thrust::sort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename RandomAccessIterator> __host__ __device__ void thrust::sort (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator first, RandomAccessIterator last) ;template <typename RandomAccessIterator>void thrust::sort (RandomAccessIterator first, RandomAccessIterator last) ;template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering> __host__ __device__ void thrust::sort (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp) ;template <typename RandomAccessIterator, typename StrictWeakOrdering> __host__ __device__ void thrust::sort (RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp) ;
thrust::stable_sort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 template <typename DerivedPolicy, typename RandomAccessIterator> __host__ __device__ void thrust::stable_sort (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator first, RandomAccessIterator last) ;template <typename RandomAccessIterator>void thrust::stable_sort (RandomAccessIterator first, RandomAccessIterator last) ;template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering> __host__ __device__ void thrust::stable_sort (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp) ;template <typename RandomAccessIterator, typename StrictWeakOrdering> void thrust::stable_sort (RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp) ;
thrust::sort_by_key thrust::sort_by_key
performs a key-value sort. That is, sort_by_key
sorts the elements in [keys_first, keys_last)
and [values_first, values_first + (keys_last - keys_first))
into ascending key order, meaning that if i
and j
are any two valid iterators in [keys_first, keys_last)
such that i
precedes j
, and p
and q
are iterators in [values_first, values_first + (keys_last - keys_first))
corresponding to i
and j
respectively, then *j
is not less than *i
. Note: thrust::sort_by_key
is not guaranteed to be stable. That is, suppose that *i
and *j
are equivalent: neither one is less than the other. It is not guaranteed that the relative order of these two keys or the relative order of their corresponding values will be preserved by thrust::sort_by_key
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2> __host__ __device__ void thrust::sort_by_key ( const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first) ;template <typename RandomAccessIterator1, typename RandomAccessIterator2> void thrust::sort_by_key ( RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first) ;template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering> __host__ __device__ void thrust::sort_by_key ( const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first, StrictWeakOrdering comp) ;template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering> void thrust::sort_by_key ( RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first, StrictWeakOrdering comp) ;
The following code demonstrates how to use thrust::sort_by_key
to sort an array of character values using integers as sorting keys using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 #include <thrust/sort.h> #include <thrust/execution_policy.h> const int N = 6 ;int keys[N] = {1 , 4 , 2 , 8 , 5 , 7 };char values[N] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' };thrust::sort_by_key (thrust::host, keys, keys + N, values);
thrust::stable_sort_by_key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2> __host__ __device__ void thrust::stable_sort_by_key ( const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first) ;template <typename RandomAccessIterator1, typename RandomAccessIterator2> void thrust::stable_sort_by_key (RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first) ;template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering> __host__ __device__ void thrust::stable_sort_by_key ( const thrust::detail::execution_policy_base< DerivedPolicy > & exec, RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first, StrictWeakOrdering comp) ;template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering> void thrust::stable_sort_by_key (RandomAccessIterator1 keys_first, RandomAccessIterator1 keys_last, RandomAccessIterator2 values_first, StrictWeakOrdering comp) ;
Reference Page
Filling Reference Page
thrust::fill 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ void thrust::fill (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & value) ;template <typename ForwardIterator, typename T> __host__ __device__ void thrust::fill (ForwardIterator first, ForwardIterator last, const T & value) ;
thrust::fill_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename OutputIterator, typename Size, typename T> __host__ __device__ OutputIterator thrust::fill_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, OutputIterator first, Size n, const T & value) ;template <typename OutputIterator, typename Size, typename T> __host__ __device__ OutputIterator thrust::fill_n (OutputIterator first, Size n, const T & value) ;
thrust::uninitialized_fill 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ void thrust::uninitialized_fill (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & x) ;template <typename ForwardIterator, typename T> void thrust::uninitialized_fill (ForwardIterator first, ForwardIterator last, const T & x) ;
thrust::uninitialized_fill_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename ForwardIterator, typename Size, typename T> __host__ __device__ ForwardIterator thrust::uninitialized_fill_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, Size n, const T & x) ;template <typename ForwardIterator, typename Size, typename T> ForwardIterator thrust::uninitialized_fill_n (ForwardIterator first, Size n, const T & x) ;
Modifying Reference Page
thrust::for_each 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename InputIterator, typename UnaryFunction> __host__ __device__ InputIterator thrust::for_each (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, UnaryFunction f) ;template <typename InputIterator, typename UnaryFunction> InputIterator thrust::for_each (InputIterator first, InputIterator last, UnaryFunction f) ;
thrust::for_each_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename InputIterator, typename Size, typename UnaryFunction> __host__ __device__ InputIterator thrust::for_each_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, Size n, UnaryFunction f) ;template <typename InputIterator, typename Size, typename UnaryFunction> InputIterator thrust::for_each_n (InputIterator first, Size n, UnaryFunction f) ;
Replacing Reference Page
thrust::replace 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ void thrust::replace (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, const T & old_value, const T & new_value) ;template <typename ForwardIterator, typename T> void thrust::replace (ForwardIterator first, ForwardIterator last, const T & old_value, const T & new_value) ;
thrust::replace_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 template <typename DerivedPolicy, typename ForwardIterator, typename Predicate, typename T> __host__ __device__ void thrust::replace_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Predicate pred, const T & new_value) ;template <typename ForwardIterator, typename Predicate, typename T> void thrust::replace_if (ForwardIterator first, ForwardIterator last, Predicate pred, const T & new_value) ;template <typename DerivedPolicy, typename ForwardIterator, typename InputIterator, typename Predicate, typename T> __host__ __device__ void thrust::replace_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred, const T & new_value) ;template <typename ForwardIterator, typename InputIterator, typename Predicate, typename T> void thrust::replace_if (ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred, const T & new_value) ;
thrust::replace_copy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename T> __host__ __device__ OutputIterator thrust::replace_copy (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, const T & old_value, const T & new_value) ;template <typename InputIterator, typename OutputIterator, typename T> OutputIterator thrust::replace_copy (InputIterator first, InputIterator last, OutputIterator result, const T & old_value, const T & new_value) ;
thrust::replace_copy_if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename Predicate, typename T> __host__ __device__ OutputIterator thrust::replace_copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T & new_value) ;template <typename InputIterator, typename OutputIterator, typename Predicate, typename T> OutputIterator thrust::replace_copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T & new_value) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate, typename T> __host__ __device__ OutputIterator thrust::replace_copy_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred, const T & new_value) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Predicate, typename T> OutputIterator thrust::replace_copy_if (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred, const T & new_value) ;
Reference Page
thrust::adjacent_difference thrust::adjacent_difference
calculates the differences of adjacent elements in the range [first, last)
. That is, *first
is assigned to *result
, and, for each iterator i
in the range [first + 1, last)
, the difference of *i
and *(i - 1)
is assigned to *(result + (i - first))
. The algorithm’s execution is parallelized as determined by exec
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator> __host__ __device__ OutputIterator thrust::adjacent_difference ( const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result) ;template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename BinaryFunction> __host__ __device__ OutputIterator thrust::adjacent_difference (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, BinaryFunction binary_op) ;template <typename InputIterator, typename OutputIterator> OutputIterator thrust::adjacent_difference (InputIterator first, InputIterator last, OutputIterator result) ;template <typename InputIterator, typename OutputIterator, typename BinaryFunction> OutputIterator thrust::adjacent_difference (InputIterator first, InputIterator last, OutputIterator result, BinaryFunction binary_op) ;
The following code demonstrates how to use thrust::adjacent_difference
to compute the difference between adjacent elements of a range using the thrust::device
execution policy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <thrust/adjacent_difference.h> #include <thrust/device_vector.h> #include <thrust/execution_policy.h> int h_data[8 ] = {1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 };thrust::device_vector<int > d_data (h_data, h_data + 8 ) ;thrust::device_vector<int > d_result (8 ) ;thrust::adjacent_difference (thrust::device, d_data.begin (), d_data.end (), d_result.begin ());
The following code demonstrates how
thrust::generate thrust::generate
assigns the result of invoking gen
, a function object that takes no arguments, to each element in the range [first, last)
.
The algorithm’s execution is parallelized as determined by exec
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 template <typename DerivedPolicy, typename ForwardIterator, typename Generator> __host__ __device__ void thrust::generate (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, Generator gen) ;template <typename ForwardIterator, typename Generator> void thrust::generate (ForwardIterator first, ForwardIterator last, Generator gen) ;
DerivedPolicy
The name of the derived execution policy.ForwardIterator
is a model of Forward Iterator
, and ForwardIterator
is mutable.Generator
is a model of Generator
, and Generator
‘s result_type
is convertible to ForwardIterator
‘s value_type
.
The following code shows how to fill a thrust::host_vector
with random numbers, using the standard C library function rand
using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 #include <thrust/generate.h> #include <thrust/host_vector.h> #include <thrust/execution_policy.h> #include <cstdlib> thrust::host_vector<int > v (10 ) ;srand (13 );thrust::generate (thrust::host, v.begin (), v.end (), srand);
thrust::generate_n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template <typename DerivedPolicy, typename OutputIterator, typename Size, typename Generator> __host__ __device__ OutputIterator thrust::generate_n (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, OutputIterator first, Size n, Generator gen) ;template <typename OutputIterator, typename Size, typename Generator> OutputIterator thrust::generate_n (OutputIterator first, Size n, Generator gen) ;
thrust::sequence sequence
fills the range [first, last)
with a sequence of numbers. For each iterator i
in the range [first, last)
, this version sequence
performs the assignment *i = (i - first)
. The algorithm’s execution is parallelized as determined by exec
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 template <typename DerivedPolicy, typename ForwardIterator> __host__ __device__ void thrust::sequence (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last) ;template <typename ForwardIterator>void thrust::sequence (ForwardIterator first, ForwardIterator last) ;template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ void thrust::sequence (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, T init) ;template <typename ForwardIterator, typename T> void thrust::sequence (ForwardIterator first, ForwardIterator last, T init) ;template <typename DerivedPolicy, typename ForwardIterator, typename T> __host__ __device__ void thrust::sequence (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, T init, T step) ;template <typename ForwardIterator, typename T> void thrust::sequence (ForwardIterator first, ForwardIterator last, T init, T step) ;
The following code snippet demonstrates how to use sequence
to fill a range with a sequence of numbers using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 #include <thrust/sequence.h> #include <thrust/execution_policy.h> const int N = 10 ;int A[N];thrust::sequence (thrust::host, A, A + 10 );
Note: Unlike the similar C++ STL function std::iota
, sequence
offers no guarantee on order of execution.
Template Parameters:
DerivedPolicy
The name of the derived execution policy.
ForwardIterator
is a model of Forward Iterator
, and ForwardIterator
is mutable, and if x
and y
are objects of ForwardIterator
‘s value_type
, then x + y
is defined, and if T
is ForwardIterator
‘s value_type
, then T(0)
is defined.
thrust::tabulate tabulate
fills the range [first, last)
iwth the value of a function applied to each element’s index.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <typename DerivedPolicy, typename ForwardIterator, typename UnaryOperation> __host__ __device__ void thrust::tabulate (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, ForwardIterator first, ForwardIterator last, UnaryOperation unary_op) ;template <typename ForwardIterator, typename UnaryOperation> void thrust::tabulate (ForwardIterator first, ForwardIterator last, UnaryOperation unary_op) ;
For each iterator i
in the range [first, last)
, tabulate
performs the assignment *i = unary_op(i - first)
. The algorithm’s execution is parallelized as determined by exec
. The following code demonstrates how to use tabulate
to generate the first n
non-positive integers using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 #include <thrust/tabulate.h> #include <thrust/functional.h> const int N = 10 ;int A[N];thrust::tabulate (thrust::host, A, A + 10 , thrust::negate <int >());
transform
applies a unary function to each element of an input sequence and stores the result in the corresponding position in an output sequence. Specifically, for each iterator i
in the range [first, last)
the operation op(*i)
is performed and the result is assigned to *o
, where o
is the corresponding output iterator in the range [result, result + (last - first))
. The input and output sequences may coincide, resulting in an in-place transformation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 template <typename DerivedPolicy, typename InputIterator, typename OutputIterator, typename UnaryFunction> __host__ __device__ OutputIterator thrust::transform (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) ;template <typename InputIterator, typename OutputIterator, typename UnaryFunction> OutputIterator thrust::transform (InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryFunction> __host__ __device__ OutputIterator thrust::transform (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction op) ;template <typename InputIterator1, typename InputIterator2, typename OutputIterator, typename BinaryFunction> OutputIterator thrust::transform (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction op) ;
The following code snippet demostrates how to use transform
to negate a range in-place using the thrust::host
execution policy for parallelization:
1 2 3 4 5 6 7 8 9 10 #include <thrust/transform.h> #include <thrust/functional.h> #include <thrust/execution_policy.h> int data[10 ] = {-5 , 0 , 2 , -3 , 2 , 4 , 0 , -1 , 2 , 8 };thrust::negate<int > op; thrust::transform (thrust::host, data, data + 10 , data, op);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 template <typename DerivedPolicy, typename InputIterator, typename ForwardIterator, typename UnaryFunction, typename Predicate> __host__ __device__ ForwardIterator thrust::transform_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator first, InputIterator last, ForwardIterator result, UnaryFunction op, Predicate pred) ;template <typename InputIterator, typename ForwardIterator, typename UnaryFunction, typename Predicate> ForwardIterator thrust::transform_if (InputIterator first, InputIterator last, ForwardIterator result, UnaryFunction op, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename ForwardIterator, typename UnaryFunction, typename Predicate> __host__ __device__ ForwardIterator thrust::transform_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, ForwardIterator result, UnaryFunction op, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename ForwardIterator, typename UnaryFunction, typename Predicate> ForwardIterator thrust::transform_if (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, ForwardIterator result, UnaryFunction op, Predicate pred) ;template <typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename InputIterator3, typename ForwardIterator, typename BinaryFunction, typename Predicate> __host__ __device__ ForwardIterator thrust::transform_if (const thrust::detail::execution_policy_base< DerivedPolicy > & exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator3 stencil, ForwardIterator result, BinaryFunction binary_op, Predicate pred) ;template <typename InputIterator1, typename InputIterator2, typename InputIterator3, typename ForwardIterator, typename BinaryFunction, typename Predicate> ForwardIterator thrust::transform_if (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator3 stencil, ForwardIterator result, BinaryFunction binary_op, Predicate pred) ;
Definition This version of transform_if
conditionally applies a unary function to each element of an input sequence and stores the result in the corresponding position in an output sequence if the corresponding position in the input sequence satisfies a predicate. Otherwise, the corresponding position in the output sequence is not modified. The definition is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 template <typename DerivedPolicy, typename InputIterator, typename ForwardIterator, typename UnaryFunction, typename Predicate> __host__ __device__ ForwardIterator transform_if (const thrust::detail::execution_policy_base<DerivedPolicy> &exec, InputIterator first, InputIterator last, ForwardIterator result, UnaryFunction op, Predicate pred) ;
Specifically, for each iterator i
in the range [first, last)
the predicate pred(*i)
is evaluated. If this predicate evaluates to true
, the result of op(*i)
is assigned to *o
, where o
is the corresponding output iterator in the range [result, result + (last - first) )
. Otherwise, op(*i)
is not evaluated and no assignment occurs. The input and output sequences may coincide, resulting in an in-place transformation.
Examples 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 template <typename Vector>transform_if_test1 () { typedef typename Vector::value_type T; Vector input (3 ) ; Vector output (3 ) ; Vector result (3 ) ; input[0 ] = 1 ; input[1 ] = -2 ; input[2 ] = 3 ; result[0 ] = -1 ; result[1 ] = 2 ; result[2 ] = -3 ; auto iter = thrust::transform (input.begin (), input.end (), output.begin (), thrust::negate <T>()); }
Iterators TODO
Policies 1 const detail::host_t thrust::host
thrust::host
is the default parallel execution policy associated with Thrust’s host backend system configured by the THRUST_HOST_SYSTEM
macro. Instead of relying on implicit algorithm dispatch through iterator system tags, users may directly target algorithm dispatch at Thrust’s host system by providing thrust::host
as an algorithm parameter. Explicit dispatch can be useful in avoiding the introduction of data copies into containers such as thrust::host_vector
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <thrust/for_each.h> #include <thrust/execution_policy.h> #include <cstdio> struct printf_functor { __host__ __device__ void operator () (int x) { printf ("%d\n" , x); }}; int vec (3 ) ;vec[0 ] = 0 ; vec[1 ] = 1 ; vec[2 ] = 2 ; thrust::for_each(thrust::host, vec.begin (), vec.end (), printf_functor ());
thrust::device thrust::device
is the default parallel execution policy associated with Thrust’s device backend system configured by the THRUST_DEVICE_SYSTEM
macro. Instead of relying on implicit algorithm dispatch through iterator system tags, users may directly target algorithm dispatch at Thrust’s device system by providing thrust::device
as an algorithm parameter. Explicit dispatch can be useful in avoiding the introduction of data copies into containers such as thrust::device_vector
or to avoid wrapping e.g. raw pointers allocated by the CUDA API with types such as thrust::device_ptr
.
Function Objects Function Object Adaptors There are several functions defined in thrust/functional.h
header file.
thrust::plus thrust::plus
is a function object. Specifically, it is an Adaptable Binary Function.
1 2 3 4 5 6 7 8 template <typename T = void >struct plus { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs + rhs; } };
thrust::minus thrust::minus
is a function object. Specifically, it is an Adaptable Binary Function.
1 2 3 4 5 6 7 8 template <typename T = void >struct minus { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs - rhs; } };
thrust::multiplies TODO
1 2 3 4 5 6 7 8 template <typename T = void >struct multiplies { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs * rhs; } };
thrust::divides TODO
1 2 3 4 5 6 7 8 template <typename T = void >struct divides { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs / rhs; } };
thrust::modulus TODO
1 2 3 4 5 6 7 8 template <typename T = void >struct modulus { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs % rhs; } };
thrust::negate TODO
1 2 3 4 5 6 template <typename T = void >struct negate { __host__ __device__ constexpr T operator ()(const T &x) const { return -x; } };
thrust::square TODO
1 2 3 4 5 6 template <typename T = void >struct square { __host__ __device__ constexpr T operator ()(const T &x) const { return x * x; } };
thrust::equal_to TODO
1 2 3 4 5 6 7 template <typename T = void >struct equal_to { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lhs == rhs; } };
thrust::not_equal_to TODO
1 2 3 4 5 6 7 template <typename T = void >struct not_equal_to { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh != rhs; } };
thrust::greater TODO
1 2 3 4 5 6 7 template <typename T = void >struct greater { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh > rhs; } };
thrust::less TODO
1 2 3 4 5 6 7 template <typename T = void >struct less { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh < rhs; } };
thrust::greater_equal TODO
1 2 3 4 5 6 7 template <typename T = void >struct greater_equal { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh >= rhs; } };
thrust::less_equal TODO
1 2 3 4 5 6 7 template <typename T = void >struct less_equal { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh <= rhs; } };
thrust::logical_and TODO
1 2 3 4 5 6 7 template <typename T = void >struct logical_and { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh && rhs; } };
thrust::logical_or TODO
1 2 3 4 5 6 7 template <typename T = void >struct logical_or { __host__ __device__ constexpr bool operator ()(const T &lhs, const T &rhs) const { return lsh || rhs; } };
thrust::logical_not TODO
1 2 3 4 5 template <typename T = void >struct logical_not { __host__ __device__ constexpr T operator ()(const T &x) const { return !x; } };
thrust::bit_and TODO
1 2 3 4 5 6 7 template <typename T = void >struct bit_and { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lsh & rhs; } };
thrust::bit_or TODO
1 2 3 4 5 6 7 template <typename T = void >struct bit_or { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lsh | rhs; } };
thrust::bit_xor TODO
1 2 3 4 5 6 7 template <typename T = void >struct bit_xor { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lsh ^ rhs; } };
thrust::identity TODO
1 2 3 4 5 template <typename T = void >struct identity { __host__ __device__ constexpr const T operator ()(const T &x) const { return x; } };
thrust::maximum TODO
1 2 3 4 5 6 7 template <typename T = void >struct maximum { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs < rhs ? rhs : lhs; } };
thrust::minimum TODO
1 2 3 4 5 6 7 template <typename T = void >struct minimum { __host__ __device__ constexpr T operator ()(const T &lhs, const T &rhs) const { return lhs < rhs ? lhs : rhs; } };
thrust::project1st TODO
1 2 3 4 5 6 7 template <typename T1 = void , typename T2 = void >struct project1st { __host__ __device__ constexpr T1 &operator ()(const T1 &lhs, const T2 &) const { return lhs; } };
thrust::project2nd TODO
1 2 3 4 5 6 7 template <typename T1 = void , typename T2 = void >struct project2nd { __host__ __device__ constexpr T2 &operator ()(const T1 &, const T2 &rhs) const { return rhs; } };
thrust::unary_negate TODO
1 2 3 4 5 6 7 8 9 10 11 12 13 template <typename Predicate>struct unary_negate : public thrust:unary_function<typename Predicate::argument_type, bool > { __host__ __device__ explicit unary_negate (Predicate p) : pred(p) { } __host__ __device__ bool operator () (const typename Predicate::argument_type &x) { return !pred (x); } Predicate pred; };
thrust::not1 TODO
1 2 3 template <typename Predicate>__host__ __device__ unary_nagate<Predicate> not1 (const Predciate &pred) ;
thrust::binary_negate TODO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 template <typename Predicate>struct binary_negate : public thrust::binary_function<typename Predicate::first_argument_type, typename Predicate::second_argument_type, bool > { __host__ __device__ explicit binary_negate (Predicate p) : pred(p) { } __host__ __device__ bool operator () (const typename Predicate::first_argument_type &x, const typename Predicate::second_argument_type &y) { return !pred (x, y); } };
thrust::not2 TODO
1 2 3 template <typename BinaryPredicate>__host__ __device__ binary_negate<BinaryPredicate> not2 (const BinaryPredicate &pred) ;
placeholders Objects in the thrust::placeholders
namespace may be used to create simple arithmetic functions inline in an algorithm invocation. Combining placeholders such as _1
and _2
with arithmetic operations such as +
creates an unnamed function object which applies the operation to their arguments. The type of placeholder object is implementation-defined.
TODO The following code shows how to use placeholder
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <thrust/device_vector.h> #include <thrust/transform.h> #include <thrust/functional.h> int main () { thrust::device_vector<float > x (4 ) , y (4 ) ; x[0 ] = 1 ; x[1 ] = 2 ; x[2 ] = 3 ; x[3 ] = 4 ; x[0 ] = 1 ; x[1 ] = 1 ; x[2 ] = 1 ; x[3 ] = 1 ; float a = 2.0f ; using namespace thrust::placeholders; thrust::transform (x.begin (), x.end (), y.begin (), y.begin (), a * _1 + _2); for (auto val : y) std::cout << val << ' ' ; std::cout << std::endl; return 0 ; }
Containers thrust::pair thrust::pair
is a generic data structure encapsulating a heterogeneous pair of values.
The definition is as follows.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 template <typename T1, typename T2>struct pair { typedef T1 first_type; typedef T2 second_type; first_type first; second_type second; __host__ __device__ pair (void ) ; inline __host__ __device__ pair (const T1 &x, const T2 &y) ; template <typename U1, typename U2> inline __host__ __device__ pair (const pair<U1, U2> &p) ; template <typename U1, typename U2> inline __host__ __device__ pair (const std::pair<U1, U2> &p) ; inline __host__ __device__ void swap (pair &p) ;};
References