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>
25#include <desul/atomics.hpp>
27#include <impl/Kokkos_Utilities.hpp>
28#include <impl/Kokkos_Volatile_Load.hpp>
32#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
33KOKKOS_DEPRECATED
inline const char* atomic_query_version() {
34 return "KOKKOS_DESUL_ATOMICS";
38#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
39#if defined(KOKKOS_COMPILER_GNU) && !defined(__PGIC__) && \
40 !defined(__CUDA_ARCH__)
42#define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) __builtin_prefetch(addr, 0, 0)
43#define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) __builtin_prefetch(addr, 1, 0)
47#define KOKKOS_NONTEMPORAL_PREFETCH_LOAD(addr) ((void)0)
48#define KOKKOS_NONTEMPORAL_PREFETCH_STORE(addr) ((void)0)
54#ifdef KOKKOS_ENABLE_ATOMICS_BYPASS
55#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeCaller()
57#define KOKKOS_DESUL_MEM_SCOPE desul::MemoryScopeDevice()
62using not_deduced_atomic_t =
63 std::add_const_t<std::remove_volatile_t<type_identity_t<T>>>;
65template <
class T,
class R>
66using enable_if_atomic_t =
67 std::enable_if_t<!std::is_reference_v<T> && !std::is_const_v<T>,
68 std::remove_volatile_t<R>>;
74KOKKOS_INLINE_FUNCTION
void memory_fence() { desul::atomic_thread_fence(desul::MemoryOrderSeqCst(), KOKKOS_DESUL_MEM_SCOPE); }
75KOKKOS_INLINE_FUNCTION
void load_fence() { desul::atomic_thread_fence(desul::MemoryOrderAcquire(), KOKKOS_DESUL_MEM_SCOPE); }
76KOKKOS_INLINE_FUNCTION
void store_fence() { desul::atomic_thread_fence(desul::MemoryOrderRelease(), KOKKOS_DESUL_MEM_SCOPE); }
79template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_load (T
const* ptr) {
return desul::atomic_load (
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
80template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_store(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_store(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
81#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
82template<
class T> KOKKOS_DEPRECATED_WITH_COMMENT(
"Use atomic_store() instead!") KOKKOS_FUNCTION Impl::enable_if_atomic_t<T,
void> atomic_assign(T* ptr, Impl::not_deduced_atomic_t<T> val) { atomic_store(ptr, val); }
86template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_add(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_add(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
87template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_sub(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_sub(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
88template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_max(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_max(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
89template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_min(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_min(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
90template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_mul(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_mul(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
91template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_div(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_div(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
92template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_mod(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_mod(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
93template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_and(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_and(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
94template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_or (T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_or (
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
95template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_xor(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_xor(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
96template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_nand(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_nand(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
97template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_lshift(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_lshift(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
98template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_rshift(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_fetch_rshift(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
99template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_inc(T* ptr) {
return desul::atomic_fetch_inc(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
100template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_fetch_dec(T* ptr) {
return desul::atomic_fetch_dec(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
103template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_add_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_add_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
104template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_sub_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_sub_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
105template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_max_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_max_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
106template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_min_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_min_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
107template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_mul_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_mul_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
108template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_div_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_div_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
109template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_mod_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_mod_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
110template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_and_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_and_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
111template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_or_fetch (T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_or_fetch (
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
112template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_xor_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_xor_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
113template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_nand_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_nand_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
114template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_lshift_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_lshift_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
115template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_rshift_fetch(T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_rshift_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
116template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_inc_fetch(T* ptr) {
return desul::atomic_inc_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
117template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_dec_fetch(T* ptr) {
return desul::atomic_dec_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
120template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_add(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_add(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
121template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_sub(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_sub(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
122template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_max(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_max(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
123template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_min(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_min(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
124template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_mul(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_mul(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
125template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_div(T* ptr, Impl::not_deduced_atomic_t<T> val) { desul::atomic_div(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
126template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_mod(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_mod(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
127template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_and(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_and(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
128template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_or (T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_or (
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
129template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_xor(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_xor(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
130template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_nand(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_nand_fetch(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
131template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_lshift(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_lshift(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
132template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_rshift(T* ptr, Impl::not_deduced_atomic_t<T> val) { (void)desul::atomic_fetch_rshift(
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
133template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_inc(T* ptr) { desul::atomic_inc(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
134template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, void> atomic_dec(T* ptr) { desul::atomic_dec(
const_cast<std::remove_volatile_t<T>*
>(ptr), desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
135#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
136template<
class T> KOKKOS_DEPRECATED_WITH_COMMENT(
"Use atomic_inc() instead!") KOKKOS_FUNCTION Impl::enable_if_atomic_t<T,
void> atomic_increment(T* ptr) { atomic_inc(ptr); }
137template<
class T> KOKKOS_DEPRECATED_WITH_COMMENT(
"Use atomic_dec() instead!") KOKKOS_FUNCTION Impl::enable_if_atomic_t<T,
void> atomic_decrement(T* ptr) { atomic_dec(ptr); }
141template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_exchange (T* ptr, Impl::not_deduced_atomic_t<T> val) {
return desul::atomic_exchange (
const_cast<std::remove_volatile_t<T>*
>(ptr), val, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
142template<
class T> KOKKOS_FUNCTION Impl::enable_if_atomic_t<T, T> atomic_compare_exchange(T* ptr, Impl::not_deduced_atomic_t<T> expected, Impl::not_deduced_atomic_t<T> desired) {
return desul::atomic_compare_exchange(
const_cast<std::remove_volatile_t<T>*
>(ptr), expected, desired, desul::MemoryOrderRelaxed(), KOKKOS_DESUL_MEM_SCOPE); }
143#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
144template<
class T> KOKKOS_DEPRECATED_WITH_COMMENT(
"Use atomic_compare_exchange() instead!") KOKKOS_FUNCTION Impl::enable_if_atomic_t<T,
bool> atomic_compare_exchange_strong(T* ptr, Impl::not_deduced_atomic_t<T> expected, Impl::not_deduced_atomic_t<T> desired) {
return expected == atomic_compare_exchange(ptr, expected, desired); }
152template <
class T,
class MemOrderSuccess,
class MemOrderFailure>
153KOKKOS_FUNCTION
bool atomic_compare_exchange_strong(T*
const dest, T& expected,
155 MemOrderSuccess succ,
156 MemOrderFailure fail) {
157 return desul::atomic_compare_exchange_strong(dest, expected, desired, succ,
158 fail, KOKKOS_DESUL_MEM_SCOPE);
161template <
class T,
class MemoryOrder>
162KOKKOS_FUNCTION T atomic_load(
const T*
const src, MemoryOrder order) {
163 return desul::atomic_load(src, order, KOKKOS_DESUL_MEM_SCOPE);
166template <
class T,
class MemoryOrder>
167KOKKOS_FUNCTION
void atomic_store(T*
const src,
const T val,
169 return desul::atomic_store(src, val, order, KOKKOS_DESUL_MEM_SCOPE);
174#undef KOKKOS_DESUL_MEM_SCOPE
ScopeGuard Some user scope issues have been identified with some Kokkos::finalize calls; ScopeGuard a...