17 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE 18 #include <Kokkos_Macros.hpp> 20 "Including non-public Kokkos header files is not allowed.");
22 #ifndef KOKKOS_DESUL_ATOMICS_VOLATILE_WRAPPER_HPP_ 23 #define KOKKOS_DESUL_ATOMICS_VOLATILE_WRAPPER_HPP_ 24 #include <Kokkos_Macros.hpp> 25 #ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS 26 #include <Kokkos_Atomics_Desul_Config.hpp> 27 #include <desul/atomics.hpp> 29 #ifdef KOKKOS_INTERNAL_NOT_PARALLEL 30 #define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeCaller() 32 #define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeDevice() 38 template<
class T> KOKKOS_INLINE_FUNCTION
39 T atomic_load(
volatile T*
const dest) {
return desul::atomic_load(const_cast<T*>(dest), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
41 template<
class T> KOKKOS_INLINE_FUNCTION
42 void atomic_store(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_store(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
45 template<
class T> KOKKOS_INLINE_FUNCTION
46 T atomic_fetch_add (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_add (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
48 template<
class T> KOKKOS_INLINE_FUNCTION
49 T atomic_fetch_sub (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_sub (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
51 template<
class T> KOKKOS_INLINE_FUNCTION
52 T atomic_fetch_max (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_max (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
54 template<
class T> KOKKOS_INLINE_FUNCTION
55 T atomic_fetch_min (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_min (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
57 template<
class T> KOKKOS_INLINE_FUNCTION
58 T atomic_fetch_mul (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_mul (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
60 template<
class T> KOKKOS_INLINE_FUNCTION
61 T atomic_fetch_div (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_div (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
63 template<
class T> KOKKOS_INLINE_FUNCTION
64 T atomic_fetch_mod (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_mod (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
66 template<
class T> KOKKOS_INLINE_FUNCTION
67 T atomic_fetch_and (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_and (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
69 template<
class T> KOKKOS_INLINE_FUNCTION
70 T atomic_fetch_or (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_or (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
72 template<
class T> KOKKOS_INLINE_FUNCTION
73 T atomic_fetch_xor (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_xor (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
75 template<
class T> KOKKOS_INLINE_FUNCTION
76 T atomic_fetch_nand(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_nand(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
78 template<
class T> KOKKOS_INLINE_FUNCTION
79 T atomic_fetch_lshift(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_lshift(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
81 template<
class T> KOKKOS_INLINE_FUNCTION
82 T atomic_fetch_rshift(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_rshift(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
84 template<
class T> KOKKOS_INLINE_FUNCTION
85 T atomic_fetch_inc(
volatile T*
const dest) {
return desul::atomic_fetch_inc(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
87 template<
class T> KOKKOS_INLINE_FUNCTION
88 T atomic_fetch_dec(
volatile T*
const dest) {
return desul::atomic_fetch_dec(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
92 template<
class T> KOKKOS_INLINE_FUNCTION
93 T atomic_add_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_add_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
95 template<
class T> KOKKOS_INLINE_FUNCTION
96 T atomic_sub_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_sub_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
98 template<
class T> KOKKOS_INLINE_FUNCTION
99 T atomic_max_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_max_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
101 template<
class T> KOKKOS_INLINE_FUNCTION
102 T atomic_min_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_min_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
104 template<
class T> KOKKOS_INLINE_FUNCTION
105 T atomic_mul_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mul_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
107 template<
class T> KOKKOS_INLINE_FUNCTION
108 T atomic_div_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_div_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
110 template<
class T> KOKKOS_INLINE_FUNCTION
111 T atomic_mod_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mod_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
113 template<
class T> KOKKOS_INLINE_FUNCTION
114 T atomic_and_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_and_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
116 template<
class T> KOKKOS_INLINE_FUNCTION
117 T atomic_or_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_or_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
119 template<
class T> KOKKOS_INLINE_FUNCTION
120 T atomic_xor_fetch (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_xor_fetch (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
122 template<
class T> KOKKOS_INLINE_FUNCTION
123 T atomic_nand_fetch(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_nand_fetch(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
125 template<
class T> KOKKOS_INLINE_FUNCTION
126 T atomic_lshift_fetch(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_lshift_fetch(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
128 template<
class T> KOKKOS_INLINE_FUNCTION
129 T atomic_rshift_fetch(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_rshift_fetch(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
131 template<
class T> KOKKOS_INLINE_FUNCTION
132 T atomic_inc_fetch(
volatile T*
const dest) {
return desul::atomic_inc_fetch(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
134 template<
class T> KOKKOS_INLINE_FUNCTION
135 T atomic_dec_fetch(
volatile T*
const dest) {
return desul::atomic_dec_fetch(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
139 template<
class T> KOKKOS_INLINE_FUNCTION
140 void atomic_add(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_add (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
142 template<
class T> KOKKOS_INLINE_FUNCTION
143 void atomic_sub(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_sub (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
145 template<
class T> KOKKOS_INLINE_FUNCTION
146 void atomic_mul(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mul (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
148 template<
class T> KOKKOS_INLINE_FUNCTION
149 void atomic_div(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_div (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
151 template<
class T> KOKKOS_INLINE_FUNCTION
152 void atomic_min(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_min (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
154 template<
class T> KOKKOS_INLINE_FUNCTION
155 void atomic_max(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_max (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
158 template<
class T> KOKKOS_INLINE_FUNCTION
159 void atomic_and(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { (void) desul::atomic_fetch_and (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
162 template<
class T> KOKKOS_INLINE_FUNCTION
163 void atomic_or (
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { (void) desul::atomic_fetch_or (const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
165 template<
class T> KOKKOS_INLINE_FUNCTION
166 void atomic_inc(
volatile T*
const dest) {
return desul::atomic_inc(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
168 template<
class T> KOKKOS_INLINE_FUNCTION
169 void atomic_dec(
volatile T*
const dest) {
return desul::atomic_dec(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
171 template<
class T> KOKKOS_INLINE_FUNCTION
172 void atomic_increment(
volatile T*
const dest) {
return desul::atomic_inc(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
174 template<
class T> KOKKOS_INLINE_FUNCTION
175 void atomic_decrement(
volatile T*
const dest) {
return desul::atomic_dec(const_cast<T*>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
179 template<
class T> KOKKOS_INLINE_FUNCTION
180 T atomic_exchange(
volatile T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_exchange(const_cast<T*>(dest), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
182 template<
class T> KOKKOS_INLINE_FUNCTION
183 bool atomic_compare_exchange_strong(
volatile T*
const dest, T& expected,
const T desired) {
184 return desul::atomic_compare_exchange_strong(const_cast<T*>(dest),expected, desired,
185 desul::MemoryOrderRelaxed(), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
188 template<
class T> KOKKOS_INLINE_FUNCTION
189 T atomic_compare_exchange(
volatile T*
const dest,
const T compare,
const T desired) {
190 return desul::atomic_compare_exchange(const_cast<T*>(dest),compare, desired,
191 desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
195 #undef KOKKOS_DESUL_MEM_SCOPE 198 #endif // KOKKOS_ENABLE_IMPL_DESUL_ATOMICS