RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
atomic_auto.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_atomic_auto_HPP
21 #define RAJA_policy_atomic_auto_HPP
22 
23 #include "RAJA/config.hpp"
24 
25 #include "RAJA/util/macros.hpp"
26 
27 #if !defined(RAJA_ENABLE_DESUL_ATOMICS)
29 #endif
30 
43 #if defined(__CUDA_ARCH__) && defined(RAJA_CUDA_ACTIVE)
44 #define RAJA_AUTO_ATOMIC \
45  RAJA::cuda_atomic {}
46 #elif defined(__HIP_DEVICE_COMPILE__) && defined(RAJA_HIP_ACTIVE)
47 #define RAJA_AUTO_ATOMIC \
48  RAJA::hip_atomic {}
49 #elif defined(__SYCL_DEVICE_ONLY__)
50 #define RAJA_AUTO_ATOMIC \
51  RAJA::sycl_atomic {}
52 #elif defined(RAJA_ENABLE_OPENMP)
53 #define RAJA_AUTO_ATOMIC \
54  RAJA::omp_atomic {}
55 #else
56 #define RAJA_AUTO_ATOMIC \
57  RAJA::seq_atomic {}
58 #endif
59 
60 
61 namespace RAJA
62 {
63 
66 {};
67 
68 template<typename T>
69 RAJA_INLINE RAJA_HOST_DEVICE T atomicLoad(auto_atomic, T* acc)
70 {
71  return atomicLoad(RAJA_AUTO_ATOMIC, acc);
72 }
73 
74 template<typename T>
75 RAJA_INLINE RAJA_HOST_DEVICE void atomicStore(auto_atomic, T* acc, T value)
76 {
77  atomicStore(RAJA_AUTO_ATOMIC, acc, value);
78 }
79 
80 template<typename T>
81 RAJA_INLINE RAJA_HOST_DEVICE T atomicAdd(auto_atomic, T* acc, T value)
82 {
83  return atomicAdd(RAJA_AUTO_ATOMIC, acc, value);
84 }
85 
86 template<typename T>
87 RAJA_INLINE RAJA_HOST_DEVICE T atomicSub(auto_atomic, T* acc, T value)
88 {
89  return atomicSub(RAJA_AUTO_ATOMIC, acc, value);
90 }
91 
92 template<typename T>
93 RAJA_INLINE RAJA_HOST_DEVICE T atomicMin(auto_atomic, T* acc, T value)
94 {
95  return atomicMin(RAJA_AUTO_ATOMIC, acc, value);
96 }
97 
98 template<typename T>
99 RAJA_INLINE RAJA_HOST_DEVICE T atomicMax(auto_atomic, T* acc, T value)
100 {
101  return atomicMax(RAJA_AUTO_ATOMIC, acc, value);
102 }
103 
104 template<typename T>
105 RAJA_INLINE RAJA_HOST_DEVICE T atomicInc(auto_atomic, T* acc)
106 {
107  return atomicInc(RAJA_AUTO_ATOMIC, acc);
108 }
109 
110 template<typename T>
111 RAJA_INLINE RAJA_HOST_DEVICE T atomicInc(auto_atomic, T* acc, T compare)
112 {
113  return atomicInc(RAJA_AUTO_ATOMIC, acc, compare);
114 }
115 
116 template<typename T>
117 RAJA_INLINE RAJA_HOST_DEVICE T atomicDec(auto_atomic, T* acc)
118 {
119  return atomicDec(RAJA_AUTO_ATOMIC, acc);
120 }
121 
122 template<typename T>
123 RAJA_INLINE RAJA_HOST_DEVICE T atomicDec(auto_atomic, T* acc, T compare)
124 {
125  return atomicDec(RAJA_AUTO_ATOMIC, acc, compare);
126 }
127 
128 template<typename T>
129 RAJA_INLINE RAJA_HOST_DEVICE T atomicAnd(auto_atomic, T* acc, T value)
130 {
131  return atomicAnd(RAJA_AUTO_ATOMIC, acc, value);
132 }
133 
134 template<typename T>
135 RAJA_INLINE RAJA_HOST_DEVICE T atomicOr(auto_atomic, T* acc, T value)
136 {
137  return atomicOr(RAJA_AUTO_ATOMIC, acc, value);
138 }
139 
140 template<typename T>
141 RAJA_INLINE RAJA_HOST_DEVICE T atomicXor(auto_atomic, T* acc, T value)
142 {
143  return atomicXor(RAJA_AUTO_ATOMIC, acc, value);
144 }
145 
146 template<typename T>
147 RAJA_INLINE RAJA_HOST_DEVICE T atomicExchange(auto_atomic, T* acc, T value)
148 {
149  return atomicExchange(RAJA_AUTO_ATOMIC, acc, value);
150 }
151 
152 template<typename T>
153 RAJA_INLINE RAJA_HOST_DEVICE T
154 atomicCAS(auto_atomic, T* acc, T compare, T value)
155 {
156  return atomicCAS(RAJA_AUTO_ATOMIC, acc, compare, value);
157 }
158 
159 
160 } // namespace RAJA
161 
162 // make sure this define doesn't bleed out of this header
163 #undef RAJA_AUTO_ATOMIC
164 
165 #endif
#define RAJA_AUTO_ATOMIC
Definition: atomic_auto.hpp:56
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
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
RAJA header file defining sequential atomic operations.
Atomic policy that automatically does "the right thing".
Definition: atomic_auto.hpp:66