12#ifndef ARCANE_ACCELERATOR_ATOMIC_H
13#define ARCANE_ACCELERATOR_ATOMIC_H
17#if defined(ARCCORE_DEVICE_TARGET_CUDA) || defined(ARCCORE_DEVICE_TARGET_HIP)
18#include "arcane/accelerator/CommonCudaHipAtomicImpl.h"
34namespace Arcane::Accelerator::impl
37template <enum eAtomicOperation Operation>
39template <enum eAtomicOperation Operation>
47 template <AcceleratorAtomicConcept DataType>
static DataType
48 apply(DataType* ptr, DataType value)
50 std::atomic_ref<DataType> v(*ptr);
51 return v.fetch_add(value);
60 template <AcceleratorAtomicConcept DataType>
static DataType
61 apply(DataType* ptr, DataType value)
63 std::atomic_ref<DataType> v(*ptr);
64 DataType prev_value = v;
65 while (prev_value < value && !v.compare_exchange_weak(prev_value, value)) {
76 template <AcceleratorAtomicConcept DataType>
static DataType
77 apply(DataType* ptr, DataType value)
79 std::atomic_ref<DataType> v(*ptr);
80 DataType prev_value = v;
81 while (prev_value > value && !v.compare_exchange_weak(prev_value, value)) {
90#if defined(ARCANE_COMPILING_SYCL)
97 template <AcceleratorAtomicConcept DataType>
static DataType
98 apply(DataType* ptr, DataType value)
100 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
101 return v.fetch_add(value);
110 template <AcceleratorAtomicConcept DataType>
static DataType
111 apply(DataType* ptr, DataType value)
113 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
114 return v.fetch_max(value);
123 template <AcceleratorAtomicConcept DataType>
static DataType
124 apply(DataType* ptr, DataType value)
126 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
127 return v.fetch_min(value);
140 template <AcceleratorAtomicConcept DataType, enum eAtomicOperation Operation>
141 ARCCORE_HOST_DEVICE
static inline DataType
142 doAtomic(DataType* ptr, DataType value)
144#if defined(ARCCORE_DEVICE_TARGET_CUDA) || defined(ARCCORE_DEVICE_TARGET_HIP)
146#elif defined(ARCCORE_DEVICE_TARGET_SYCL)
153 template <AcceleratorAtomicConcept DataType, enum eAtomicOperation Operation>
154 ARCCORE_HOST_DEVICE
static inline DataType
155 doAtomic(
const DataViewGetterSetter<DataType>& view, DataType value)
157 return doAtomic<DataType, Operation>(view._address(), value);
176template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
177ARCCORE_HOST_DEVICE
inline DataType
179requires(std::convertible_to<ValueType, DataType>)
182 return impl::AtomicImpl::doAtomic<DataType, Operation>(ptr, v);
192template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
193ARCCORE_HOST_DEVICE
inline DataType
195requires(std::convertible_to<ValueType, DataType>)
198 return impl::AtomicImpl::doAtomic<DataType, Operation>(view, v);
Liste des types supportant les opérations atomiques.
Espace de nom pour l'utilisation des accélérateurs.
__host__ __device__ DataType doAtomic(DataType *ptr, ValueType value)
Applique l'opération atomique Operation à la valeur à l'adresse ptr avec la valeur value.
eAtomicOperation
Type d'opération atomique supportée.