thrust
Functions
Gathering

Functions

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)
 

Detailed Description

Function Documentation

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 
)

gather copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last), the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

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

Parameters
execThe execution policy to use for parallelization.
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
input_firstBeginning of the source range.
resultBeginning of the destination range.
Template Parameters
DerivedPolicyThe name of the derived execution policy.
InputIteratormust be a model of Input Iterator and InputIterator's value_type must be convertible to RandomAccessIterator's difference_type.
RandomAccessIteratormust be a model of Random Access Iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather is the inverse of thrust::scatter.

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

#include <thrust/gather.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);
// gather all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
d_map.begin(), d_map.end(),
d_values.begin(),
d_output.begin());
// d_output is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
template<typename InputIterator , typename RandomAccessIterator , typename OutputIterator >
OutputIterator thrust::gather ( InputIterator  map_first,
InputIterator  map_last,
RandomAccessIterator  input_first,
OutputIterator  result 
)

gather copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last), the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

Parameters
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
input_firstBeginning of the source range.
resultBeginning of the destination range.
Template Parameters
InputIteratormust be a model of Input Iterator and InputIterator's value_type must be convertible to RandomAccessIterator's difference_type.
RandomAccessIteratormust be a model of Random Access Iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather is the inverse of thrust::scatter.

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

#include <thrust/gather.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);
// gather all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
thrust::gather(d_map.begin(), d_map.end(),
d_values.begin(),
d_output.begin());
// d_output is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
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 
)

gather_if conditionally copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last), such that the value of *(stencil + (i - map_first)) is true, the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

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

Parameters
execThe execution policy to use for parallelization.
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
stencilBeginning of the range of predicate values.
input_firstBeginning of the source range.
resultBeginning 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 difference_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to bool.
RandomAccessIteratormust be a model of Random Access iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
The range [stencil, stencil + (map_last - map_first)) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather_if is the inverse of scatter_if.

The following code snippet demonstrates how to use gather_if to gather selected values from an input range using the thrust::device execution policy:

#include <thrust/gather.h>
...
int values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
thrust::device_vector<int> d_values(values, values + 10);
// select elements at even-indexed locations
int stencil[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
thrust::device_vector<int> d_stencil(stencil, stencil + 10);
// map all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
d_map.begin(), d_map.end(),
d_stencil.begin(),
d_values.begin(),
d_output.begin());
// d_output is now {0, 7, 4, 7, 8, 7, 3, 7, 7, 7}
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 
)

gather_if conditionally copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last), such that the value of *(stencil + (i - map_first)) is true, the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

Parameters
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
stencilBeginning of the range of predicate values.
input_firstBeginning of the source range.
resultBeginning of the destination range.
Template Parameters
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to bool.
RandomAccessIteratormust be a model of Random Access iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
The range [stencil, stencil + (map_last - map_first)) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather_if is the inverse of scatter_if.

The following code snippet demonstrates how to use gather_if to gather selected values from an input range.

#include <thrust/gather.h>
...
int values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
thrust::device_vector<int> d_values(values, values + 10);
// select elements at even-indexed locations
int stencil[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
thrust::device_vector<int> d_stencil(stencil, stencil + 10);
// map all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
thrust::gather_if(d_map.begin(), d_map.end(),
d_stencil.begin(),
d_values.begin(),
d_output.begin());
// d_output is now {0, 7, 4, 7, 8, 7, 3, 7, 7, 7}
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 
)

gather_if conditionally copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last) such that the value of pred(*(stencil + (i - map_first))) is true, the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

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

Parameters
execThe execution policy to use for parallelization.
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
stencilBeginning of the range of predicate values.
input_firstBeginning of the source range.
resultBeginning 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 difference_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to Predicate's argument_type.
RandomAccessIteratormust be a model of Random Access iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Predicatemust be a model of Predicate.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
The range [stencil, stencil + (map_last - map_first)) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather_if is the inverse of scatter_if.

The following code snippet demonstrates how to use gather_if to gather selected values from an input range based on an arbitrary selection function using the thrust::device execution policy for parallelization:

#include <thrust/gather.h>
struct is_even
{
__host__ __device__
bool operator()(const int x)
{
return (x % 2) == 0;
}
};
...
int values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
thrust::device_vector<int> d_values(values, values + 10);
// we will select an element when our stencil is even
int stencil[10] = {0, 3, 4, 1, 4, 1, 2, 7, 8, 9};
thrust::device_vector<int> d_stencil(stencil, stencil + 10);
// map all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
d_map.begin(), d_map.end(),
d_stencil.begin(),
d_values.begin(),
d_output.begin(),
is_even());
// d_output is now {0, 7, 4, 7, 8, 7, 3, 7, 7, 7}
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 
)

gather_if conditionally copies elements from a source array into a destination range according to a map. For each input iterator i in the range [map_first, map_last) such that the value of pred(*(stencil + (i - map_first))) is true, the value input_first[*i] is assigned to *(result + (i - map_first)). RandomAccessIterator must permit random access.

Parameters
map_firstBeginning of the range of gather locations.
map_lastEnd of the range of gather locations.
stencilBeginning of the range of predicate values.
input_firstBeginning of the source range.
resultBeginning 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 difference_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to Predicate's argument_type.
RandomAccessIteratormust be a model of Random Access iterator and RandomAccessIterator's value_type must be convertible to OutputIterator's value_type.
OutputIteratormust be a model of Output Iterator.
Predicatemust be a model of Predicate.
Precondition
The range [map_first, map_last) shall not overlap the range [result, result + (map_last - map_first)).
The range [stencil, stencil + (map_last - map_first)) shall not overlap the range [result, result + (map_last - map_first)).
Remarks
gather_if is the inverse of scatter_if.

The following code snippet demonstrates how to use gather_if to gather selected values from an input range based on an arbitrary selection function.

#include <thrust/gather.h>
struct is_even
{
__host__ __device__
bool operator()(const int x)
{
return (x % 2) == 0;
}
};
...
int values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
thrust::device_vector<int> d_values(values, values + 10);
// we will select an element when our stencil is even
int stencil[10] = {0, 3, 4, 1, 4, 1, 2, 7, 8, 9};
thrust::device_vector<int> d_stencil(stencil, stencil + 10);
// map all even indices into the first half of the range
// and odd indices to the last half of the range
int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
thrust::device_vector<int> d_map(map, map + 10);
thrust::gather_if(d_map.begin(), d_map.end(),
d_stencil.begin(),
d_values.begin(),
d_output.begin(),
is_even());
// d_output is now {0, 7, 4, 7, 8, 7, 3, 7, 7, 7}