Distributed Ranges
Loading...
Searching...
No Matches
range.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/concepts/concepts.hpp>
8#include <dr/sp/distributed_span.hpp>
9
10namespace dr::sp {
11
12template <int dimensions = 1> class id {
13public:
14 static_assert(dimensions == 1);
15
16 id() noexcept = default;
17
18 id(std::size_t segment_id, std::size_t local_id, std::size_t global_id)
19 : segment_id_(segment_id), local_id_(local_id), global_id_(global_id) {}
20
21 std::size_t get(int dimension) const { return global_id_; }
22
23 operator std::size_t() const { return global_id_; }
24
25 std::size_t segment() const { return segment_id_; }
26
27 std::size_t local_id() const { return local_id_; }
28
29private:
30 std::size_t segment_id_ = 0;
31 std::size_t local_id_ = 0;
32 std::size_t global_id_ = 0;
33};
34
36public:
37 using element_type = id<1>;
39
40 using size_type = std::size_t;
41 using difference_type = std::ptrdiff_t;
42
43 // using pointer = typename segment_type::pointer;
44 using reference = value_type;
45
46 using iterator_category = std::random_access_iterator_tag;
47
51
52 constexpr segment_range_accessor() noexcept = default;
53 constexpr ~segment_range_accessor() noexcept = default;
54 constexpr segment_range_accessor(const segment_range_accessor &) noexcept =
55 default;
56 constexpr segment_range_accessor &
57 operator=(const segment_range_accessor &) noexcept = default;
58
59 constexpr segment_range_accessor(size_type segment_id, size_type idx,
60 size_type global_offset) noexcept
61 : global_offset_(global_offset), segment_id_(segment_id), idx_(idx) {}
62
63 constexpr segment_range_accessor &
64 operator+=(difference_type offset) noexcept {
65 idx_ += offset;
66 return *this;
67 }
68
69 constexpr bool operator==(const iterator_accessor &other) const noexcept {
70 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
71 }
72
73 constexpr difference_type
74 operator-(const iterator_accessor &other) const noexcept {
75 return difference_type(idx_) - difference_type(other.idx_);
76 }
77
78 // Comparing iterators from different segments is undefined
79 constexpr bool operator<(const iterator_accessor &other) const noexcept {
80 return idx_ < other.idx_;
81 }
82
83 reference operator*() const noexcept {
84 return value_type(segment_id_, idx_, get_global_idx());
85 }
86
87private:
88 size_type get_global_idx() const noexcept { return global_offset_ + idx_; }
89
90 size_type global_offset_ = 0;
91 size_type segment_id_ = 0;
92 size_type idx_ = 0;
93};
94
96
97template <int dimensions = 1> class segment_range {
98public:
99 static_assert(dimensions == 1);
100
102 using size_type = std::size_t;
103 using different_type = std::ptrdiff_t;
104
105 using reference = value_type;
106
108
109 segment_range(std::size_t segment_id, std::size_t segment_size,
110 std::size_t global_offset)
111 : segment_id_(segment_id), segment_size_(segment_size),
112 global_offset_(global_offset) {}
113
114 iterator begin() const { return iterator(segment_id_, 0, global_offset_); }
115
116 iterator end() const {
117 return iterator(segment_id_, segment_size_, global_offset_);
118 }
119
120 size_type size() const noexcept { return segment_size_; }
121
122 value_type operator[](std::size_t idx) { return *(begin() + idx); }
123
124 size_type rank() const noexcept { return 0; }
125
126private:
127 std::size_t segment_size_;
128 std::size_t segment_id_;
129 std::size_t global_offset_;
130};
131
132/*
133template <rng::forward_range R> auto distributed_iota_view(R &&r) {
134 static_assert(dr::distributed_contiguous_range<R>);
135 if constexpr (dr::distributed_contiguous_range<R>) {
136 std::vector<segment_range<>> iota_segments;
137 std::size_t global_offset = 0;
138 std::size_t segment_id = 0;
139 for (auto &&segment : r.segments()) {
140 iota_segments.push_back(
141 segment_range(segment_id, segment.size(), global_offset));
142 global_offset += segment.size();
143 segment_id++;
144 }
145 return dr::sp::distributed_span(iota_segments);
146 } else {
147 return segment_range(0, rng::size(r), 0);
148 }
149}
150*/
151
152} // namespace dr::sp
Definition: iterator_adaptor.hpp:23
Definition: range.hpp:12
Definition: range.hpp:35
Definition: range.hpp:97