11#if defined(__HIP_DEVICE_COMPILE__)
12#include <hip/hip_runtime.h>
16#if defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
17#include <sycl/sycl.hpp>
21#if defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
22#define __VECMEM_SYCL_ATOMIC_CALL0(FNAME, PTR) \
23 ::sycl::atomic_##FNAME<value_type>( \
24 ::sycl::atomic<value_type>(::sycl::global_ptr<value_type>(PTR)))
25#define __VECMEM_SYCL_ATOMIC_CALL1(FNAME, PTR, ARG1) \
26 ::sycl::atomic_##FNAME<value_type>( \
27 ::sycl::atomic<value_type>(::sycl::global_ptr<value_type>(PTR)), ARG1)
28#define __VECMEM_SYCL_ATOMIC_CALL2(FNAME, PTR, ARG1, ARG2) \
29 ::sycl::atomic_##FNAME<value_type>( \
30 ::sycl::atomic<value_type>(::sycl::global_ptr<value_type>(PTR)), ARG1, \
37VECMEM_HOST_AND_DEVICE atomic<T>::atomic(pointer ptr) : m_ptr(ptr) {}
40VECMEM_HOST_AND_DEVICE
void atomic<T>::store(value_type data) {
42#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
43 (!defined(SYCL_LANGUAGE_VERSION))
44 volatile_pointer addr = m_ptr;
47#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
48 __VECMEM_SYCL_ATOMIC_CALL1(store, m_ptr, data);
55VECMEM_HOST_AND_DEVICE
auto atomic<T>::load() const -> value_type {
57#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
58 (!defined(SYCL_LANGUAGE_VERSION))
59 volatile_pointer addr = m_ptr;
61 const value_type value = *addr;
64#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
65 return __VECMEM_SYCL_ATOMIC_CALL0(load, m_ptr);
72VECMEM_HOST_AND_DEVICE
auto atomic<T>::exchange(value_type data) -> value_type {
74#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
75 (!defined(SYCL_LANGUAGE_VERSION))
76 return atomicExch(m_ptr, data);
77#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
78 return __VECMEM_SYCL_ATOMIC_CALL1(exchange, m_ptr, data);
80 value_type current_value = *m_ptr;
87VECMEM_HOST_AND_DEVICE
bool atomic<T>::compare_exchange_strong(
88 reference expected, value_type desired) {
90#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
91 (!defined(SYCL_LANGUAGE_VERSION))
92 return atomicCAS(m_ptr, expected, desired);
93#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
94 return __VECMEM_SYCL_ATOMIC_CALL2(compare_exchange_strong, m_ptr, expected,
97 if (*m_ptr == expected) {
108VECMEM_HOST_AND_DEVICE
auto atomic<T>::fetch_add(value_type data)
111#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
112 (!defined(SYCL_LANGUAGE_VERSION))
113 return atomicAdd(m_ptr, data);
114#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
115 return __VECMEM_SYCL_ATOMIC_CALL1(fetch_add, m_ptr, data);
117 const value_type result = *m_ptr;
124VECMEM_HOST_AND_DEVICE
auto atomic<T>::fetch_sub(value_type data)
127#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
128 (!defined(SYCL_LANGUAGE_VERSION))
129 return atomicSub(m_ptr, data);
130#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
131 return __VECMEM_SYCL_ATOMIC_CALL1(fetch_sub, m_ptr, data);
133 const value_type result = *m_ptr;
140VECMEM_HOST_AND_DEVICE
auto atomic<T>::fetch_and(value_type data)
143#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
144 (!defined(SYCL_LANGUAGE_VERSION))
145 return atomicAnd(m_ptr, data);
146#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
147 return __VECMEM_SYCL_ATOMIC_CALL1(fetch_and, m_ptr, data);
149 const value_type result = *m_ptr;
156VECMEM_HOST_AND_DEVICE
auto atomic<T>::fetch_or(value_type data) -> value_type {
158#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
159 (!defined(SYCL_LANGUAGE_VERSION))
160 return atomicOr(m_ptr, data);
161#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
162 return __VECMEM_SYCL_ATOMIC_CALL1(fetch_or, m_ptr, data);
164 const value_type result = *m_ptr;
171VECMEM_HOST_AND_DEVICE
auto atomic<T>::fetch_xor(value_type data)
174#if (defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)) && \
175 (!defined(SYCL_LANGUAGE_VERSION))
176 return atomicXor(m_ptr, data);
177#elif defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)
178 return __VECMEM_SYCL_ATOMIC_CALL1(fetch_xor, m_ptr, data);
180 const value_type result = *m_ptr;
Main namespace for the vecmem classes/functions.
Definition atomic_ref.hpp:16