thrust
Functions
Scattering
Copying

Functions

template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename RandomAccessIterator >
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)
template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator >
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 >
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)

Detailed Description

Function Documentation

template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename RandomAccessIterator >
void thrust::scatter ( const thrust::detail::execution_policy_base< DerivedPolicy > &  exec,
InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
RandomAccessIterator  result 
)

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.

The algorithm's execution is parallelized as determined by exec.

Parameters
execThe execution policy to use for parallelization.
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
resultDestination of the source elements.
Template Parameters
DerivedPolicyThe name of the derived execution policy.
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
RandomAccessIteratormust be a model of Random Access iterator.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators in the range [map,map + (last - first)).

The following code snippet demonstrates how to use scatter to reorder a range using the thrust::device execution policy for parallelization:

#include <thrust/scatter.h>
...
// mark even indices with a 1; odd indices with a 0
int values[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
thrust::device_vector<int> d_values(values, values + 10);
// scatter all even indices into the first half of the
// range, and odd indices vice versa
int map[10] = {0, 5, 1, 6, 2, 7, 3, 8, 4, 9};
thrust::device_vector<int> d_map(map, map + 10);
d_values.begin(), d_values.end(),
d_map.begin(), d_output.begin());
// d_output is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
Note
scatter is the inverse of thrust::gather.
template<typename InputIterator1 , typename InputIterator2 , typename RandomAccessIterator >
void thrust::scatter ( InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
RandomAccessIterator  result 
)

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.

Parameters
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
resultDestination of the source elements.
Template Parameters
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
RandomAccessIteratormust be a model of Random Access iterator.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators in the range [map,map + (last - first)).

The following code snippet demonstrates how to use scatter to reorder a range.

#include <thrust/scatter.h>
...
// mark even indices with a 1; odd indices with a 0
int values[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
thrust::device_vector<int> d_values(values, values + 10);
// scatter all even indices into the first half of the
// range, and odd indices vice versa
int map[10] = {0, 5, 1, 6, 2, 7, 3, 8, 4, 9};
thrust::device_vector<int> d_map(map, map + 10);
thrust::scatter(d_values.begin(), d_values.end(),
d_map.begin(), d_output.begin());
// d_output is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
Note
scatter is the inverse of thrust::gather.
template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator >
void thrust::scatter_if ( const thrust::detail::execution_policy_base< DerivedPolicy > &  exec,
InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
InputIterator3  stencil,
RandomAccessIterator  output 
)

scatter_if conditionally copies elements from a source range into an output array according to a map. For each iterator i in the range [first, last) such that *(stencil + (i - first)) is true, 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.

The algorithm's execution is parallelized as determined by exec.

Parameters
execThe execution policy to use for parallelization.
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
stencilBeginning of the sequence of predicate values.
outputBeginning of the destination range.
Template Parameters
DerivedPolicyThe name of the derived execution policy.
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator3must be a model of Input Iterator and InputIterator3's value_type must be convertible to bool.
RandomAccessIteratormust be a model of Random Access iterator.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [stencil,stencil + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators i in the range [map,map + (last - first)) for which the following condition holds: *(stencil + i) != false.
#include <thrust/scatter.h>
...
int V[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int M[8] = {0, 5, 1, 6, 2, 7, 3, 4};
int S[8] = {1, 0, 1, 0, 1, 0, 1, 0};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
thrust::scatter_if(thrust::host, V, V + 8, M, S, D);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.
template<typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator >
void thrust::scatter_if ( InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
InputIterator3  stencil,
RandomAccessIterator  output 
)

scatter_if conditionally copies elements from a source range into an output array according to a map. For each iterator i in the range [first, last) such that *(stencil + (i - first)) is true, 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.

Parameters
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
stencilBeginning of the sequence of predicate values.
outputBeginning of the destination range.
Template Parameters
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator3must be a model of Input Iterator and InputIterator3's value_type must be convertible to bool.
RandomAccessIteratormust be a model of Random Access iterator.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [stencil,stencil + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators i in the range [map,map + (last - first)) for which the following condition holds: *(stencil + i) != false.
#include <thrust/scatter.h>
...
int V[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int M[8] = {0, 5, 1, 6, 2, 7, 3, 4};
int S[8] = {1, 0, 1, 0, 1, 0, 1, 0};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
thrust::scatter_if(V, V + 8, M, S, D);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.
template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator , typename Predicate >
void thrust::scatter_if ( const thrust::detail::execution_policy_base< DerivedPolicy > &  exec,
InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
InputIterator3  stencil,
RandomAccessIterator  output,
Predicate  pred 
)

scatter_if conditionally copies elements from a source range into an output array according to a map. For each iterator i in the range [first, last) such that pred(*(stencil + (i - first))) is true, 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.

The algorithm's execution is parallelized as determined by exec.

Parameters
execThe execution policy to use for parallelization.
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
stencilBeginning of the sequence of predicate values.
outputBeginning of the destination range.
predPredicate to apply to the stencil values.
Template Parameters
DerivedPolicyThe name of the derived execution policy.
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator3must be a model of Input Iterator and InputIterator3's value_type must be convertible to Predicate's argument_type.
RandomAccessIteratormust be a model of Random Access iterator.
Predicatemust be a model of Predicate.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [stencil,stencil + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators i in the range [map,map + (last - first)) for which the following condition holds: pred(*(stencil + i)) != false.
#include <thrust/scatter.h>
struct is_even
{
__host__ __device__
bool operator()(int x)
{
return (x % 2) == 0;
}
};
...
int V[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int M[8] = {0, 5, 1, 6, 2, 7, 3, 4};
int S[8] = {2, 1, 2, 1, 2, 1, 2, 1};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
is_even pred;
thrust::scatter_if(thrust::host, V, V + 8, M, S, D, pred);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.
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 
)

scatter_if conditionally copies elements from a source range into an output array according to a map. For each iterator i in the range [first, last) such that pred(*(stencil + (i - first))) is true, 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.

Parameters
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
stencilBeginning of the sequence of predicate values.
outputBeginning of the destination range.
predPredicate to apply to the stencil values.
Template Parameters
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator3must be a model of Input Iterator and InputIterator3's value_type must be convertible to Predicate's argument_type.
RandomAccessIteratormust be a model of Random Access iterator.
Predicatemust be a model of Predicate.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [stencil,stencil + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators i in the range [map,map + (last - first)) for which the following condition holds: pred(*(stencil + i)) != false.
#include <thrust/scatter.h>
struct is_even
{
__host__ __device__
bool operator()(int x)
{
return (x % 2) == 0;
}
};
...
int V[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int M[8] = {0, 5, 1, 6, 2, 7, 3, 4};
int S[8] = {2, 1, 2, 1, 2, 1, 2, 1};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
is_even pred;
thrust::scatter_if(V, V + 8, M, S, D, pred);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.