vecmem 1.30.0
Loading...
Searching...
No Matches
atomic.hpp
1/*
2 * VecMem project, part of the ACTS project (R&D line)
3 *
4 * (c) 2021-2026 CERN for the benefit of the ACTS project
5 *
6 * Mozilla Public License Version 2.0
7 */
8#pragma once
9
10// VecMem include(s).
11#include "vecmem/utils/types.hpp"
12
13// System include(s).
14#include <type_traits>
15
16// Provide a different implementation for modern SYCL and everything else
17#if (defined(CL_SYCL_LANGUAGE_VERSION) || defined(SYCL_LANGUAGE_VERSION)) && \
18 defined(VECMEM_HAVE_SYCL_ATOMIC_REF)
19
20namespace vecmem {
21
28template <typename T>
29class [
30 [deprecated("vecmem::atomic is deprecated, use vecmem::device_atomic_ref "
31 "instead")]] atomic
32 : public ::sycl::atomic_ref<T, ::sycl::memory_order::relaxed,
33 ::sycl::memory_scope::device,
34 ::sycl::access::address_space::global_space> {
35
36public:
39
41 using value_type = T;
43 using difference_type = value_type;
45 using pointer = std::add_pointer_t<value_type>;
47 using volatile_pointer =
48 std::add_pointer_t<std::add_volatile_t<value_type>>;
50 using reference = std::add_lvalue_reference_t<value_type>;
51
53
55 VECMEM_HOST_AND_DEVICE
56 atomic(pointer ptr)
57 : ::sycl::atomic_ref<T, ::sycl::memory_order::relaxed,
58 ::sycl::memory_scope::device,
59 ::sycl::access::address_space::global_space>(
60 *ptr) {}
61
62}; // class atomic
63
64} // namespace vecmem
65
66#else
67
68namespace vecmem {
69
80template <typename T>
81class [
82 [deprecated("vecmem::atomic is deprecated, use vecmem::device_atomic_ref "
83 "instead")]] atomic {
84
85public:
88
90 using value_type = T;
92 using difference_type = value_type;
94 using pointer = std::add_pointer_t<value_type>;
96 using volatile_pointer =
97 std::add_pointer_t<std::add_volatile_t<value_type>>;
99 using reference = std::add_lvalue_reference_t<value_type>;
100
102
105
106 static_assert(std::is_integral<value_type>::value,
107 "vecmem::atomic only accepts built-in integral types");
108
110
112 VECMEM_HOST_AND_DEVICE
113 atomic(pointer ptr);
114
117
119 VECMEM_HOST_AND_DEVICE
120 void store(value_type data);
122 VECMEM_HOST_AND_DEVICE
123 value_type load() const;
124
126 VECMEM_HOST_AND_DEVICE
127 value_type exchange(value_type data);
128
130 VECMEM_HOST_AND_DEVICE
131 bool compare_exchange_strong(reference expected, value_type desired);
132
134
137
139 VECMEM_HOST_AND_DEVICE
140 value_type fetch_add(value_type data);
142 VECMEM_HOST_AND_DEVICE
143 value_type fetch_sub(value_type data);
144
146 VECMEM_HOST_AND_DEVICE
147 value_type fetch_and(value_type data);
149 VECMEM_HOST_AND_DEVICE
150 value_type fetch_or(value_type data);
152 VECMEM_HOST_AND_DEVICE
153 value_type fetch_xor(value_type data);
154
156
157private:
159 pointer m_ptr;
160
161}; // class atomic
162
163} // namespace vecmem
164
165// Include the implementation.
166#include "vecmem/memory/impl/atomic.ipp"
167
168#endif // sycl::atomic_ref
Main namespace for the vecmem classes/functions.
Definition atomic_ref.hpp:16
memory_order
Custom (dummy) definition for the memory order.
Definition memory_order.hpp:31