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_WRAPPER_HPP_ 23 #define KOKKOS_DESUL_ATOMICS_WRAPPER_HPP_ 24 #include <Kokkos_Macros.hpp> 26 #ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS 27 #include <Kokkos_Atomics_Desul_Config.hpp> 28 #include <desul/atomics.hpp> 30 #include <impl/Kokkos_Atomic_Memory_Order.hpp> 31 #include <impl/Kokkos_Volatile_Load.hpp> 38 inline const char* atomic_query_version() {
return "KOKKOS_DESUL_ATOMICS"; }
40 #if defined(KOKKOS_COMPILER_GNU) && !defined(__PGIC__) && \ 41 !defined(__CUDA_ARCH__) 43 #define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) __builtin_prefetch(addr, 0, 0) 44 #define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) __builtin_prefetch(addr, 1, 0) 48 #define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) ((void)0) 49 #define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) ((void)0) 54 #ifdef KOKKOS_INTERNAL_NOT_PARALLEL 55 #define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeCaller() 57 #define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeDevice() 60 template<
class T> KOKKOS_INLINE_FUNCTION
61 T atomic_load(T*
const dest) {
return desul::atomic_load(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
63 template<
class T> KOKKOS_INLINE_FUNCTION
64 void atomic_store(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_store(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
66 template<
class T> KOKKOS_INLINE_FUNCTION
67 void atomic_assign(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { atomic_store(dest,val); }
69 KOKKOS_INLINE_FUNCTION
71 desul::atomic_thread_fence(desul::MemoryOrderSeqCst(), KOKKOS_DESUL_MEM_SCOPE);
74 KOKKOS_INLINE_FUNCTION
75 void load_fence() {
return desul::atomic_thread_fence(desul::MemoryOrderAcquire(), KOKKOS_DESUL_MEM_SCOPE); }
77 KOKKOS_INLINE_FUNCTION
78 void store_fence() {
return desul::atomic_thread_fence(desul::MemoryOrderRelease(), KOKKOS_DESUL_MEM_SCOPE); }
81 template<
class T> KOKKOS_INLINE_FUNCTION
82 T atomic_fetch_add (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_add (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
84 template<
class T> KOKKOS_INLINE_FUNCTION
85 T atomic_fetch_sub (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_sub (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
87 template<
class T> KOKKOS_INLINE_FUNCTION
88 T atomic_fetch_max (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_max (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
90 template<
class T> KOKKOS_INLINE_FUNCTION
91 T atomic_fetch_min (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_min (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
93 template<
class T> KOKKOS_INLINE_FUNCTION
94 T atomic_fetch_mul (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_mul (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
96 template<
class T> KOKKOS_INLINE_FUNCTION
97 T atomic_fetch_div (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_div (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
99 template<
class T> KOKKOS_INLINE_FUNCTION
100 T atomic_fetch_mod (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_mod (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
102 template<
class T> KOKKOS_INLINE_FUNCTION
103 T atomic_fetch_and (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_and (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
105 template<
class T> KOKKOS_INLINE_FUNCTION
106 T atomic_fetch_or (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_or (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
108 template<
class T> KOKKOS_INLINE_FUNCTION
109 T atomic_fetch_xor (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_xor (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
111 template<
class T> KOKKOS_INLINE_FUNCTION
112 T atomic_fetch_nand(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_nand(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
114 template<
class T> KOKKOS_INLINE_FUNCTION
115 T atomic_fetch_lshift(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_lshift(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
117 template<
class T> KOKKOS_INLINE_FUNCTION
118 T atomic_fetch_rshift(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_fetch_rshift(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
120 template<
class T> KOKKOS_INLINE_FUNCTION
121 T atomic_fetch_inc(T*
const dest) {
return desul::atomic_fetch_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
123 template<
class T> KOKKOS_INLINE_FUNCTION
124 T atomic_fetch_dec(T*
const dest) {
return desul::atomic_fetch_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
128 template<
class T> KOKKOS_INLINE_FUNCTION
129 T atomic_add_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_add_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
131 template<
class T> KOKKOS_INLINE_FUNCTION
132 T atomic_sub_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_sub_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
134 template<
class T> KOKKOS_INLINE_FUNCTION
135 T atomic_max_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_max_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
137 template<
class T> KOKKOS_INLINE_FUNCTION
138 T atomic_min_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_min_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
140 template<
class T> KOKKOS_INLINE_FUNCTION
141 T atomic_mul_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mul_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
143 template<
class T> KOKKOS_INLINE_FUNCTION
144 T atomic_div_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_div_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
146 template<
class T> KOKKOS_INLINE_FUNCTION
147 T atomic_mod_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mod_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
149 template<
class T> KOKKOS_INLINE_FUNCTION
150 T atomic_and_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_and_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
152 template<
class T> KOKKOS_INLINE_FUNCTION
153 T atomic_or_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_or_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
155 template<
class T> KOKKOS_INLINE_FUNCTION
156 T atomic_xor_fetch (T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_xor_fetch (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
158 template<
class T> KOKKOS_INLINE_FUNCTION
159 T atomic_nand_fetch(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_nand_fetch(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
161 template<
class T> KOKKOS_INLINE_FUNCTION
162 T atomic_lshift_fetch(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_lshift_fetch(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
164 template<
class T> KOKKOS_INLINE_FUNCTION
165 T atomic_rshift_fetch(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_rshift_fetch(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
167 template<
class T> KOKKOS_INLINE_FUNCTION
168 T atomic_inc_fetch(T*
const dest) {
return desul::atomic_inc_fetch(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
170 template<
class T> KOKKOS_INLINE_FUNCTION
171 T atomic_dec_fetch(T*
const dest) {
return desul::atomic_dec_fetch(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
175 template<
class T> KOKKOS_INLINE_FUNCTION
176 void atomic_add(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_add (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
178 template<
class T> KOKKOS_INLINE_FUNCTION
179 void atomic_sub(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_sub (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
181 template<
class T> KOKKOS_INLINE_FUNCTION
182 void atomic_mul(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_mul (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
184 template<
class T> KOKKOS_INLINE_FUNCTION
185 void atomic_div(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_div (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
187 template<
class T> KOKKOS_INLINE_FUNCTION
188 void atomic_min(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_min (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
190 template<
class T> KOKKOS_INLINE_FUNCTION
191 void atomic_max(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_max (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
194 template<
class T> KOKKOS_INLINE_FUNCTION
195 void atomic_and(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { (void) desul::atomic_fetch_and (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
198 template<
class T> KOKKOS_INLINE_FUNCTION
199 void atomic_or(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { (void) desul::atomic_fetch_or (dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
201 template<
class T> KOKKOS_INLINE_FUNCTION
202 void atomic_inc(T*
const dest) {
return desul::atomic_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
204 template<
class T> KOKKOS_INLINE_FUNCTION
205 void atomic_dec(T*
const dest) {
return desul::atomic_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
207 template<
class T> KOKKOS_INLINE_FUNCTION
208 void atomic_increment(T*
const dest) {
return desul::atomic_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
210 template<
class T> KOKKOS_INLINE_FUNCTION
211 void atomic_decrement(T*
const dest) {
return desul::atomic_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
215 template<
class T> KOKKOS_INLINE_FUNCTION
216 T atomic_exchange(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) {
return desul::atomic_exchange(dest, val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
218 template<
class T> KOKKOS_INLINE_FUNCTION
219 bool atomic_compare_exchange_strong(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> expected, desul::Impl::dont_deduce_this_parameter_t<const T> desired) {
220 T expected_ref = expected;
221 return desul::atomic_compare_exchange_strong(dest, expected_ref, desired,
222 desul::MemoryOrderRelaxed(), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
225 template<
class T> KOKKOS_INLINE_FUNCTION
226 T atomic_compare_exchange(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> compare, desul::Impl::dont_deduce_this_parameter_t<const T> desired) {
227 return desul::atomic_compare_exchange(dest, compare, desired,
228 desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
233 template<
class MemoryOrder>
234 struct KokkosToDesulMemoryOrder;
237 struct KokkosToDesulMemoryOrder<memory_order_seq_cst_t> {
238 using type = desul::MemoryOrderSeqCst;
241 struct KokkosToDesulMemoryOrder<memory_order_acquire_t> {
242 using type = desul::MemoryOrderAcquire;
245 struct KokkosToDesulMemoryOrder<memory_order_release_t> {
246 using type = desul::MemoryOrderRelease;
249 struct KokkosToDesulMemoryOrder<memory_order_acq_rel_t> {
250 using type = desul::MemoryOrderAcqRel;
253 struct KokkosToDesulMemoryOrder<memory_order_relaxed_t> {
254 using type = desul::MemoryOrderRelaxed;
256 template<
class T,
class MemOrderSuccess,
class MemOrderFailure> KOKKOS_INLINE_FUNCTION
257 bool atomic_compare_exchange_strong(T*
const dest, T& expected,
const T desired, MemOrderSuccess, MemOrderFailure) {
258 return desul::atomic_compare_exchange_strong(dest, expected, desired,
259 typename KokkosToDesulMemoryOrder<MemOrderSuccess>::type(),
260 typename KokkosToDesulMemoryOrder<MemOrderFailure>::type(),
261 KOKKOS_DESUL_MEM_SCOPE);
264 template<
class T,
class MemoryOrder>
265 KOKKOS_INLINE_FUNCTION
266 T atomic_load(
const T*
const src, MemoryOrder) {
267 return desul::atomic_load(src,
typename KokkosToDesulMemoryOrder<MemoryOrder>::type(), KOKKOS_DESUL_MEM_SCOPE);
269 template<
class T,
class MemoryOrder>
270 KOKKOS_INLINE_FUNCTION
271 void atomic_store(T*
const src,
const T val, MemoryOrder) {
272 return desul::atomic_store(src, val,
typename KokkosToDesulMemoryOrder<MemoryOrder>::type(), KOKKOS_DESUL_MEM_SCOPE);
278 #undef KOKKOS_DESUL_MEM_SCOPE 281 #endif // KOKKOS_ENABLE_IMPL_DESUL_ATOMICS