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()
38template<
class T> KOKKOS_INLINE_FUNCTION
39T atomic_load(
volatile T*
const dest) {
return desul::atomic_load(
const_cast<T*
>(dest), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
41template<
class T> KOKKOS_INLINE_FUNCTION
42void 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); }
45template<
class T> KOKKOS_INLINE_FUNCTION
46T 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); }
48template<
class T> KOKKOS_INLINE_FUNCTION
49T 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); }
51template<
class T> KOKKOS_INLINE_FUNCTION
52T 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); }
54template<
class T> KOKKOS_INLINE_FUNCTION
55T 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); }
57template<
class T> KOKKOS_INLINE_FUNCTION
58T 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); }
60template<
class T> KOKKOS_INLINE_FUNCTION
61T 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); }
63template<
class T> KOKKOS_INLINE_FUNCTION
64T 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); }
66template<
class T> KOKKOS_INLINE_FUNCTION
67T 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); }
69template<
class T> KOKKOS_INLINE_FUNCTION
70T 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); }
72template<
class T> KOKKOS_INLINE_FUNCTION
73T 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); }
75template<
class T> KOKKOS_INLINE_FUNCTION
76T 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); }
78template<
class T> KOKKOS_INLINE_FUNCTION
79T 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); }
81template<
class T> KOKKOS_INLINE_FUNCTION
82T 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); }
84template<
class T> KOKKOS_INLINE_FUNCTION
85T atomic_fetch_inc(
volatile T*
const dest) {
return desul::atomic_fetch_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
87template<
class T> KOKKOS_INLINE_FUNCTION
88T atomic_fetch_dec(
volatile T*
const dest) {
return desul::atomic_fetch_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
92template<
class T> KOKKOS_INLINE_FUNCTION
93T 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); }
95template<
class T> KOKKOS_INLINE_FUNCTION
96T 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); }
98template<
class T> KOKKOS_INLINE_FUNCTION
99T 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); }
101template<
class T> KOKKOS_INLINE_FUNCTION
102T 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); }
104template<
class T> KOKKOS_INLINE_FUNCTION
105T 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); }
107template<
class T> KOKKOS_INLINE_FUNCTION
108T 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); }
110template<
class T> KOKKOS_INLINE_FUNCTION
111T 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); }
113template<
class T> KOKKOS_INLINE_FUNCTION
114T 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); }
116template<
class T> KOKKOS_INLINE_FUNCTION
117T 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); }
119template<
class T> KOKKOS_INLINE_FUNCTION
120T 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); }
122template<
class T> KOKKOS_INLINE_FUNCTION
123T 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); }
125template<
class T> KOKKOS_INLINE_FUNCTION
126T 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); }
128template<
class T> KOKKOS_INLINE_FUNCTION
129T 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); }
131template<
class T> KOKKOS_INLINE_FUNCTION
132T atomic_inc_fetch(
volatile T*
const dest) {
return desul::atomic_inc_fetch(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
134template<
class T> KOKKOS_INLINE_FUNCTION
135T atomic_dec_fetch(
volatile T*
const dest) {
return desul::atomic_dec_fetch(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
139template<
class T> KOKKOS_INLINE_FUNCTION
140void 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); }
142template<
class T> KOKKOS_INLINE_FUNCTION
143void 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); }
145template<
class T> KOKKOS_INLINE_FUNCTION
146void 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); }
148template<
class T> KOKKOS_INLINE_FUNCTION
149void 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); }
151template<
class T> KOKKOS_INLINE_FUNCTION
152void 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); }
154template<
class T> KOKKOS_INLINE_FUNCTION
155void 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); }
158template<
class T> KOKKOS_INLINE_FUNCTION
159void 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); }
162template<
class T> KOKKOS_INLINE_FUNCTION
163void 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); }
165template<
class T> KOKKOS_INLINE_FUNCTION
166void atomic_inc(
volatile T*
const dest) {
return desul::atomic_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
168template<
class T> KOKKOS_INLINE_FUNCTION
169void atomic_dec(
volatile T*
const dest) {
return desul::atomic_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
171template<
class T> KOKKOS_INLINE_FUNCTION
172void atomic_increment(
volatile T*
const dest) {
return desul::atomic_inc(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
174template<
class T> KOKKOS_INLINE_FUNCTION
175void atomic_decrement(
volatile T*
const dest) {
return desul::atomic_dec(
const_cast<T*
>(dest),desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
179template<
class T> KOKKOS_INLINE_FUNCTION
180T 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); }
182template<
class T> KOKKOS_INLINE_FUNCTION
183bool 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);
188template<
class T> KOKKOS_INLINE_FUNCTION
189T 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