9template <
typename DV>
class dv_segment_iterator;
15 using value_type =
typename DV::value_type;
19 operator value_type()
const {
return iterator_.get(); }
20 auto operator=(
const value_type &value)
const {
25 *
this = value_type(other);
28 auto operator&()
const {
return iterator_; }
36 using value_type =
typename DV::value_type;
37 using size_type =
typename DV::size_type;
38 using difference_type =
typename DV::difference_type;
43 segment_index_ = segment_index;
51 assert(dv_ == other.dv_);
52 return segment_index_ == other.segment_index_
53 ? index_ <=> other.index_
54 : segment_index_ <=> other.segment_index_;
59 return (*this <=> other) == 0;
63 auto &operator+=(difference_type n) {
64 assert(dv_ !=
nullptr);
65 assert(n >= 0 ||
static_cast<difference_type
>(index_) >= -n);
70 auto &operator-=(difference_type n) {
return *
this += (-n); }
73 assert(dv_ !=
nullptr && dv_ == other.dv_);
74 assert(index_ >= other.index_);
75 return index_ - other.index_;
89 auto operator++(
int) {
94 auto operator--(
int) {
100 auto operator+(difference_type n)
const {
105 auto operator-(difference_type n)
const {
117 auto operator*()
const {
118 assert(dv_ !=
nullptr);
121 auto operator[](difference_type n)
const {
122 assert(dv_ !=
nullptr);
126 void get(value_type *dst, std::size_t size)
const {
127 assert(dv_ !=
nullptr);
128 assert(segment_index_ * dv_->segment_size_ + index_ < dv_->size());
129 auto segment_offset = index_ + dv_->distribution_.halo().prev;
130 dv_->backend.getmem(dst, segment_offset *
sizeof(value_type),
131 size *
sizeof(value_type), segment_index_);
134 value_type get()
const {
140 void put(
const value_type *dst, std::size_t size)
const {
141 assert(dv_ !=
nullptr);
142 assert(segment_index_ * dv_->segment_size_ + index_ < dv_->size());
143 auto segment_offset = index_ + dv_->distribution_.halo().prev;
144 dr::drlog.debug(
"dv put:: ({}:{}:{})\n", segment_index_, segment_offset,
146 dv_->backend.putmem(dst, segment_offset *
sizeof(value_type),
147 size *
sizeof(value_type), segment_index_);
150 void put(
const value_type &value)
const { put(&value, 1); }
153 assert(dv_ !=
nullptr);
154 return segment_index_;
158#ifndef SYCL_LANGUAGE_VERSION
159 assert(dv_ !=
nullptr);
161 const auto my_process_segment_index = dv_->backend.getrank();
163 if (my_process_segment_index == segment_index_)
164 return dv_->data_ + index_ + dv_->distribution_.halo().prev;
165#ifndef SYCL_LANGUAGE_VERSION
166 assert(!dv_->distribution_.halo().periodic);
169 if (my_process_segment_index + 1 == segment_index_) {
170#ifndef SYCL_LANGUAGE_VERSION
171 assert(index_ <= dv_->distribution_.halo()
174 return dv_->data_ + dv_->distribution_.halo().prev + index_ +
178 if (my_process_segment_index == segment_index_ + 1) {
179#ifndef SYCL_LANGUAGE_VERSION
180 assert(dv_->segment_size_ - index_ <= dv_->distribution_.halo().prev);
182 return dv_->data_ + dv_->distribution_.halo().prev + index_ -
186#ifndef SYCL_LANGUAGE_VERSION
189 return static_cast<decltype(dv_-
>data_)>(
nullptr);
192 auto segments()
const {
193 assert(dv_ !=
nullptr);
194 return dr::__detail::drop_segments(dv_->segments(), segment_index_, index_);
198 assert(dv_ !=
nullptr);
202 assert(dv_ !=
nullptr);
203 return dv_->distribution_.halo();
210 std::size_t segment_index_ = 0;
211 std::size_t index_ = 0;
219 using difference_type = std::ptrdiff_t;
221 dv_segment(DV *dv, std::size_t segment_index, std::size_t size,
222 std::size_t reserved) {
224 segment_index_ = segment_index;
226 reserved_ = reserved;
227 assert(dv_ !=
nullptr);
231 assert(dv_ !=
nullptr);
235 auto begin()
const {
return iterator(dv_, segment_index_, 0); }
236 auto end()
const {
return begin() + size(); }
237 auto reserved()
const {
return reserved_; }
239 auto operator[](difference_type n)
const {
return *(begin() + n); }
241 bool is_local()
const {
return segment_index_ == default_comm().rank(); }
245 std::size_t segment_index_;
247 std::size_t reserved_;
254template <
typename DR>
256 { rng::begin(dr::ranges::segments(dr)[0]).halo() };
260 return rng::begin(dr::ranges::segments(dr)[0]).halo();
Definition: segment.hpp:34
Definition: segment.hpp:11
Definition: segment.hpp:214
Definition: concepts.hpp:20
Definition: segment.hpp:255