1 #ifndef DASH__ALGORITHM__LOCAL_RANGE_H__ 2 #define DASH__ALGORITHM__LOCAL_RANGE_H__ 4 #include <dash/view/IndexSet.h> 5 #include <dash/view/Sub.h> 6 #include <dash/view/ViewMod.h> 8 #include <dash/Range.h> 10 #include <dash/internal/Logging.h> 24 ->
typename std::enable_if<
26 ViewSubMod<DomainT, SubDim>
30 template<
typename ElementType>
36 template<
typename IndexType>
43 template<
class GlobInputIter>
44 typename std::enable_if<
45 ( !GlobInputIter::has_view::value &&
51 const GlobInputIter &
first,
53 const GlobInputIter & last)
55 typedef typename GlobInputIter::pattern_type::index_type idx_t;
96 template<
class GlobInputIter>
97 typename std::enable_if<
98 !GlobInputIter::has_view::value,
103 const GlobInputIter & first,
105 const GlobInputIter & last)
107 typedef typename GlobInputIter::pattern_type::index_type idx_t;
109 typedef typename GlobInputIter::pattern_type pattern_t;
110 typedef typename pattern_t::index_type idx_t;
112 auto begin_gindex =
static_cast<idx_t
>(first.pos());
113 auto end_gindex =
static_cast<idx_t
>(last.pos());
114 DASH_LOG_TRACE(
"local_index_range(GlobIt,GlobIt)",
115 begin_gindex, end_gindex);
117 const auto& pattern = first.pattern();
118 DASH_LOG_TRACE_VAR(
"local_index_range", pattern.local_size());
119 if (pattern.local_size() == 0) {
121 DASH_LOG_TRACE(
"local_index_range (lsize:0) ->", 0, 0);
125 idx_t lbegin_gindex = pattern.lbegin();
127 idx_t lend_gindex = pattern.lend();
128 DASH_LOG_TRACE_VAR(
"local_index_range", lbegin_gindex);
129 DASH_LOG_TRACE_VAR(
"local_index_range", lend_gindex);
130 if (lend_gindex <= begin_gindex ||
131 lbegin_gindex >= end_gindex) {
133 DASH_LOG_TRACE(
"local_index_range (intersect:0) >", 0, 0);
137 auto goffset_lbegin = std::max<idx_t>(lbegin_gindex, begin_gindex);
138 auto goffset_lend = std::min<idx_t>(lend_gindex, end_gindex);
140 auto lbegin_gcoords = pattern.coords(goffset_lbegin);
143 auto lend_gcoords = pattern.coords(goffset_lend-1);
145 auto lbegin_index = pattern.at(lbegin_gcoords);
148 auto lend_index = pattern.at(lend_gcoords);
150 == std::numeric_limits<typename pattern_t::index_type>::max()) {
151 DASH_LOG_ERROR(
"local_index_range !",
152 "index type too small for for local index range");
156 DASH_LOG_TRACE(
"local_index_range >", lbegin_index, lend_index);
183 template<
class GlobInputIter>
184 typename std::enable_if<
185 GlobInputIter::has_view::value,
190 const GlobInputIter & first,
192 const GlobInputIter & last)
194 typedef typename GlobInputIter::pattern_type pattern_t;
195 typedef typename pattern_t::index_type idx_t;
197 auto begin_gindex =
static_cast<idx_t
>(first.pos());
198 auto end_gindex =
static_cast<idx_t
>(last.pos());
199 DASH_LOG_TRACE(
"local_index_range(ViewIt,ViewIt)",
200 begin_gindex, end_gindex);
201 DASH_ASSERT_GT(begin_gindex+1, 0,
202 "local_index_range: begin.gidx must not be negative");
203 DASH_ASSERT_GT(end_gindex+1, 0,
204 "local_index_range: end.gidx must not be negative");
206 if (first.is_relative() && last.is_relative()) {
207 DASH_LOG_TRACE(
"local_index_range",
"input iterators are relative");
208 if (first.viewspec() == last.viewspec()) {
209 DASH_LOG_TRACE(
"local_index_range",
"input iterators in same view");
210 auto l_first = first.lpos();
211 bool first_is_local = l_first.unit == first.team().myid();
214 if (first_is_local) {
215 auto l_last_idx = last.lpos().index;
216 auto l_first_idx = l_first.index;
217 DASH_LOG_TRACE(
"local_index_range >", l_first_idx, l_last_idx);
220 DASH_LOG_TRACE(
"local_index_range >",
"not local -> (0,0)");
225 "dash::local_index_range: views of first and last iterators " 229 const auto& pattern = first.pattern();
230 DASH_LOG_TRACE_VAR(
"local_index_range", pattern.local_size());
231 if (pattern.local_size() == 0) {
233 DASH_LOG_TRACE(
"local_index_range (lsize:0) ->", 0, 0);
237 idx_t lbegin_gindex = pattern.lbegin();
239 idx_t lend_gindex = pattern.lend();
240 DASH_LOG_TRACE_VAR(
"local_index_range", lbegin_gindex);
241 DASH_LOG_TRACE_VAR(
"local_index_range", lend_gindex);
242 if (lend_gindex <= begin_gindex ||
243 lbegin_gindex >= end_gindex) {
245 DASH_LOG_TRACE(
"local_index_range (intersect:0)->", 0, 0);
249 auto goffset_lbegin = std::max<idx_t>(lbegin_gindex, begin_gindex);
250 auto goffset_lend = std::min<idx_t>(lend_gindex, end_gindex);
252 auto lbegin_gcoords = pattern.coords(goffset_lbegin);
255 auto lend_gcoords = pattern.coords(goffset_lend-1);
257 auto lbegin_index = pattern.at(lbegin_gcoords);
260 auto lend_index = pattern.at(lend_gcoords);
262 == std::numeric_limits<typename pattern_t::index_type>::max()) {
263 DASH_LOG_ERROR(
"local_index_range !",
264 "index type too small for for local index range");
268 DASH_LOG_TRACE(
"local_index_range ->", lbegin_index, lend_index);
293 template<
class GlobIterType>
297 const GlobIterType & first,
299 const GlobIterType & last)
301 typedef typename GlobIterType::pattern_type pattern_t;
302 typedef typename GlobIterType::value_type value_t;
303 typedef typename pattern_t::index_type idx_t;
304 DASH_LOG_TRACE(
"local_range()",
305 "gfirst.pos:", first.pos(),
306 "glast.pos:", last.pos());
309 idx_t lbegin_index = index_range.begin;
310 idx_t lend_index = index_range.end;
311 if (lbegin_index == lend_index) {
313 DASH_LOG_TRACE(
"local_range >",
"empty local range",
314 lbegin_index, lend_index);
318 const auto& pattern = first.pattern();
321 static_cast<typename GlobIterType::pointer>(first.globmem().begin()),
322 first.team().myid());
324 if (lbegin ==
nullptr) {
325 DASH_LOG_TRACE(
"local_range >",
"lbegin null");
328 DASH_LOG_TRACE(
"local_range >",
330 "l_idx_range:", lbegin_index,
"-", lend_index);
332 lbegin + lbegin_index,
333 lbegin + lend_index };
336 template<
class GlobIterType>
340 GlobIterType & first,
344 typedef typename GlobIterType::pattern_type pattern_t;
345 typedef typename GlobIterType::value_type value_t;
346 typedef typename pattern_t::index_type idx_t;
347 DASH_LOG_TRACE(
"local_range()",
348 "gfirst.pos:", first.pos(),
349 "glast.pos:", last.pos());
352 idx_t lbegin_index = index_range.begin;
353 idx_t lend_index = index_range.end;
354 if (lbegin_index == lend_index) {
356 DASH_LOG_TRACE(
"local_range >",
"empty local range",
357 lbegin_index, lend_index);
363 static_cast<typename GlobIterType::pointer>(first.globmem().begin()),
364 first.team().myid());
367 if (lbegin ==
nullptr) {
368 DASH_LOG_TRACE(
"local_range >",
"lbegin null");
371 DASH_LOG_TRACE(
"local_range >",
373 "l_idx_range:", lbegin_index,
"-", lend_index);
375 lbegin + lbegin_index,
376 lbegin + lend_index };
381 #include <dash/algorithm/LocalRanges.h> 383 #endif // DASH__ALGORITHM__LOCAL_RANGE_H__ DASH_CONSTEXPR std::enable_if< std::is_same< typename dash::memory_space_traits< MemSpaceT >::memory_space_layout_tag, memory_space_contiguous >::value, T >::type * local_begin(GlobPtr< T, MemSpaceT > global_begin, dash::team_unit_t unit)
Returns the begin of the local memory portion within a global memory segment.
constexpr std::enable_if< std::is_integral< IndexType >::value, IndexType >::type index(IndexType idx)
constexpr dash::IteratorRange< const Iterator, const Sentinel > make_range(const Iterator &begin, const Sentinel &end)
Adapter utility function.
constexpr auto end(RangeType &&range) -> decltype(std::forward< RangeType >(range).end())
constexpr auto local(ViewType &v) -> typename std::enable_if<(std::is_pointer< typename ViewType::iterator >::value||(dash::view_traits< ViewValueT >::is_local::value)), ViewType &>::type
This class is a simple memory pool which holds allocates elements of size ValueType.
constexpr auto begin(RangeType &&range) -> decltype(std::forward< RangeType >(range).begin())
LocalRange< const typename GlobIterType::value_type > local_range(const GlobIterType &first, const GlobIterType &last)
Resolves the local address range between global iterators.
int dim_t
Scalar type for a dimension value, with 0 indicating the first dimension.
constexpr dim_t ndim(const DimensionalType &d)
std::enable_if< !GlobInputIter::has_view::value, LocalIndexRange< typename GlobInputIter::pattern_type::index_type >>::type local_index_range(const GlobInputIter &first, const GlobInputIter &last)
Resolves the local index range between global iterators.
constexpr auto domain(ViewT &&view) -> typename std::enable_if< dash::detail::has_type_domain_type< ViewValueT >::value, decltype(std::forward< ViewT >(view).domain()) >::type