20 #ifndef RAJA_pattern_atomic_HPP
21 #define RAJA_pattern_atomic_HPP
23 #include "RAJA/config.hpp"
91 template<
typename Policy,
typename T>
103 template<
typename Policy,
typename T>
116 template<
typename Policy,
typename T>
129 template<
typename Policy,
typename T>
142 template<
typename Policy,
typename T>
155 template<
typename Policy,
typename T>
167 template<
typename Policy,
typename T>
182 template<
typename Policy,
typename T>
194 template<
typename Policy,
typename T>
209 template<
typename Policy,
typename T>
223 template<
typename Policy,
typename T>
226 static_assert(std::is_integral<T>::value,
227 "atomicAnd can only be used on integral types");
239 template<
typename Policy,
typename T>
242 static_assert(std::is_integral<T>::value,
243 "atomicOr can only be used on integral types");
255 template<
typename Policy,
typename T>
258 static_assert(std::is_integral<T>::value,
259 "atomicXor can only be used on integral types");
270 template<
typename Policy,
typename T>
285 template<
typename Policy,
typename T>
300 template<
typename T,
typename Policy = auto_atomic>
329 RAJA::atomicStore<Policy>(m_value_ptr, rhs);
337 RAJA::atomicStore<Policy>(m_value_ptr, rhs);
349 operator value_type()
const {
return RAJA::atomicLoad<Policy>(m_value_ptr); }
356 return RAJA::atomicExchange<Policy>(m_value_ptr, rhs);
364 return RAJA::atomicCAS<Policy>(m_value_ptr, compare, rhs);
373 value_type old = RAJA::atomicCAS<Policy>(m_value_ptr, compare, rhs);
398 return RAJA::atomicInc<Policy>(m_value_ptr) + 1;
406 return RAJA::atomicInc<Policy>(m_value_ptr);
414 return RAJA::atomicDec<Policy>(m_value_ptr) - 1;
422 return RAJA::atomicDec<Policy>(m_value_ptr);
430 return RAJA::atomicAdd<Policy>(m_value_ptr, rhs);
438 return RAJA::atomicAdd<Policy>(m_value_ptr, rhs) + rhs;
446 return RAJA::atomicSub<Policy>(m_value_ptr, rhs);
454 return RAJA::atomicSub<Policy>(m_value_ptr, rhs) - rhs;
462 return RAJA::atomicMin<Policy>(m_value_ptr, rhs);
470 value_type old = RAJA::atomicMin<Policy>(m_value_ptr, rhs);
471 return old < rhs ? old : rhs;
479 return RAJA::atomicMax<Policy>(m_value_ptr, rhs);
487 value_type old = RAJA::atomicMax<Policy>(m_value_ptr, rhs);
488 return old > rhs ? old : rhs;
496 return RAJA::atomicAnd<Policy>(m_value_ptr, rhs);
504 return RAJA::atomicAnd<Policy>(m_value_ptr, rhs) & rhs;
512 return RAJA::atomicOr<Policy>(m_value_ptr, rhs);
520 return RAJA::atomicOr<Policy>(m_value_ptr, rhs) | rhs;
528 return RAJA::atomicXor<Policy>(m_value_ptr, rhs);
536 return RAJA::atomicXor<Policy>(m_value_ptr, rhs) ^ rhs;
RAJA header file defining automatic and builtin atomic operations.
RAJA header file defining automatic and builtin atomic operations.
Atomic wrapper object.
Definition: atomic.hpp:302
RAJA_INLINE constexpr RAJA_HOST_DEVICE AtomicRef(AtomicRef const &c)
Definition: atomic.hpp:315
RAJA_INLINE RAJA_HOST_DEVICE value_type operator++() const
Definition: atomic.hpp:396
RAJA_INLINE RAJA_HOST_DEVICE void store(value_type rhs) const
Definition: atomic.hpp:327
RAJA_INLINE RAJA_HOST_DEVICE value_type max(value_type rhs) const
Definition: atomic.hpp:485
RAJA_INLINE RAJA_HOST_DEVICE bool compare_exchange_strong(value_type &expect, value_type rhs) const
Definition: atomic.hpp:370
RAJA_INLINE RAJA_HOST_DEVICE value_type operator-=(value_type rhs) const
Definition: atomic.hpp:452
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_max(value_type rhs) const
Definition: atomic.hpp:477
RAJA_INLINE RAJA_HOST_DEVICE value_type CAS(value_type compare, value_type rhs) const
Definition: atomic.hpp:362
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_xor(value_type rhs) const
Definition: atomic.hpp:526
RAJA_INLINE RAJA_HOST_DEVICE value_type operator^=(value_type rhs) const
Definition: atomic.hpp:534
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_add(value_type rhs) const
Definition: atomic.hpp:428
RAJA_INLINE RAJA_HOST_DEVICE value_type operator=(value_type rhs) const
Definition: atomic.hpp:335
RAJA_INLINE RAJA_HOST_DEVICE value_type * getPointer() const
Definition: atomic.hpp:322
RAJA_INLINE RAJA_HOST_DEVICE value_type operator+=(value_type rhs) const
Definition: atomic.hpp:436
RAJA_INLINE RAJA_HOST_DEVICE value_type operator++(int) const
Definition: atomic.hpp:404
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_sub(value_type rhs) const
Definition: atomic.hpp:444
RAJA_INLINE RAJA_HOST_DEVICE value_type operator--() const
Definition: atomic.hpp:412
RAJA_INLINE RAJA_HOST_DEVICE value_type min(value_type rhs) const
Definition: atomic.hpp:468
RAJA_INLINE RAJA_HOST_DEVICE value_type operator&=(value_type rhs) const
Definition: atomic.hpp:502
T value_type
Definition: atomic.hpp:304
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_min(value_type rhs) const
Definition: atomic.hpp:460
RAJA_INLINE RAJA_HOST_DEVICE value_type exchange(value_type rhs) const
Definition: atomic.hpp:354
RAJA_INLINE RAJA_HOST_DEVICE value_type load() const
Definition: atomic.hpp:344
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_or(value_type rhs) const
Definition: atomic.hpp:510
RAJA_INLINE RAJA_HOST_DEVICE bool compare_exchange_weak(value_type &expect, value_type rhs) const
Definition: atomic.hpp:388
RAJA_INLINE RAJA_HOST_DEVICE value_type fetch_and(value_type rhs) const
Definition: atomic.hpp:494
RAJA_INLINE RAJA_HOST_DEVICE value_type operator--(int) const
Definition: atomic.hpp:420
AtomicRef & operator=(AtomicRef const &)=delete
RAJA_INLINE RAJA_HOST_DEVICE value_type operator|=(value_type rhs) const
Definition: atomic.hpp:518
RAJA_INLINE constexpr RAJA_HOST_DEVICE AtomicRef(value_type *value_ptr)
Definition: atomic.hpp:309
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_SUPPRESS_HD_WARN
Definition: macros.hpp:68
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicAnd(T *acc, T value)
Atomic bitwise AND equivalent to (*acc) = (*acc) & value This only works with integral data types.
Definition: atomic.hpp:224
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicOr(T *acc, T value)
Atomic bitwise OR equivalent to (*acc) = (*acc) | value This only works with integral data types.
Definition: atomic.hpp:240
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicLoad(T *acc)
Atomic load.
Definition: atomic.hpp:92
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicDec(T *acc)
Atomic decrement.
Definition: atomic.hpp:195
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicAdd(T *acc, T value)
Atomic add.
Definition: atomic.hpp:117
Policy
Definition: PolicyBase.hpp:32
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicXor(T *acc, T value)
Atomic bitwise XOR equivalent to (*acc) = (*acc) ^ value This only works with integral data types.
Definition: atomic.hpp:256
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE void atomicStore(T *acc, T value)
Atomic store.
Definition: atomic.hpp:104
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicMax(T *acc, T value)
Atomic maximum equivalent to (*acc) = std::max(*acc, value)
Definition: atomic.hpp:156
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicCAS(T *acc, T compare, T value)
Atomic compare and swap.
Definition: atomic.hpp:286
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicInc(T *acc)
Atomic increment.
Definition: atomic.hpp:168
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicMin(T *acc, T value)
Atomic minimum equivalent to (*acc) = std::min(*acc, value)
Definition: atomic.hpp:143
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicSub(T *acc, T value)
Atomic subtract.
Definition: atomic.hpp:130
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicExchange(T *acc, T value)
Atomic value exchange.
Definition: atomic.hpp:271