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#include <Kokkos_Atomics_Desul_Config.hpp>
26#include <desul/atomics.hpp>
28#ifdef KOKKOS_INTERNAL_NOT_PARALLEL
29#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeCaller()
31#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeDevice()
37template<
class T> KOKKOS_INLINE_FUNCTION
38T atomic_load(
volatile T*
const dest) {
return desul::atomic_load(
const_cast<T*
>(dest), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
40template<
class T> KOKKOS_INLINE_FUNCTION
41void 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); }
44template<
class T> KOKKOS_INLINE_FUNCTION
45T 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); }
47template<
class T> KOKKOS_INLINE_FUNCTION
48T 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); }
50template<
class T> KOKKOS_INLINE_FUNCTION
51T 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); }
53template<
class T> KOKKOS_INLINE_FUNCTION
54T 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); }
56template<
class T> KOKKOS_INLINE_FUNCTION
57T 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); }
59template<
class T> KOKKOS_INLINE_FUNCTION
60T 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); }
62template<
class T> KOKKOS_INLINE_FUNCTION
63T 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); }
65template<
class T> KOKKOS_INLINE_FUNCTION
66T 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); }
68template<
class T> KOKKOS_INLINE_FUNCTION
69T 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); }
71template<
class T> KOKKOS_INLINE_FUNCTION
72T 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); }
74template<
class T> KOKKOS_INLINE_FUNCTION
75T 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); }
77template<
class T> KOKKOS_INLINE_FUNCTION
78T 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); }
80template<
class T> KOKKOS_INLINE_FUNCTION
81T 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); }
83template<
class T> KOKKOS_INLINE_FUNCTION
84T atomic_fetch_inc(
volatile T*
const dest) {
return desul::atomic_fetch_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
86template<
class T> KOKKOS_INLINE_FUNCTION
87T atomic_fetch_dec(
volatile T*
const dest) {
return desul::atomic_fetch_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
91template<
class T> KOKKOS_INLINE_FUNCTION
92T 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); }
94template<
class T> KOKKOS_INLINE_FUNCTION
95T 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); }
97template<
class T> KOKKOS_INLINE_FUNCTION
98T 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); }
100template<
class T> KOKKOS_INLINE_FUNCTION
101T 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); }
103template<
class T> KOKKOS_INLINE_FUNCTION
104T 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); }
106template<
class T> KOKKOS_INLINE_FUNCTION
107T 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); }
109template<
class T> KOKKOS_INLINE_FUNCTION
110T 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); }
112template<
class T> KOKKOS_INLINE_FUNCTION
113T 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); }
115template<
class T> KOKKOS_INLINE_FUNCTION
116T 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); }
118template<
class T> KOKKOS_INLINE_FUNCTION
119T 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); }
121template<
class T> KOKKOS_INLINE_FUNCTION
122T 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); }
124template<
class T> KOKKOS_INLINE_FUNCTION
125T 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); }
127template<
class T> KOKKOS_INLINE_FUNCTION
128T 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); }
130template<
class T> KOKKOS_INLINE_FUNCTION
131T atomic_inc_fetch(
volatile T*
const dest) {
return desul::atomic_inc_fetch(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
133template<
class T> KOKKOS_INLINE_FUNCTION
134T atomic_dec_fetch(
volatile T*
const dest) {
return desul::atomic_dec_fetch(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
138template<
class T> KOKKOS_INLINE_FUNCTION
139void 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); }
141template<
class T> KOKKOS_INLINE_FUNCTION
142void 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); }
144template<
class T> KOKKOS_INLINE_FUNCTION
145void 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); }
147template<
class T> KOKKOS_INLINE_FUNCTION
148void 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); }
150template<
class T> KOKKOS_INLINE_FUNCTION
151void 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); }
153template<
class T> KOKKOS_INLINE_FUNCTION
154void 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); }
157template<
class T> KOKKOS_INLINE_FUNCTION
158void 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); }
161template<
class T> KOKKOS_INLINE_FUNCTION
162void 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); }
164template<
class T> KOKKOS_INLINE_FUNCTION
165void atomic_inc(
volatile T*
const dest) {
return desul::atomic_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
167template<
class T> KOKKOS_INLINE_FUNCTION
168void atomic_dec(
volatile T*
const dest) {
return desul::atomic_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
170template<
class T> KOKKOS_INLINE_FUNCTION
171void atomic_increment(
volatile T*
const dest) {
return desul::atomic_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
173template<
class T> KOKKOS_INLINE_FUNCTION
174void atomic_decrement(
volatile T*
const dest) {
return desul::atomic_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
178template<
class T> KOKKOS_INLINE_FUNCTION
179T 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); }
181template<
class T> KOKKOS_INLINE_FUNCTION
182bool atomic_compare_exchange_strong(
volatile T*
const dest, T& expected,
const T desired) {
183 return desul::atomic_compare_exchange_strong(
const_cast<T*
>(dest),expected, desired,
184 desul::MemoryOrderRelaxed(), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
187template<
class T> KOKKOS_INLINE_FUNCTION
188T atomic_compare_exchange(
volatile T*
const dest,
const T compare,
const T desired) {
189 return desul::atomic_compare_exchange(
const_cast<T*
>(dest),compare, desired,
190 desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE);
194#undef KOKKOS_DESUL_MEM_SCOPE