DASH  0.3.0
GlobSharedRef.h
1 #ifndef DASH__GLOB_SHARED_EF_H_
2 #define DASH__GLOB_SHARED_EF_H_
3 
4 #include <dash/Init.h>
5 #include <dash/internal/Logging.h>
6 #include <dash/Onesided.h>
7 #include <dash/algorithm/Operation.h>
8 
9 
10 namespace dash {
11 
12 // Forward declaration
13 template<typename T, class MemSpaceT> class GlobPtr;
14 
15 template<
16  typename T,
17  typename GlobalPointerType>
19 {
20  template<typename U, typename P>
21  friend std::ostream & operator<<(
22  std::ostream & os,
23  const GlobSharedRef<U, P> & gref);
24 
25 private:
27  self_t;
28 
29 public:
30  typedef GlobalPointerType global_pointer;
31  typedef GlobalPointerType const_global_pointer;
32  typedef T * local_pointer;
33  typedef const T * const_local_pointer;
34 
35 public:
40  template<typename U>
41  struct rebind {
42  typedef GlobSharedRef<
43  U,
44  // recursively rebind depending global pointer type:
45  typename GlobalPointerType::template rebind<U>
46  > other;
47  };
48 
49 private:
50  dart_gptr_t _gptr;
51  local_pointer _lptr;
52 
53 public:
59  : _gptr(DART_GPTR_NULL),
60  _lptr(nullptr)
61  { }
62 
67  explicit GlobSharedRef(
69  dart_gptr_t gptr,
70  local_pointer lptr)
71  : _gptr(gptr),
72  _lptr(lptr)
73  {
74  DASH_LOG_TRACE_VAR("GlobSharedRef(gptr,lptr)", gptr);
75  DASH_LOG_TRACE_VAR("GlobSharedRef(gptr,lptr)", lptr);
76  }
77 
82  template<class GlobalType>
85  GlobalType & gptr,
86  local_pointer lptr = nullptr)
87  : _gptr(gptr.dart_gptr()),
88  _lptr(lptr)
89  {
90  DASH_LOG_TRACE_VAR("GlobSharedRef(gptr,lptr)", gptr);
91  DASH_LOG_TRACE_VAR("GlobSharedRef(gptr,lptr)", lptr);
92  }
93 
100  local_pointer lptr)
101  : _gptr(DART_GPTR_NULL),
102  _lptr(lptr)
103  {
104  DASH_LOG_TRACE_VAR("GlobSharedRef(lptr)", lptr);
105  }
106 
111  explicit GlobSharedRef(dart_gptr_t dart_gptr)
112  : _gptr(dart_gptr),
113  _lptr(nullptr)
114  {
115  DASH_LOG_TRACE_VAR("GlobSharedRef(dart_gptr_t)", dart_gptr);
116  }
117 
123  const self_t & other)
124  : _gptr(other._gptr),
125  _lptr(other._lptr)
126  { }
127 
128 #if 0
129 
135  GlobSharedRef(const self_t & other) = delete;
136 #endif
137 
141  self_t & operator=(const self_t & other)
142  {
143  DASH_LOG_TRACE_VAR("GlobSharedRef.=()", other);
144  // This results in a dart_put, required for STL algorithms like
145  // std::copy to work on global ranges.
146  // TODO: Not well-defined:
147  // This violates copy semantics:
148  // GlobSharedRef(const GlobSharedRef & other)
149  // copies the GlobSharedRef instance while
150  // GlobSharedRef=(const GlobSharedRef & other)
151  // puts the value.
152  return *this = static_cast<T>(other);
153 // _gptr = other._gptr;
154 // return *this;
155  }
156 
157  inline bool operator==(const self_t & other) const noexcept
158  {
159  return _lptr == other._lptr && _gptr == other._gptr;
160  }
161 
162  inline bool operator!=(const self_t & other) const noexcept
163  {
164  return !(*this == other);
165  }
166 
167  operator T() const {
168  DASH_LOG_TRACE("GlobSharedRef.T()", "dereference");
169  if (_lptr != nullptr) {
170  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _lptr);
171  return *_lptr;
172  } else if (!DART_GPTR_ISNULL(_gptr)) {
173  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _gptr);
174  T t;
175  dash::internal::get_blocking(_gptr, &t, 1);
176  return t;
177  }
178  DASH_THROW(
180  "GlobSharedRef: dereferenced null-pointer");
181  }
182 
183 #if 0
184  friend void swap(self_t a, self_t b) {
185  T temp = (T)a;
186  a = b;
187  b = temp;
188  }
189 #endif
190 
191  T get() const {
192  DASH_LOG_TRACE("T GlobSharedRef.get()", "explicit get");
193  T t;
194  if (_lptr != nullptr) {
195  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _lptr);
196  t = *_lptr;
197  } else if (!DART_GPTR_ISNULL(_gptr)) {
198  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _gptr);
199  dash::internal::get_blocking(_gptr, &t, 1);
200  }
201  return t;
202  }
203 
204  void put(T & val) const {
205  DASH_LOG_TRACE("GlobSharedRef.put(T&)", "explicit put");
206  if (_lptr != nullptr) {
207  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _lptr);
208  *_lptr = val;
209  } else if (!DART_GPTR_ISNULL(_gptr)) {
210  DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _gptr);
211  dash::dart_storage<T> ds(1);
212  dash::internal::put_blocking(_gptr, &val, 1);
213  }
214  DASH_LOG_TRACE("GlobSharedRef.put >");
215  }
216 
217 // explicit operator global_pointer() const {
218 // DASH_LOG_TRACE("GlobSharedRef.global_pointer()", "conversion operator");
219 // DASH_LOG_TRACE_VAR("GlobSharedRef.T()", _gptr);
220 // return global_pointer(_gptr);
221 // }
222 
223  self_t & operator=(const T val) {
224  DASH_LOG_TRACE_VAR("GlobSharedRef.=()", val);
225  if (_lptr != nullptr) {
226  DASH_LOG_TRACE_VAR("GlobSharedRef.=", _lptr);
227  *_lptr = val;
228  } else if (!DART_GPTR_ISNULL(_gptr)) {
229  DASH_LOG_TRACE_VAR("GlobSharedRef.=", _gptr);
230  dash::internal::put_blocking(_gptr, &val, 1);
231  }
232  DASH_LOG_TRACE("GlobSharedRef.= >");
233  return *this;
234  }
235 
236  GlobSharedRef<T, GlobalPointerType> & operator+=(const T& ref)
237  {
238 #if 0
239  T add_val = ref;
240  T old_val;
241  dart_ret_t result = dart_fetch_and_op(
242  _gptr,
243  reinterpret_cast<void *>(&add_val),
244  reinterpret_cast<void *>(&old_val),
247  dash::Team::All().dart_id());
248  dart_flush(_gptr);
249 #else
250  T val = operator T();
251  val += ref;
252  operator=(val);
253 #endif
254  return *this;
255  }
256 
257  self_t & operator-=(const T& ref) {
258  T val = operator T();
259  val -= ref;
260  operator=(val);
261  return *this;
262  }
263 
264  self_t & operator++() {
265  T val = operator T();
266  ++val;
267  operator=(val);
268  return *this;
269  }
270 
271  self_t operator++(int) {
272  self_t result = *this;
273  T val = operator T();
274  ++val;
275  operator=(val);
276  return result;
277  }
278 
279  self_t & operator--() {
280  T val = operator T();
281  --val;
282  operator=(val);
283  return *this;
284  }
285 
286  self_t operator--(int) {
287  self_t result = *this;
288  T val = operator T();
289  --val;
290  operator=(val);
291  return result;
292  }
293 
294  self_t & operator*=(const T& ref) {
295  T val = operator T();
296  val *= ref;
297  operator=(val);
298  return *this;
299  }
300 
301  self_t & operator/=(const T& ref) {
302  T val = operator T();
303  val /= ref;
304  operator=(val);
305  return *this;
306  }
307 
308  self_t & operator^=(const T& ref) {
309  T val = operator T();
310  val ^= ref;
311  operator=(val);
312  return *this;
313  }
314 
315  dart_gptr_t dart_gptr() const {
316  return _gptr;
317  }
318 
319  local_pointer local() const {
320  return _lptr;
321  }
322 
327  bool is_local() const
328  {
329  if (_lptr == nullptr) {
330  return false;
331  }
332  dart_team_unit_t luid;
333  dart_team_myid(_gptr.teamid, &luid);
334  return _gptr.unitid == luid.id;
335  }
336 
337 };
338 
339 template<typename T, typename P>
340 std::ostream & operator<<(
341  std::ostream & os,
342  const GlobSharedRef<T, P> & gref) {
343  char buf[100];
344  sprintf(buf,
345  "(%06X|%02X|%04X|%04X|%016lX)",
346  gref._gptr.unitid,
347  gref._gptr.flags,
348  gref._gptr.segid,
349  gref._gptr.flags,
350  gref._gptr.addr_or_offs.offset);
351  os << "dash::GlobSharedRef<lptr: " << gref._lptr << ", " <<
352  "gptr: " << typeid(T).name() << ">" << buf;
353  return os;
354 }
355 
356 } // namespace dash
357 
358 #endif // DASH__GLOB_SHARED_REF_H_
GlobSharedRef(const self_t &other)
Copy constructor.
Reduce operands to their sum.
Definition: Operation.h:163
int16_t teamid
The team associated with the allocation.
Definition: dart_globmem.h:89
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
Definition: Local.h:28
dart_ret_t dart_team_myid(dart_team_t teamid, dart_team_unit_t *myid)
Return the unit id of the caller in the specified team.
GlobSharedRef()
Default constructor, creates an GlobSharedRef object referencing an element in global memory...
Definition: GlobSharedRef.h:58
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
union dart_gptr_t::@0 addr_or_offs
Absolute address or relative offset.
dart_unit_t unitid
The unit holding the memory element.
Definition: dart_globmem.h:83
Convert GlobSharedRef<T, GlobalPointer<T>> to GlobSharedRef<U, GlobalPointer<U>>. ...
Definition: GlobSharedRef.h:41
GlobSharedRef(GlobalType &gptr, local_pointer lptr=nullptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
Definition: GlobSharedRef.h:83
GlobSharedRef(local_pointer lptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
Definition: GlobSharedRef.h:98
self_t & operator=(const self_t &other)
Assignment operator.
Data type for storing a unit ID relative to a team.
Definition: dart_types.h:180
#define DART_GPTR_NULL
A NULL global pointer.
Definition: dart_globmem.h:105
GlobSharedRef(dart_gptr_t dart_gptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
GlobSharedRef(dart_gptr_t gptr, local_pointer lptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
Definition: GlobSharedRef.h:67
DART Global pointer type.
Definition: dart_globmem.h:77
#define DART_GPTR_ISNULL(gptr_)
Test for NULL global pointer.
Definition: dart_globmem.h:118
Type trait for mapping to DART data types.
Definition: Types.h:96
int16_t segid
The segment ID of the allocation.
Definition: dart_globmem.h:87
dart_ret_t
Return values of functions in the DART interface.
Definition: dart_types.h:30
dart_ret_t dart_fetch_and_op(dart_gptr_t gptr, const void *value, void *result, dart_datatype_t dtype, dart_operation_t op)
Perform an element-wise atomic update on the value of type dtype pointed to by gptr by applying the o...
Convencience wrapper to determine the DART type and number of elements required for the given templat...
Definition: Types.h:295
static Team & All()
The invariant Team instance containing all available units.
Definition: Team.h:213
void swap(dash::GlobRef< T > &&a, dash::GlobRef< T > &&b)
specialization for unqualified calls to swap
Definition: GlobRef.h:424
bool is_local() const
Checks whether the globally referenced element is in the calling unit&#39;s local memory.
Query the underlying dart_operation_t for arbitrary binary operations.
Definition: Operation.h:111
unsigned int flags
Reserved.
Definition: dart_globmem.h:85
dart_ret_t dart_flush(dart_gptr_t gptr)
Guarantee completion of all outstanding operations involving a segment on a certain unit...