RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
atomic.hpp
Go to the documentation of this file.
1 
11 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
12 // Copyright (c) Lawrence Livermore National Security, LLC and other
13 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
14 // files for dates and other details. No copyright assignment is required
15 // to contribute to RAJA.
16 //
17 // SPDX-License-Identifier: (BSD-3-Clause)
18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
19 
20 #ifndef RAJA_policy_sequential_atomic_HPP
21 #define RAJA_policy_sequential_atomic_HPP
22 
23 #include "RAJA/config.hpp"
24 
25 #include "RAJA/util/macros.hpp"
26 
27 namespace RAJA
28 {
29 
31 template<typename T>
32 RAJA_HOST_DEVICE RAJA_INLINE T atomicLoad(seq_atomic, T* acc)
33 {
34  return *acc;
35 }
36 
38 template<typename T>
39 RAJA_HOST_DEVICE RAJA_INLINE void atomicStore(seq_atomic, T* acc, T value)
40 {
41  *acc = value;
42 }
43 
45 template<typename T>
46 RAJA_HOST_DEVICE RAJA_INLINE T atomicAdd(seq_atomic, T* acc, T value)
47 {
48  T ret = *acc;
49  *acc += value;
50  return ret;
51 }
52 
54 template<typename T>
55 RAJA_HOST_DEVICE RAJA_INLINE T atomicSub(seq_atomic, T* acc, T value)
56 {
57  T ret = *acc;
58  *acc -= value;
59  return ret;
60 }
61 
63 template<typename T>
64 RAJA_HOST_DEVICE RAJA_INLINE T atomicMin(seq_atomic, T* acc, T value)
65 {
66  T ret = *acc;
67  *acc = ret < value ? ret : value;
68  return ret;
69 }
70 
72 template<typename T>
73 RAJA_HOST_DEVICE RAJA_INLINE T atomicMax(seq_atomic, T* acc, T value)
74 {
75  T ret = *acc;
76  *acc = value < ret ? ret : value;
77  return ret;
78 }
79 
81 template<typename T>
82 RAJA_HOST_DEVICE RAJA_INLINE T atomicInc(seq_atomic, T* acc)
83 {
84  T ret = *acc;
85  (*acc) += T(1);
86  return ret;
87 }
88 
90 template<typename T>
91 RAJA_HOST_DEVICE RAJA_INLINE T atomicInc(seq_atomic, T* acc, T val)
92 {
93  T old = *acc;
94  *acc = val <= old ? T(0) : old + T(1);
95  return old;
96 }
97 
99 template<typename T>
100 RAJA_HOST_DEVICE RAJA_INLINE T atomicDec(seq_atomic, T* acc)
101 {
102  T ret = *acc;
103  (*acc) -= T(1);
104  return ret;
105 }
106 
108 template<typename T>
109 RAJA_HOST_DEVICE RAJA_INLINE T atomicDec(seq_atomic, T* acc, T val)
110 {
111  T old = *acc;
112  *acc = old == T(0) || val < old ? val : old - T(1);
113  return old;
114 }
115 
117 template<typename T>
118 RAJA_HOST_DEVICE RAJA_INLINE T atomicAnd(seq_atomic, T* acc, T value)
119 {
120  T ret = *acc;
121  *acc &= value;
122  return ret;
123 }
124 
126 template<typename T>
127 RAJA_HOST_DEVICE RAJA_INLINE T atomicOr(seq_atomic, T* acc, T value)
128 {
129  T ret = *acc;
130  *acc |= value;
131  return ret;
132 }
133 
135 template<typename T>
136 RAJA_HOST_DEVICE RAJA_INLINE T atomicXor(seq_atomic, T* acc, T value)
137 {
138  T ret = *acc;
139  *acc ^= value;
140  return ret;
141 }
142 
144 template<typename T>
145 RAJA_HOST_DEVICE RAJA_INLINE T atomicExchange(seq_atomic, T* acc, T value)
146 {
147  T ret = *acc;
148  *acc = value;
149  return ret;
150 }
151 
153 template<typename T>
154 RAJA_HOST_DEVICE RAJA_INLINE T atomicCAS(seq_atomic, T* acc, T compare, T value)
155 {
156  T ret = *acc;
157  *acc = ret == compare ? value : ret;
158  return ret;
159 }
160 
161 
162 } // namespace RAJA
163 
164 
165 #endif // guard
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
Definition: policy.hpp:127