RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
atomic.hpp
Go to the documentation of this file.
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
2 // Copyright (c) Lawrence Livermore National Security, LLC and other
3 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
4 // files for dates and other details. No copyright assignment is required
5 // to contribute to RAJA.
6 //
7 // SPDX-License-Identifier: (BSD-3-Clause)
8 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
9 
10 #ifndef RAJA_policy_atomic_desul_HPP
11 #define RAJA_policy_atomic_desul_HPP
12 
13 #include "RAJA/config.hpp"
14 
15 #if defined(RAJA_ENABLE_DESUL_ATOMICS)
16 
17 #include "RAJA/util/macros.hpp"
18 
20 
21 #include "desul/atomics.hpp"
22 
23 // Default desul options for RAJA
24 using raja_default_desul_order = desul::MemoryOrderRelaxed;
25 using raja_default_desul_scope = desul::MemoryScopeDevice;
26 
27 namespace RAJA
28 {
29 
31 template<typename AtomicPolicy, typename T>
32 RAJA_HOST_DEVICE RAJA_INLINE T atomicLoad(AtomicPolicy, T* acc)
33 {
34  return desul::atomic_load(acc, raja_default_desul_order {},
35  raja_default_desul_scope {});
36 }
37 
39 template<typename AtomicPolicy, typename T>
40 RAJA_HOST_DEVICE RAJA_INLINE void atomicStore(AtomicPolicy, T* acc, T value)
41 {
42  desul::atomic_store(acc, value, raja_default_desul_order {},
43  raja_default_desul_scope {});
44 }
45 
47 template<typename AtomicPolicy, typename T>
48 RAJA_HOST_DEVICE RAJA_INLINE T atomicAdd(AtomicPolicy, T* acc, T value)
49 {
50  return desul::atomic_fetch_add(acc, value, raja_default_desul_order {},
51  raja_default_desul_scope {});
52 }
53 
55 template<typename AtomicPolicy, typename T>
56 RAJA_HOST_DEVICE RAJA_INLINE T atomicSub(AtomicPolicy, T* acc, T value)
57 {
58  return desul::atomic_fetch_sub(acc, value, raja_default_desul_order {},
59  raja_default_desul_scope {});
60 }
61 
63 template<typename AtomicPolicy, typename T>
64 RAJA_HOST_DEVICE RAJA_INLINE T atomicMin(AtomicPolicy, T* acc, T value)
65 {
66  return desul::atomic_fetch_min(acc, value, raja_default_desul_order {},
67  raja_default_desul_scope {});
68 }
69 
71 template<typename AtomicPolicy, typename T>
72 RAJA_HOST_DEVICE RAJA_INLINE T atomicMax(AtomicPolicy, T* acc, T value)
73 {
74  return desul::atomic_fetch_max(acc, value, raja_default_desul_order {},
75  raja_default_desul_scope {});
76 }
77 
79 template<typename AtomicPolicy, typename T>
80 RAJA_HOST_DEVICE RAJA_INLINE T atomicInc(AtomicPolicy, T* acc)
81 {
82  return desul::atomic_fetch_inc(acc, raja_default_desul_order {},
83  raja_default_desul_scope {});
84 }
85 
87 template<typename AtomicPolicy, typename T>
88 RAJA_HOST_DEVICE RAJA_INLINE T atomicInc(AtomicPolicy, T* acc, T val)
89 {
90  // See:
91  // http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomicinc
92  return desul::atomic_fetch_inc_mod(acc, val, raja_default_desul_order {},
93  raja_default_desul_scope {});
94 }
95 
97 template<typename AtomicPolicy, typename T>
98 RAJA_HOST_DEVICE RAJA_INLINE T atomicDec(AtomicPolicy, T* acc)
99 {
100  return desul::atomic_fetch_dec(acc, raja_default_desul_order {},
101  raja_default_desul_scope {});
102 }
103 
105 template<typename AtomicPolicy, typename T>
106 RAJA_HOST_DEVICE RAJA_INLINE T atomicDec(AtomicPolicy, T* acc, T val)
107 {
108  // See:
109  // http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomicdec
110  return desul::atomic_fetch_dec_mod(acc, val, raja_default_desul_order {},
111  raja_default_desul_scope {});
112 }
113 
115 template<typename AtomicPolicy, typename T>
116 RAJA_HOST_DEVICE RAJA_INLINE T atomicAnd(AtomicPolicy, T* acc, T value)
117 {
118  return desul::atomic_fetch_and(acc, value, raja_default_desul_order {},
119  raja_default_desul_scope {});
120 }
121 
123 template<typename AtomicPolicy, typename T>
124 RAJA_HOST_DEVICE RAJA_INLINE T atomicOr(AtomicPolicy, T* acc, T value)
125 {
126  return desul::atomic_fetch_or(acc, value, raja_default_desul_order {},
127  raja_default_desul_scope {});
128 }
129 
131 template<typename AtomicPolicy, typename T>
132 RAJA_HOST_DEVICE RAJA_INLINE T atomicXor(AtomicPolicy, T* acc, T value)
133 {
134  return desul::atomic_fetch_xor(acc, value, raja_default_desul_order {},
135  raja_default_desul_scope {});
136 }
137 
139 template<typename AtomicPolicy, typename T>
140 RAJA_HOST_DEVICE RAJA_INLINE T atomicExchange(AtomicPolicy, T* acc, T value)
141 {
142  return desul::atomic_exchange(acc, value, raja_default_desul_order {},
143  raja_default_desul_scope {});
144 }
145 
147 template<typename AtomicPolicy, typename T>
148 RAJA_HOST_DEVICE RAJA_INLINE T
149 atomicCAS(AtomicPolicy, T* acc, T compare, T value)
150 {
151  return desul::atomic_compare_exchange(acc, compare, value,
152  raja_default_desul_order {},
153  raja_default_desul_scope {});
154 }
155 
156 } // namespace RAJA
157 
158 #endif // RAJA_ENABLE_DESUL_ATOMICS
159 #endif // guard
RAJA header file defining automatic and builtin atomic operations.
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_SUPPRESS_HD_WARN
Definition: macros.hpp:68
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicAnd(T *acc, T value)
Atomic bitwise AND equivalent to (*acc) = (*acc) & value This only works with integral data types.
Definition: atomic.hpp:224
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicOr(T *acc, T value)
Atomic bitwise OR equivalent to (*acc) = (*acc) | value This only works with integral data types.
Definition: atomic.hpp:240
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicLoad(T *acc)
Atomic load.
Definition: atomic.hpp:92
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicDec(T *acc)
Atomic decrement.
Definition: atomic.hpp:195
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicAdd(T *acc, T value)
Atomic add.
Definition: atomic.hpp:117
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicXor(T *acc, T value)
Atomic bitwise XOR equivalent to (*acc) = (*acc) ^ value This only works with integral data types.
Definition: atomic.hpp:256
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE void atomicStore(T *acc, T value)
Atomic store.
Definition: atomic.hpp:104
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicMax(T *acc, T value)
Atomic maximum equivalent to (*acc) = std::max(*acc, value)
Definition: atomic.hpp:156
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicCAS(T *acc, T compare, T value)
Atomic compare and swap.
Definition: atomic.hpp:286
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicInc(T *acc)
Atomic increment.
Definition: atomic.hpp:168
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicMin(T *acc, T value)
Atomic minimum equivalent to (*acc) = std::min(*acc, value)
Definition: atomic.hpp:143
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicSub(T *acc, T value)
Atomic subtract.
Definition: atomic.hpp:130
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE T atomicExchange(T *acc, T value)
Atomic value exchange.
Definition: atomic.hpp:271