12#ifndef ARCANE_ACCELERATOR_GENERICREDUCER_H
13#define ARCANE_ACCELERATOR_GENERICREDUCER_H
17#include "arcane/utils/NumArray.h"
18#include "arcane/utils/FatalErrorException.h"
20#include "arcane/accelerator/core/RunQueue.h"
26namespace Arcane::Accelerator::impl
28template <
typename DataType>
29class GenericReducerIf;
35template <
typename DataType,
typename Operator>
38template <
typename DataType>
45template <
typename DataType>
52template <
typename DataType>
68template <
typename DataType>
81 DataType _reducedValue()
const
84 return m_host_reduce_storage[0];
90 if (m_host_reduce_storage.memoryRessource() !=
r)
92 m_host_reduce_storage.resize(1);
113template <
typename DataType>
121 template <
typename InputIterator,
typename ReduceOperator>
132#if defined(ARCANE_COMPILING_CUDA)
135 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
143 ARCANE_CHECK_CUDA(::cub::DeviceReduce::Reduce(s.m_algo_storage.address(),
temp_storage_size,
146 s.m_device_reduce_storage.copyToAsync(s.m_host_reduce_storage, queue);
149#if defined(ARCANE_COMPILING_HIP)
152 hipStream_t stream = impl::HipUtils::toNativeStream(queue);
163 s.m_device_reduce_storage.copyToAsync(s.m_host_reduce_storage, queue);
166#if defined(ARCANE_COMPILING_SYCL)
178 s.m_host_reduce_storage[0] =
reducer.reducedValue();
247template <
typename DataType>
280 template <
typename SelectLambda>
287 template <
typename SelectLambda>
294 template <
typename SelectLambda>
303 m_is_already_called =
false;
304 return this->_reducedValue();
309 bool m_is_already_called =
false;
313 template <
typename InputIterator,
typename ReduceOperator>
323 template <
typename GetterLambda,
typename ReduceOperator>
328 impl::GenericReducerBase<DataType>*
base_ptr =
this;
329 impl::GenericReducerIf<DataType>
gf;
337 if (m_is_already_called)
338 ARCANE_FATAL(
"apply() has already been called for this instance");
339 m_is_already_called =
true;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Algorithme générique de réduction sur accélérateur.
DataType reducedValue()
Valeur de la réduction.
void applyMinWithIndex(Int32 nb_value, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Min' sur les valeurs sélectionnées par select_lambda.
void applyMaxWithIndex(Int32 nb_value, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Max' sur les valeurs sélectionnées par select_lambda.
void applyMax(SmallSpan< const DataType > values, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Max' sur les valeurs values.
void applyMin(SmallSpan< const DataType > values, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Min' sur les valeurs values.
void applySum(SmallSpan< const DataType > values, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Somme' sur les valeurs values.
void applySumWithIndex(Int32 nb_value, const SelectLambda &select_lambda, const TraceInfo &trace_info=TraceInfo())
Applique une réduction 'Somme' sur les valeurs sélectionnées par select_lambda.
Gestion d'une commande sur accélérateur.
File d'exécution pour un accélérateur.
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
eExecutionPolicy executionPolicy() const
Politique d'exécution de la file.
Gère l'allocation interne sur le device.
Classe de base pour effectuer une réduction.
Classe pour effectuer un partitionnement d'une liste.
Opérateur de Scan/Reduce pour le maximum.
Opérateur de Scan/Reduce pour le minimum.
Object temporaire pour conserver les informations d'exécution d'une commande et regrouper les tests.
Opérateur de Scan/Reduce pour les sommes.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Espace de nom pour l'utilisation des accélérateurs.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.
eMemoryResource
Liste des ressources mémoire disponibles.
std::int32_t Int32
Type entier signé sur 32 bits.