12#ifndef ARCANE_ACCELERATOR_ATOMIC_H
13#define ARCANE_ACCELERATOR_ATOMIC_H
17#include "arcane/utils/ArcaneCxx20.h"
19#if defined(ARCCORE_DEVICE_TARGET_CUDA) || defined(ARCCORE_DEVICE_TARGET_HIP)
20#include "arcane/accelerator/CommonCudaHipAtomicImpl.h"
36namespace Arcane::Accelerator::impl
39template <enum eAtomicOperation Operation>
41template <enum eAtomicOperation Operation>
49 template <AcceleratorAtomicConcept DataType>
static DataType
50 apply(DataType* ptr, DataType value)
52 std::atomic_ref<DataType> v(*ptr);
53 return v.fetch_add(value);
62 template <AcceleratorAtomicConcept DataType>
static DataType
63 apply(DataType* ptr, DataType value)
65 std::atomic_ref<DataType> v(*ptr);
66 DataType prev_value = v;
67 while (prev_value < value && !v.compare_exchange_weak(prev_value, value)) {
78 template <AcceleratorAtomicConcept DataType>
static DataType
79 apply(DataType* ptr, DataType value)
81 std::atomic_ref<DataType> v(*ptr);
82 DataType prev_value = v;
83 while (prev_value > value && !v.compare_exchange_weak(prev_value, value)) {
92#if defined(ARCANE_COMPILING_SYCL)
99 template <AcceleratorAtomicConcept DataType>
static DataType
100 apply(DataType* ptr, DataType value)
102 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
103 return v.fetch_add(value);
112 template <AcceleratorAtomicConcept DataType>
static DataType
113 apply(DataType* ptr, DataType value)
115 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
116 return v.fetch_max(value);
125 template <AcceleratorAtomicConcept DataType>
static DataType
126 apply(DataType* ptr, DataType value)
128 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
129 return v.fetch_min(value);
142 template <AcceleratorAtomicConcept DataType, enum eAtomicOperation Operation>
143 ARCCORE_HOST_DEVICE
static inline DataType
144 doAtomic(DataType* ptr, DataType value)
146#if defined(ARCCORE_DEVICE_TARGET_CUDA) || defined(ARCCORE_DEVICE_TARGET_HIP)
148#elif defined(ARCCORE_DEVICE_TARGET_SYCL)
155 template <AcceleratorAtomicConcept DataType, enum eAtomicOperation Operation>
156 ARCCORE_HOST_DEVICE
static inline DataType
159 return doAtomic<DataType, Operation>(view._address(), value);
178template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
179ARCCORE_HOST_DEVICE
inline DataType
181requires(std::convertible_to<ValueType, DataType>)
184 return impl::AtomicImpl::doAtomic<DataType, Operation>(ptr, v);
194template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
195ARCCORE_HOST_DEVICE
inline DataType
197requires(std::convertible_to<ValueType, DataType>)
200 return impl::AtomicImpl::doAtomic<DataType, Operation>(view, v);
Classe pour accéder à un élément d'une vue en lecture/écriture.
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.