59 template<
typename TOp,
typename T,
typename THierarchy,
typename TSfinae =
void>
60 struct AlpakaBuiltInAtomic : std::false_type
65 template<
typename T,
typename THierarchy>
66 struct AlpakaBuiltInAtomic<
71 decltype(atomicCAS(alpaka::core::declval<T*>(), alpaka::core::declval<T>(), alpaka::core::declval<T>()))>>
74 static __device__ T atomic(T* add, T compare, T value)
76 return atomicCAS(add, compare, value);
80# if !CLANG_CUDA_PTX_WORKAROUND
82 struct AlpakaBuiltInAtomic<
86 typename std::void_t<decltype(atomicCAS_block(
87 alpaka::core::declval<T*>(),
88 alpaka::core::declval<T>(),
89 alpaka::core::declval<T>()))>> : std::true_type
91 static __device__ T atomic(T* add, T compare, T value)
93 return atomicCAS_block(add, compare, value);
100 template<
typename T,
typename THierarchy>
101 struct AlpakaBuiltInAtomic<
105 typename std::void_t<decltype(atomicAdd(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
108 static __device__ T atomic(T* add, T value)
110 return atomicAdd(add, value);
115# if !CLANG_CUDA_PTX_WORKAROUND
117 struct AlpakaBuiltInAtomic<
121 typename std::void_t<decltype(atomicAdd_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
124 static __device__ T atomic(T* add, T value)
126 return atomicAdd_block(add, value);
131# if CLANG_CUDA_PTX_WORKAROUND
133 template<
typename THierarchy>
134 struct AlpakaBuiltInAtomic<
alpaka::AtomicAdd, double, THierarchy> : std::false_type
151 template<
typename T,
typename THierarchy>
152 struct AlpakaBuiltInAtomic<
156 typename std::void_t<decltype(atomicSub(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
159 static __device__ T atomic(T* add, T value)
161 return atomicSub(add, value);
165# if !CLANG_CUDA_PTX_WORKAROUND
167 struct AlpakaBuiltInAtomic<
171 typename std::void_t<decltype(atomicSub_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
174 static __device__ T atomic(T* add, T value)
176 return atomicSub_block(add, value);
182 template<
typename T,
typename THierarchy>
183 struct AlpakaBuiltInAtomic<
187 typename std::void_t<decltype(atomicMin(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
190 static __device__ T atomic(T* add, T value)
192 return atomicMin(add, value);
196# if !CLANG_CUDA_PTX_WORKAROUND
198 struct AlpakaBuiltInAtomic<
202 typename std::void_t<decltype(atomicMin_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
205 static __device__ T atomic(T* add, T value)
207 return atomicMin_block(add, value);
214 template<
typename THierarchy>
215 struct AlpakaBuiltInAtomic<
alpaka::AtomicMin, float, THierarchy> : std::false_type
224 template<
typename THierarchy>
225 struct AlpakaBuiltInAtomic<
alpaka::AtomicMin, double, THierarchy> : std::false_type
234# if !__has_builtin(__hip_atomic_compare_exchange_strong)
235 template<
typename THierarchy>
236 struct AlpakaBuiltInAtomic<
alpaka::AtomicMin, unsigned long long, THierarchy> : std::false_type
249 template<
typename T,
typename THierarchy>
250 struct AlpakaBuiltInAtomic<
254 typename std::void_t<decltype(atomicMax(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
257 static __device__ T atomic(T* add, T value)
259 return atomicMax(add, value);
263# if !CLANG_CUDA_PTX_WORKAROUND
265 struct AlpakaBuiltInAtomic<
269 typename std::void_t<decltype(atomicMax_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
272 static __device__ T atomic(T* add, T value)
274 return atomicMax_block(add, value);
281 template<
typename THierarchy>
282 struct AlpakaBuiltInAtomic<
alpaka::AtomicMax, float, THierarchy> : std::false_type
291 template<
typename THierarchy>
292 struct AlpakaBuiltInAtomic<
alpaka::AtomicMax, double, THierarchy> : std::false_type
301# if !__has_builtin(__hip_atomic_compare_exchange_strong)
302 template<
typename THierarchy>
303 struct AlpakaBuiltInAtomic<
alpaka::AtomicMax, unsigned long long, THierarchy> : std::false_type
317 template<
typename T,
typename THierarchy>
318 struct AlpakaBuiltInAtomic<
322 typename std::void_t<decltype(atomicExch(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
325 static __device__ T atomic(T* add, T value)
327 return atomicExch(add, value);
331# if !CLANG_CUDA_PTX_WORKAROUND
333 struct AlpakaBuiltInAtomic<
337 typename std::void_t<decltype(atomicExch_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
340 static __device__ T atomic(T* add, T value)
342 return atomicExch_block(add, value);
349 template<
typename T,
typename THierarchy>
350 struct AlpakaBuiltInAtomic<
354 typename std::void_t<decltype(atomicInc(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
357 static __device__ T atomic(T* add, T value)
359 return atomicInc(add, value);
363# if !CLANG_CUDA_PTX_WORKAROUND
365 struct AlpakaBuiltInAtomic<
369 typename std::void_t<decltype(atomicInc_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
372 static __device__ T atomic(T* add, T value)
374 return atomicInc_block(add, value);
381 template<
typename T,
typename THierarchy>
382 struct AlpakaBuiltInAtomic<
386 typename std::void_t<decltype(atomicDec(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
389 static __device__ T atomic(T* add, T value)
391 return atomicDec(add, value);
395# if !CLANG_CUDA_PTX_WORKAROUND
397 struct AlpakaBuiltInAtomic<
401 typename std::void_t<decltype(atomicDec_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
404 static __device__ T atomic(T* add, T value)
406 return atomicDec_block(add, value);
413 template<
typename T,
typename THierarchy>
414 struct AlpakaBuiltInAtomic<
418 typename std::void_t<decltype(atomicAnd(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
421 static __device__ T atomic(T* add, T value)
423 return atomicAnd(add, value);
427# if !CLANG_CUDA_PTX_WORKAROUND
429 struct AlpakaBuiltInAtomic<
433 typename std::void_t<decltype(atomicAnd_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
436 static __device__ T atomic(T* add, T value)
438 return atomicAnd_block(add, value);
445 template<
typename T,
typename THierarchy>
446 struct AlpakaBuiltInAtomic<
450 typename std::void_t<decltype(atomicOr(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
453 static __device__ T atomic(T* add, T value)
455 return atomicOr(add, value);
459# if !CLANG_CUDA_PTX_WORKAROUND
461 struct AlpakaBuiltInAtomic<
465 typename std::void_t<decltype(atomicOr_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
468 static __device__ T atomic(T* add, T value)
470 return atomicOr_block(add, value);
477 template<
typename T,
typename THierarchy>
478 struct AlpakaBuiltInAtomic<
482 typename std::void_t<decltype(atomicXor(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
485 static __device__ T atomic(T* add, T value)
487 return atomicXor(add, value);
491# if !CLANG_CUDA_PTX_WORKAROUND
493 struct AlpakaBuiltInAtomic<
497 typename std::void_t<decltype(atomicXor_block(alpaka::core::declval<T*>(), alpaka::core::declval<T>()))>>
500 static __device__ T atomic(T* add, T value)
502 return atomicXor_block(add, value);