DASH  0.3.0
LocalityDomain.h
1 #ifndef DASH__UTIL__LOCALITY_DOMAIN_H__INCLUDED
2 #define DASH__UTIL__LOCALITY_DOMAIN_H__INCLUDED
3 
4 #include <dash/util/Locality.h>
5 
8 
9 #include <dash/algorithm/internal/String.h>
10 
11 #include <dash/Exception.h>
12 
13 #include <string>
14 #include <vector>
15 #include <unordered_map>
16 #include <utility>
17 #include <iterator>
18 #include <algorithm>
19 #include <functional>
20 
21 
22 namespace dash {
23 namespace util {
24 
25 namespace internal {
26 
30  template< typename LocalityDomainT >
31  class LocalityDomainIterator
32  : public std::iterator< std::random_access_iterator_tag, LocalityDomainT >
33  {
34  template< typename LocalityDomainT_ >
35  friend class LocalityDomainIterator;
36 
37  private:
38  typedef LocalityDomainIterator<LocalityDomainT> self_t;
39 
40  public:
41  typedef LocalityDomainIterator<LocalityDomainT> self_type;
42  typedef int difference_type;
43 
44  typedef LocalityDomainT value_type;
45  typedef LocalityDomainT * pointer;
46  typedef const LocalityDomainT * const_pointer;
47  typedef LocalityDomainT & reference;
48  typedef const LocalityDomainT & const_reference;
49 
50  public:
51 
52  LocalityDomainIterator(
53  LocalityDomainT & domain,
54  int subdomain_idx = 0)
55  : _domain(&domain),
56  _idx(subdomain_idx)
57  { }
58 
59  LocalityDomainIterator() = default;
60 
61  template< typename LocalityDomainT_Other >
62  LocalityDomainIterator(
63  const LocalityDomainIterator<LocalityDomainT_Other> & other)
64  : _domain(const_cast<LocalityDomainT *>(other._domain)),
65  _idx(other._idx)
66  { }
67 
68  bool operator==(const self_type & rhs) const {
69  return *_domain == *(rhs._domain) && _idx == rhs._idx;
70  }
71 
72  bool operator!=(const self_type & rhs) const {
73  return !(*this == rhs);
74  }
75 
76  reference operator[](int i)
77  {
78  DASH_ASSERT(_domain != nullptr);
79  int subdomain_idx = _idx + i;
80  return _domain->at(subdomain_idx);
81  }
82 
83  const_reference operator[](int i) const
84  {
85  DASH_ASSERT(_domain != nullptr);
86  int subdomain_idx = _idx + i;
87  return _domain->at(subdomain_idx);
88  }
89 
90  reference operator*()
91  {
92  DASH_ASSERT(_domain != nullptr);
93  return _domain->at(_idx);
94  }
95 
96  const_reference operator*() const
97  {
98  DASH_ASSERT(_domain != nullptr);
99  return _domain->at(_idx);
100  }
101 
102  pointer operator->()
103  {
104  DASH_ASSERT(_domain != nullptr);
105  return &(_domain->at(_idx));
106  }
107 
108  const_pointer operator->() const
109  {
110  DASH_ASSERT(_domain != nullptr);
111  return &(_domain->at(_idx));
112  }
113 
114  self_t & operator++() { _idx++; return *this; }
115  self_t & operator--() { _idx--; return *this; }
116  self_t & operator+=(int i) { _idx+= i; return *this; }
117  self_t & operator-=(int i) { _idx-= i; return *this; }
118  self_t operator+(int i) { self_t ret = *this; ret += i; return ret; }
119  self_t operator-(int i) { self_t ret = *this; ret -= i; return ret; }
120  self_t operator++(int) { self_t ret = *this; _idx++; return ret; }
121  self_t operator--(int) { self_t ret = *this; _idx--; return ret; }
122 
123  private:
124  LocalityDomainT * _domain = nullptr;
125  int _idx = 0;
126 
127  }; // class LocalityDomain::iterator
128 
129 }
130 
155 {
156 private:
157  typedef LocalityDomain self_t;
158  typedef dash::util::Locality::Scope Scope_t;
159 
160 public:
161  typedef internal::LocalityDomainIterator<self_t> iterator;
162  typedef internal::LocalityDomainIterator<const self_t> const_iterator;
163 
164 private:
166  const self_t & parent,
168 
169 private:
171  dart_domain_locality_t * _domain = nullptr;
173  std::string _domain_tag = ".";
177  mutable std::unordered_map<int, self_t> * _subdomains = nullptr;
179  std::vector<global_unit_t> _unit_ids;
180 #if 0
181  std::unordered_map<team_unit_t, UnitLocality_t> _unit_localities;
184 #endif
185  iterator _begin;
188  iterator _end;
190  bool _is_owner = false;
192  std::vector<iterator> _groups;
193  std::vector<std::string> _group_domain_tags;
195  std::vector<self_t> _parts;
196 
197 public:
198  LocalityDomain() = default;
199 
200  explicit LocalityDomain(
201  const dart_domain_locality_t & domain);
202 
203  explicit LocalityDomain(
204  dart_domain_locality_t * domain);
205 
206  ~LocalityDomain();
207 
209  const self_t & other);
210 
212  self_t && other);
213 
214  self_t & operator=(
215  const self_t & other);
216 
217  self_t & operator=(
218  self_t && other);
219 
220  inline bool operator==(
221  const self_t & rhs) const {
222  return ( (_domain == rhs._domain)
223  ||
224  ( (_domain != nullptr &&
225  rhs._domain != nullptr)
226  &&
227  (_domain->team
228  == rhs._domain->team &&
229  _domain->domain_tag
230  == rhs._domain->domain_tag) ) );
231  }
232 
233  inline bool operator!=(
234  const self_t & rhs) const {
235  return !(*this == rhs);
236  }
237 
242  self_t & select(
243  const std::vector<std::string> & subdomain_tags);
244 
249  self_t & exclude(
250  const std::vector<std::string> & subdomain_tags);
251 
255  self_t & group(
256  const std::vector<std::string> & group_subdomain_tags);
257 
264  self_t & split(
265  dash::util::Locality::Scope scope,
266  int num_split_parts);
267 
271  self_t & split_groups();
272 
277  const self_t & at(
278  int relative_index) const;
279 
284  self_t & at(
285  int relative_index);
286 
290  const_iterator find(
291  const std::string & subdomain_tag) const;
292 
296  iterator find(
297  const std::string & subdomain_tag);
298 
299  inline std::vector<iterator> & groups()
300  {
301  return _groups;
302  }
303 
304  inline const std::vector<iterator> & groups() const
305  {
306  return _groups;
307  }
308 
309  inline std::vector<self_t> & parts()
310  {
311  return _parts;
312  }
313 
314  inline const std::vector<self_t> & parts() const
315  {
316  return _parts;
317  }
318 
319  inline std::vector<self_t> scope_domains(
320  dash::util::Locality::Scope scope) const
321  {
322  std::vector<self_t> scope_domains;
323  int num_scope_domains;
324 
325  dart_domain_locality_t ** dart_scope_domains;
327  _domain,
328  static_cast<dart_locality_scope_t>(scope),
329  &num_scope_domains,
330  &dart_scope_domains);
331  (void)ret; // suppress warning
332  DASH_ASSERT(DART_OK == ret || DART_ERR_NOTFOUND == ret);
333 
334  DASH_LOG_TRACE_VAR("LocalityDomain.scope_domains", num_scope_domains);
335  if (num_scope_domains > 0) {
336  scope_domains.reserve(num_scope_domains);
337  for (int sd = 0; sd < num_scope_domains; sd++) {
338  DASH_LOG_TRACE("LocalityDomain.scope_domains",
339  "scope_domains[", sd, "]", ":",
340  dart_scope_domains[sd]->domain_tag);
341  scope_domains.emplace_back(*dart_scope_domains[sd]);
342  }
343  free(dart_scope_domains);
344  }
345  return scope_domains;
346  }
347 
348 #if 0
349  inline const UnitLocality_t & unit_locality(
350  team_unit_t unit) const
351  {
352  if (nullptr == _parent) {
353  return (*_unit_localities.find(unit)).second;
354  }
355  return _parent->unit_locality(unit);
356  }
357 
358  inline UnitLocality_t & unit_locality(
359  team_unit_t unit)
360  {
361  if (nullptr == _parent) {
362  return _unit_localities[unit];
363  }
364  return _parent->unit_locality(unit);
365  }
366 #endif
367 
368  inline dart_team_t dart_team() const
369  {
370  if (nullptr == _domain) {
371  return DART_TEAM_NULL;
372  }
373  return _domain->team;
374  }
375 
376  inline const std::string & domain_tag() const
377  {
378  return _domain_tag;
379  }
380 
381  inline const dart_domain_locality_t & dart_type() const
382  {
383  DASH_ASSERT(_domain != nullptr);
384  return *_domain;
385  }
386 
387  inline std::string host() const
388  {
389  DASH_ASSERT(_domain != nullptr);
390  return _domain->host;
391  }
392 
393  inline int shared_mem_bytes() const
394  {
395  DASH_ASSERT(_domain != nullptr);
396  return _domain->shared_mem_bytes;
397  }
398 
399  inline iterator begin()
400  {
401  return _begin;
402  }
403 
404  inline const_iterator begin() const
405  {
406  return const_iterator(_begin);
407  }
408 
409  inline iterator end()
410  {
411  return _end;
412  }
413 
414  inline const_iterator end() const
415  {
416  return const_iterator(_end);
417  }
418 
419  inline size_t size() const
420  {
421  return _domain == nullptr
422  ? 0
423  : _domain->num_domains;
424  }
425 
426  inline const std::vector<global_unit_t> & units() const
427  {
428  return _unit_ids;
429  }
430 
431  inline std::vector<global_unit_t> & units()
432  {
433  return _unit_ids;
434  }
435 
439  inline global_unit_t leader_unit() const
440  {
441  // TODO: Optimize
442 
443  // Unit 0 is default leader if contained in the domain:
444  if (std::find(_unit_ids.begin(), _unit_ids.end(), global_unit_t(0))
445  != _unit_ids.end()) {
446  return global_unit_t(0);
447  }
448  return _unit_ids.front();
449  }
450 
451  inline int level() const
452  {
453  return (nullptr == _domain ? -1 : _domain->level);
454  }
455 
456  inline Scope_t scope() const
457  {
458  return _domain == nullptr
459  ? Scope_t::Undefined
460  : static_cast<Scope_t>(_domain->scope);
461  }
462 
463  inline int node_id() const
464  {
465  return (nullptr == _domain ? -1 : _domain->node_id);
466  }
467 
468  inline int num_nodes() const
469  {
470  return (nullptr == _domain ? -1 : _domain->num_nodes);
471  }
472 
473  inline int num_cores() const
474  {
475  return (nullptr == _domain ? -1 : _domain->num_cores);
476  }
477 
478  inline int global_index() const
479  {
480  return (nullptr == _domain ? -1 : _domain->global_index);
481  }
482 
483  inline int relative_index() const
484  {
485  return (nullptr == _domain ? -1 : _domain->num_cores);
486  }
487 
488 private:
489 
490  inline void init(
491  dart_domain_locality_t * domain);
492 
493  inline void collect_groups(
494  const std::vector<std::string> & group_domain_tags)
495  {
496  _groups.clear();
497  for (const auto& gdt : group_domain_tags) {
498  _groups.push_back(find(gdt));
499  }
500  }
501 
502 }; // class LocalityDomain
503 
504 std::ostream & operator<<(
505  std::ostream & os,
506  const dash::util::LocalityDomain & domain_loc);
507 
508 } // namespace util
509 } // namespace dash
510 
511 #endif // DASH__UTIL__LOCALITY_DOMAIN_H__INCLUDED
Returns second operand.
Definition: Operation.h:218
size_t size()
Return the number of units in the global team.
constexpr auto end(RangeType &&range) -> decltype(std::forward< RangeType >(range).end())
Definition: Range.h:98
dart_ret_t dart_domain_scope_domains(const dart_domain_locality_t *domain_in, dart_locality_scope_t scope, int *num_domains_out, dart_domain_locality_t ***domains_out)
Locality domains at the specified locality scope.
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
Signals success.
Definition: dart_types.h:33
constexpr auto begin(RangeType &&range) -> decltype(std::forward< RangeType >(range).begin())
Definition: Range.h:89
char domain_tag[((int)(32))]
Hierarchical domain identifier, represented as dot-separated list of relative indices on every level ...
Definition: dart_types.h:606
struct dash::unit_id< dash::global_unit, dart_global_unit_t > global_unit_t
Unit ID to use for global IDs.
Definition: Types.h:332
global_unit_t leader_unit() const
ID of leader unit in the locality domain.
dart_team_t team
Team associated with the domain.
Definition: dart_types.h:636
int num_domains
Number of subordinate domains.
Definition: dart_types.h:627
DASH_CONSTEXPR auto operator-(const GlobIter< ElementType, Pattern, GlobMemType, Pointer, Reference > &lhs, const GlobIter< ElementType, Pattern, GlobMemType, Pointer, Reference > &rhs) DASH_NOEXCEPT
Definition: Iterator.h:147
int level
Level in the domain locality hierarchy.
Definition: dart_types.h:615
A domain is a group of processing entities such as cores in a specific NUMA domain or a Intel MIC ent...
Definition: dart_types.h:597
char host[((int)(256))]
Hostname of the domain&#39;s node or 0 if unspecified.
Definition: dart_types.h:600
int global_index
The domain&#39;s global index within its scope.
Definition: dart_types.h:618
dart_locality_scope_t scope
Locality scope of the domain.
Definition: dart_types.h:613
struct dash::unit_id< dash::local_unit, dart_team_unit_t > team_unit_t
Unit ID to use for team-local IDs.
Definition: Types.h:319
Wrapper of a single dart_domain_locality_t object.
dart_ret_t
Return values of functions in the DART interface.
Definition: dart_types.h:30
int16_t dart_team_t
Data type for storing a team ID.
Definition: dart_types.h:252
GlobIter find(GlobIter first, GlobIter last, const ElementType &value)
Returns an iterator to the first element in the range [first,last) that compares equal to val...
Definition: Find.h:22
Missing data encountered.
Definition: dart_types.h:39
void init(int *argc, char ***argv)
Initialize the DASH library and the underlying runtime system.
constexpr auto domain(ViewT &&view) -> typename std::enable_if< dash::detail::has_type_domain_type< ViewValueT >::value, decltype(std::forward< ViewT >(view).domain()) >::type
Definition: Domain.h:23