Distributed Ranges
Loading...
Searching...
No Matches
inclusive_scan.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/mp/algorithms/inclusive_exclusive_scan_impl.hpp>
8
9namespace dr::mp {
10
12 dr::distributed_contiguous_range O, typename BinaryOp, typename T>
13auto inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op, T init) {
14 return __detail::inclusive_exclusive_scan_impl_<false>(
15 std::forward<R>(r), rng::begin(std::forward<O>(o)),
16 std::forward<BinaryOp>(binary_op), std::optional(init));
17}
18
20 dr::distributed_contiguous_range O, typename BinaryOp>
21auto inclusive_scan(R &&r, O &&o, BinaryOp &&binary_op) {
22 return __detail::inclusive_exclusive_scan_impl_<false>(
23 std::forward<R>(r), rng::begin(std::forward<O>(o)),
24 std::forward<BinaryOp>(binary_op));
25}
26
29auto inclusive_scan(R &&r, O &&o) {
30 return dr::mp::inclusive_scan(std::forward<R>(r), std::forward<O>(o),
31 std::plus<rng::range_value_t<R>>());
32}
33
34// Distributed iterator versions
35
36template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
37 typename BinaryOp, typename T>
38OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
39 BinaryOp &&binary_op, T init) {
40
41 return dr::mp::inclusive_scan(rng::subrange(first, last), d_first,
42 std::forward<BinaryOp>(binary_op), init);
43}
44
45template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter,
46 typename BinaryOp>
47OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first,
48 BinaryOp &&binary_op) {
49
50 auto dist = rng::distance(first, last);
51 auto d_last = d_first;
52 rng::advance(d_last, dist);
53 dr::mp::inclusive_scan(rng::subrange(first, last),
54 rng::subrange(d_first, d_last),
55 std::forward<BinaryOp>(binary_op));
56
57 return d_last;
58}
59
60template <dr::distributed_iterator Iter, dr::distributed_iterator OutputIter>
61OutputIter inclusive_scan(Iter first, Iter last, OutputIter d_first) {
62 auto dist = rng::distance(first, last);
63 auto d_last = d_first;
64 rng::advance(d_last, dist);
65 dr::mp::inclusive_scan(rng::subrange(first, last),
66 rng::subrange(d_first, d_last));
67
68 return d_last;
69}
70
71} // namespace dr::mp
Definition: concepts.hpp:42
Definition: concepts.hpp:31