Distributed Ranges
Loading...
Searching...
No Matches
copy.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/detail/ranges_shim.hpp>
8
9namespace dr::mp {
10
12void copy(rng::forward_range auto &&in, dr::distributed_iterator auto out) {
13 if (rng::empty(in)) {
14 return;
15 }
16
17 auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
18
19 for_each(views::zip(in, views::counted(out, rng::size(in))), copy);
20}
21
23template <dr::distributed_iterator DI_IN>
24void copy(DI_IN &&first, DI_IN &&last, dr::distributed_iterator auto &&out) {
25 copy(rng::subrange(first, last), out);
26}
27
28template <std::contiguous_iterator CI_IN>
29void copy(CI_IN &&first, CI_IN &&last,
31 copy(0, rng::subrange(first, last), out);
32}
33
34void copy(rng::contiguous_range auto &&in,
36 copy(0, in, out);
37}
38
39void copy(dr::distributed_contiguous_range auto &&in,
40 std::contiguous_iterator auto out) {
41 copy(0, in, out);
42}
43
45void copy(std::size_t root, dr::distributed_contiguous_range auto &&in,
46 std::contiguous_iterator auto out) {
47 if (default_comm().rank() == root) {
48 for (const auto &segment : dr::ranges::segments(in)) {
49 auto sz = rng::size(segment);
50 rng::begin(segment).get(std::to_address(out), sz);
51 out += sz;
52 }
53 }
54 barrier();
55}
56
58void copy(std::size_t root, rng::contiguous_range auto &&in,
60 if (default_comm().rank() == root) {
61 auto in_ptr = std::to_address(in.begin());
62 for (auto remainder = rng::size(in); remainder > 0;) {
63 auto segment = *(dr::ranges::segments(out).begin());
64 auto sz = std::min(rng::size(segment), remainder);
65 assert(sz > 0);
66 rng::begin(segment).put(in_ptr, sz);
67 in_ptr += sz;
68 out += sz;
69 remainder -= sz;
70 }
71 }
72 barrier();
73}
74
75} // namespace dr::mp
Definition: concepts.hpp:51
Definition: concepts.hpp:42
Definition: concepts.hpp:31