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 void
50 apply(DataType* ptr, DataType value)
52 std::atomic_ref<DataType> v(*ptr);
62 template <AcceleratorAtomicConcept DataType>
static void
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)) {
77 template <AcceleratorAtomicConcept DataType>
static void
78 apply(DataType* ptr, DataType value)
80 std::atomic_ref<DataType> v(*ptr);
81 DataType prev_value = v;
82 while (prev_value > value && !v.compare_exchange_weak(prev_value, value)) {
90#if defined(ARCANE_COMPILING_SYCL)
97 template <AcceleratorAtomicConcept DataType>
static void
98 apply(DataType* ptr, DataType value)
100 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
110 template <AcceleratorAtomicConcept DataType>
static void
111 apply(DataType* ptr, DataType value)
113 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
123 template <AcceleratorAtomicConcept DataType>
static void
124 apply(DataType* ptr, DataType value)
126 sycl::atomic_ref<DataType, sycl::memory_order::relaxed, sycl::memory_scope::device> v(*ptr);
140 template <AcceleratorAtomicConcept DataType, enum eAtomicOperation Operation>
141 ARCCORE_HOST_DEVICE
static inline void
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 void
157 doAtomic<DataType, Operation>(view._address(), value);
173template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
174ARCCORE_HOST_DEVICE
inline void
176requires(std::convertible_to<ValueType, DataType>)
179 impl::AtomicImpl::doAtomic<DataType, Operation>(ptr, v);
183template <enum eAtomicOperation Operation, AcceleratorAtomicConcept DataType,
typename ValueType>
184ARCCORE_HOST_DEVICE
inline void
186requires(std::convertible_to<ValueType, DataType>)
189 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__ void 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.