inclusive_scan
computes an inclusive prefix sum operation. The term 'inclusive' means that 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. This version of inclusive_scan
assumes plus as the associative operator. When the input and output sequences are the same, the scan is performed in-place.
inclusive_scan
is similar to std::partial_sum
in the STL. The primary difference between the two functions is that std::partial_sum
guarantees a serial summation order, while 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
.
- Parameters
-
exec | The execution policy to use for parallelization. |
first | The beginning of the input sequence. |
last | The end of the input sequence. |
result | The beginning of the output sequence. |
- Returns
- The end of the output sequence.
- Template Parameters
-
DerivedPolicy | The name of the derived execution policy. |
InputIterator | is a model of Input Iterator and InputIterator's value_type is convertible to OutputIterator's value_type . |
OutputIterator | is a model of Output Iterator, and if x and y are objects of OutputIterator's value_type , then x + y is defined. If T is OutputIterator's value_type , then T(0) is defined. |
- Precondition
first
may equal result
but the range [first, last)
and the range [result, result + (last - first))
shall not overlap otherwise.
The following code snippet demonstrates how to use inclusive_scan
to compute an in-place prefix sum using the thrust::host
execution policy for parallelization:
#include <thrust/scan.h>
...
int data[6] = {1, 0, 2, 2, 1, 3};
- See also
- https://en.cppreference.com/w/cpp/algorithm/partial_sum