7#if defined(ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED) || defined(ALPAKA_ACC_CPU_B_SEQ_T_THREADS_ENABLED) \
8 || defined(ALPAKA_ACC_CPU_B_OMP2_T_SEQ_ENABLED) || defined(ALPAKA_ACC_CPU_B_SEQ_T_OMP2_ENABLED) \
9 || defined(ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED)
16# include <type_traits>
18# ifndef ALPAKA_DISABLE_ATOMIC_ATOMICREF
19# ifndef ALPAKA_HAS_STD_ATOMIC_REF
20# include <boost/atomic.hpp>
27# if defined(ALPAKA_HAS_STD_ATOMIC_REF)
50 "Type not supported by AtomicAtomicRef, please recompile defining "
51 "ALPAKA_DISABLE_ATOMIC_ATOMICREF.");
57 template<
typename T,
typename THierarchy>
64 return ref.fetch_add(value);
69 template<
typename T,
typename THierarchy>
76 return ref.fetch_sub(value);
81 template<
typename T,
typename THierarchy>
90 result = std::min(result, value);
91 while(!ref.compare_exchange_weak(old, result))
94 result = std::min(result, value);
101 template<
typename T,
typename THierarchy>
110 result = std::max(result, value);
111 while(!ref.compare_exchange_weak(old, result))
114 result = std::max(result, value);
121 template<
typename T,
typename THierarchy>
130 while(!ref.compare_exchange_weak(old, result))
139 template<
typename T,
typename THierarchy>
147 T result = ((old >= value) ? 0 :
static_cast<T
>(old + 1));
148 while(!ref.compare_exchange_weak(old, result))
150 result = ((old >= value) ? 0 :
static_cast<T
>(old + 1));
157 template<
typename T,
typename THierarchy>
165 T result = (old ==
static_cast<T
>(0) || old > value) ? value : (old -
static_cast<T
>(1));
166 while(!ref.compare_exchange_weak(old, result))
168 result = (old ==
static_cast<T
>(0) || old > value) ? value : (old -
static_cast<T
>(1));
175 template<
typename T,
typename THierarchy>
182 return ref.fetch_and(value);
187 template<
typename T,
typename THierarchy>
194 return ref.fetch_or(value);
199 template<
typename T,
typename THierarchy>
206 return ref.fetch_xor(value);
211 template<
typename T,
typename THierarchy>
226# if ALPAKA_COMP_GNUC || ALPAKA_COMP_CLANG
227# pragma GCC diagnostic push
228# pragma GCC diagnostic ignored "-Wfloat-equal"
230 result = ((old == compare) ? value : old);
231# if ALPAKA_COMP_GNUC || ALPAKA_COMP_CLANG
232# pragma GCC diagnostic pop
234 }
while(!ref.compare_exchange_weak(old, result));
The atomic ops based on atomic_ref for CPU accelerators.
boost::atomic_ref< T > atomic_ref
The alpaka accelerator library.
void isSupportedByAtomicAtomicRef()
The addition function object.
The compare and swap function object.
The decrement function object.
The exchange function object.
The increment function object.
The maximum function object.
The minimum function object.
The subtraction function object.
The exclusive or function object.
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &compare, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
static ALPAKA_FN_HOST auto atomicOp(AtomicAtomicRef const &, T *const addr, T const &value) -> T
The atomic operation trait.