1 #ifndef DASH__GLOB_SHARED_EF_H_ 2 #define DASH__GLOB_SHARED_EF_H_ 5 #include <dash/internal/Logging.h> 6 #include <dash/Onesided.h> 7 #include <dash/algorithm/Operation.h> 13 template<
typename T,
class MemSpaceT>
class GlobPtr;
17 typename GlobalPointerType>
20 template<
typename U,
typename P>
21 friend std::ostream & operator<<(
30 typedef GlobalPointerType global_pointer;
31 typedef GlobalPointerType const_global_pointer;
32 typedef T * local_pointer;
33 typedef const T * const_local_pointer;
45 typename GlobalPointerType::template
rebind<U> 74 DASH_LOG_TRACE_VAR(
"GlobSharedRef(gptr,lptr)", gptr);
75 DASH_LOG_TRACE_VAR(
"GlobSharedRef(gptr,lptr)", lptr);
82 template<
class GlobalType>
86 local_pointer lptr =
nullptr)
87 : _gptr(gptr.dart_gptr()),
90 DASH_LOG_TRACE_VAR(
"GlobSharedRef(gptr,lptr)", gptr);
91 DASH_LOG_TRACE_VAR(
"GlobSharedRef(gptr,lptr)", lptr);
104 DASH_LOG_TRACE_VAR(
"GlobSharedRef(lptr)", lptr);
115 DASH_LOG_TRACE_VAR(
"GlobSharedRef(dart_gptr_t)", dart_gptr);
123 const self_t & other)
124 : _gptr(other._gptr),
143 DASH_LOG_TRACE_VAR(
"GlobSharedRef.=()", other);
152 return *
this =
static_cast<T
>(other);
157 inline bool operator==(
const self_t & other)
const noexcept
159 return _lptr == other._lptr && _gptr == other._gptr;
162 inline bool operator!=(
const self_t & other)
const noexcept
164 return !(*
this == other);
168 DASH_LOG_TRACE(
"GlobSharedRef.T()",
"dereference");
169 if (_lptr !=
nullptr) {
170 DASH_LOG_TRACE_VAR(
"GlobSharedRef.T()", _lptr);
173 DASH_LOG_TRACE_VAR(
"GlobSharedRef.T()", _gptr);
175 dash::internal::get_blocking(_gptr, &t, 1);
180 "GlobSharedRef: dereferenced null-pointer");
184 friend void swap(self_t a, self_t b) {
192 DASH_LOG_TRACE(
"T GlobSharedRef.get()",
"explicit get");
194 if (_lptr !=
nullptr) {
195 DASH_LOG_TRACE_VAR(
"GlobSharedRef.T()", _lptr);
198 DASH_LOG_TRACE_VAR(
"GlobSharedRef.T()", _gptr);
199 dash::internal::get_blocking(_gptr, &t, 1);
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);
210 DASH_LOG_TRACE_VAR(
"GlobSharedRef.T()", _gptr);
212 dash::internal::put_blocking(_gptr, &val, 1);
214 DASH_LOG_TRACE(
"GlobSharedRef.put >");
224 DASH_LOG_TRACE_VAR(
"GlobSharedRef.=()", val);
225 if (_lptr !=
nullptr) {
226 DASH_LOG_TRACE_VAR(
"GlobSharedRef.=", _lptr);
229 DASH_LOG_TRACE_VAR(
"GlobSharedRef.=", _gptr);
230 dash::internal::put_blocking(_gptr, &val, 1);
232 DASH_LOG_TRACE(
"GlobSharedRef.= >");
243 reinterpret_cast<void *>(&add_val),
244 reinterpret_cast<void *>(&old_val),
250 T val =
operator T();
257 self_t & operator-=(
const T& ref) {
258 T val =
operator T();
264 self_t & operator++() {
265 T val =
operator T();
271 self_t operator++(
int) {
272 self_t result = *
this;
273 T val =
operator T();
279 self_t & operator--() {
280 T val =
operator T();
286 self_t operator--(
int) {
287 self_t result = *
this;
288 T val =
operator T();
294 self_t & operator*=(
const T& ref) {
295 T val =
operator T();
301 self_t & operator/=(
const T& ref) {
302 T val =
operator T();
308 self_t & operator^=(
const T& ref) {
309 T val =
operator T();
319 local_pointer
local()
const {
329 if (_lptr ==
nullptr) {
334 return _gptr.
unitid == luid.id;
339 template<
typename T,
typename P>
340 std::ostream & operator<<(
345 "(%06X|%02X|%04X|%04X|%016lX)",
351 os <<
"dash::GlobSharedRef<lptr: " << gref._lptr <<
", " <<
352 "gptr: " <<
typeid(T).name() <<
">" << buf;
358 #endif // DASH__GLOB_SHARED_REF_H_ GlobSharedRef(const self_t &other)
Copy constructor.
Reduce operands to their sum.
int16_t teamid
The team associated with the allocation.
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
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...
This class is a simple memory pool which holds allocates elements of size ValueType.
union dart_gptr_t::@0 addr_or_offs
Absolute address or relative offset.
dart_unit_t unitid
The unit holding the memory element.
Convert GlobSharedRef<T, GlobalPointer<T>> to GlobSharedRef<U, GlobalPointer<U>>. ...
GlobSharedRef(GlobalType &gptr, local_pointer lptr=nullptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
GlobSharedRef(local_pointer lptr)
Constructor, creates an GlobSharedRef object referencing an element in global memory.
self_t & operator=(const self_t &other)
Assignment operator.
Data type for storing a unit ID relative to a team.
#define DART_GPTR_NULL
A NULL global pointer.
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.
DART Global pointer type.
#define DART_GPTR_ISNULL(gptr_)
Test for NULL global pointer.
Type trait for mapping to DART data types.
int16_t segid
The segment ID of the allocation.
dart_ret_t
Return values of functions in the DART interface.
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...
static Team & All()
The invariant Team instance containing all available units.
void swap(dash::GlobRef< T > &&a, dash::GlobRef< T > &&b)
specialization for unqualified calls to swap
bool is_local() const
Checks whether the globally referenced element is in the calling unit's local memory.
Query the underlying dart_operation_t for arbitrary binary operations.
unsigned int flags
Reserved.
dart_ret_t dart_flush(dart_gptr_t gptr)
Guarantee completion of all outstanding operations involving a segment on a certain unit...