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"
27namespace Arcane::Accelerator
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);
106class SyclAtomic<eAtomicOperation::Max>
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);
166namespace Arcane::Accelerator
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);
208template <AcceleratorAtomicConcept DataType,
typename ValueType>
209ARCCORE_HOST_DEVICE
inline DataType
210doAtomicAdd(
const DataViewGetterSetter<DataType>& view, ValueType value)
211requires(std::convertible_to<ValueType, DataType>)
214 return impl::AtomicImpl::doAtomic<DataType, eAtomicOperation::Add>(view, v);
224template <AcceleratorAtomicConcept DataType,
typename ValueType>
225ARCCORE_HOST_DEVICE
inline DataType
226doAtomicAdd(DataType* ptr, ValueType value)
227requires(std::convertible_to<ValueType, DataType>)
230 return impl::AtomicImpl::doAtomic<DataType, eAtomicOperation::Add>(ptr, v);
Classe pour accéder à un élément d'une vue en lecture/écriture.
Liste des types supportant les opérations atomiques.