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#include <Kokkos_Atomics_Desul_Config.hpp>
27#include <desul/atomics.hpp>
29#include <impl/Kokkos_Volatile_Load.hpp>
36inline const char* atomic_query_version() {
return "KOKKOS_DESUL_ATOMICS"; }
38#if defined(KOKKOS_COMPILER_GNU) && !defined(__PGIC__) && \
39 !defined(__CUDA_ARCH__)
41#define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) __builtin_prefetch(addr, 0, 0)
42#define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) __builtin_prefetch(addr, 1, 0)
46#define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) ((void)0)
47#define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) ((void)0)
52#ifdef KOKKOS_INTERNAL_NOT_PARALLEL
53#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeCaller()
55#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeDevice()
58template<
class T> KOKKOS_INLINE_FUNCTION
59T atomic_load(T*
const dest) {
return desul::atomic_load(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
61template<
class T> KOKKOS_INLINE_FUNCTION
62void 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); }
64template<
class T> KOKKOS_INLINE_FUNCTION
65void atomic_assign(T*
const dest, desul::Impl::dont_deduce_this_parameter_t<const T> val) { atomic_store(dest,val); }
69 desul::atomic_thread_fence(desul::MemoryOrderSeqCst(), KOKKOS_DESUL_MEM_SCOPE);
73void load_fence() {
return desul::atomic_thread_fence(desul::MemoryOrderAcquire(), KOKKOS_DESUL_MEM_SCOPE); }
76void store_fence() {
return desul::atomic_thread_fence(desul::MemoryOrderRelease(), KOKKOS_DESUL_MEM_SCOPE); }
79template<
class T> KOKKOS_INLINE_FUNCTION
80T 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); }
82template<
class T> KOKKOS_INLINE_FUNCTION
83T 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); }
85template<
class T> KOKKOS_INLINE_FUNCTION
86T 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); }
88template<
class T> KOKKOS_INLINE_FUNCTION
89T 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); }
91template<
class T> KOKKOS_INLINE_FUNCTION
92T 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); }
94template<
class T> KOKKOS_INLINE_FUNCTION
95T 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); }
97template<
class T> KOKKOS_INLINE_FUNCTION
98T 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); }
100template<
class T> KOKKOS_INLINE_FUNCTION
101T 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); }
103template<
class T> KOKKOS_INLINE_FUNCTION
104T 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); }
106template<
class T> KOKKOS_INLINE_FUNCTION
107T 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); }
109template<
class T> KOKKOS_INLINE_FUNCTION
110T 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); }
112template<
class T> KOKKOS_INLINE_FUNCTION
113T 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); }
115template<
class T> KOKKOS_INLINE_FUNCTION
116T 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); }
118template<
class T> KOKKOS_INLINE_FUNCTION
119T atomic_fetch_inc(T*
const dest) {
return desul::atomic_fetch_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
121template<
class T> KOKKOS_INLINE_FUNCTION
122T atomic_fetch_dec(T*
const dest) {
return desul::atomic_fetch_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
126template<
class T> KOKKOS_INLINE_FUNCTION
127T 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); }
129template<
class T> KOKKOS_INLINE_FUNCTION
130T 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); }
132template<
class T> KOKKOS_INLINE_FUNCTION
133T 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); }
135template<
class T> KOKKOS_INLINE_FUNCTION
136T 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); }
138template<
class T> KOKKOS_INLINE_FUNCTION
139T 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); }
141template<
class T> KOKKOS_INLINE_FUNCTION
142T 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); }
144template<
class T> KOKKOS_INLINE_FUNCTION
145T 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); }
147template<
class T> KOKKOS_INLINE_FUNCTION
148T 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); }
150template<
class T> KOKKOS_INLINE_FUNCTION
151T 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); }
153template<
class T> KOKKOS_INLINE_FUNCTION
154T 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); }
156template<
class T> KOKKOS_INLINE_FUNCTION
157T 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); }
159template<
class T> KOKKOS_INLINE_FUNCTION
160T 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); }
162template<
class T> KOKKOS_INLINE_FUNCTION
163T 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); }
165template<
class T> KOKKOS_INLINE_FUNCTION
166T atomic_inc_fetch(T*
const dest) {
return desul::atomic_inc_fetch(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
168template<
class T> KOKKOS_INLINE_FUNCTION
169T atomic_dec_fetch(T*
const dest) {
return desul::atomic_dec_fetch(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
173template<
class T> KOKKOS_INLINE_FUNCTION
174void 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); }
176template<
class T> KOKKOS_INLINE_FUNCTION
177void 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); }
179template<
class T> KOKKOS_INLINE_FUNCTION
180void 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); }
182template<
class T> KOKKOS_INLINE_FUNCTION
183void 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); }
185template<
class T> KOKKOS_INLINE_FUNCTION
186void 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); }
188template<
class T> KOKKOS_INLINE_FUNCTION
189void 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); }
192template<
class T> KOKKOS_INLINE_FUNCTION
193void 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); }
196template<
class T> KOKKOS_INLINE_FUNCTION
197void 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); }
199template<
class T> KOKKOS_INLINE_FUNCTION
200void atomic_inc(T*
const dest) {
return desul::atomic_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
202template<
class T> KOKKOS_INLINE_FUNCTION
203void atomic_dec(T*
const dest) {
return desul::atomic_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
205template<
class T> KOKKOS_INLINE_FUNCTION
206void atomic_increment(T*
const dest) {
return desul::atomic_inc(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
208template<
class T> KOKKOS_INLINE_FUNCTION
209void atomic_decrement(T*
const dest) {
return desul::atomic_dec(dest, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
213template<
class T> KOKKOS_INLINE_FUNCTION
214T 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); }
216template<
class T> KOKKOS_INLINE_FUNCTION
217bool 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) {
218 T expected_ref = expected;
219 return desul::atomic_compare_exchange_strong(dest, expected_ref, desired,
220 desul::MemoryOrderRelaxed(), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
223template<
class T> KOKKOS_INLINE_FUNCTION
224T 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) {
225 return desul::atomic_compare_exchange(dest, compare, desired,
226 desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
230 template<
class T,
class MemOrderSuccess,
class MemOrderFailure> KOKKOS_INLINE_FUNCTION
231 bool atomic_compare_exchange_strong(T*
const dest, T& expected,
const T desired, MemOrderSuccess succ, MemOrderFailure fail) {
232 return desul::atomic_compare_exchange_strong(dest, expected, desired, succ, fail, KOKKOS_DESUL_MEM_SCOPE);
234 template<
class T,
class MemoryOrder>
235 KOKKOS_INLINE_FUNCTION
236 T atomic_load(
const T*
const src, MemoryOrder order) {
237 return desul::atomic_load(src, order, KOKKOS_DESUL_MEM_SCOPE);
239 template<
class T,
class MemoryOrder>
240 KOKKOS_INLINE_FUNCTION
241 void atomic_store(T*
const src,
const T val, MemoryOrder order) {
242 return desul::atomic_store(src, val, order, KOKKOS_DESUL_MEM_SCOPE);
248#undef KOKKOS_DESUL_MEM_SCOPE
ScopeGuard Some user scope issues have been identified with some Kokkos::finalize calls; ScopeGuard a...