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>
35template <
typename DataType,
typename Operator>
38template <
typename DataType>
45template <
typename DataType>
52template <
typename DataType>
68template <
typename DataType>
69class GenericReducerBase
75 GenericReducerBase(
const RunQueue& queue)
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>
123 InputIterator input_iter, ReduceOperator reduce_op,
const TraceInfo& trace_info)
127 command << trace_info;
131 switch (exec_policy) {
132#if defined(ARCANE_COMPILING_CUDA)
134 size_t temp_storage_size = 0;
135 cudaStream_t stream = impl::CudaUtils::toNativeStream(queue);
136 DataType* reduced_value_ptr =
nullptr;
138 ARCANE_CHECK_CUDA(::cub::DeviceReduce::Reduce(
nullptr, temp_storage_size, input_iter, reduced_value_ptr,
139 nb_item, reduce_op, init_value, stream));
141 s.m_algo_storage.allocate(temp_storage_size);
142 reduced_value_ptr = s.m_device_reduce_storage.allocate();
143 ARCANE_CHECK_CUDA(::cub::DeviceReduce::Reduce(s.m_algo_storage.address(), temp_storage_size,
144 input_iter, reduced_value_ptr, nb_item,
145 reduce_op, init_value, stream));
146 s.m_device_reduce_storage.copyToAsync(s.m_host_reduce_storage, queue);
149#if defined(ARCANE_COMPILING_HIP)
151 size_t temp_storage_size = 0;
152 hipStream_t stream = impl::HipUtils::toNativeStream(queue);
153 DataType* reduced_value_ptr =
nullptr;
155 ARCANE_CHECK_HIP(rocprim::reduce(
nullptr, temp_storage_size, input_iter, reduced_value_ptr, init_value,
156 nb_item, reduce_op, stream));
158 s.m_algo_storage.allocate(temp_storage_size);
159 reduced_value_ptr = s.m_device_reduce_storage.allocate();
161 ARCANE_CHECK_HIP(rocprim::reduce(s.m_algo_storage.address(), temp_storage_size, input_iter, reduced_value_ptr, init_value,
162 nb_item, reduce_op, stream));
163 s.m_device_reduce_storage.copyToAsync(s.m_host_reduce_storage, queue);
166#if defined(ARCANE_COMPILING_SYCL)
171 ReducerType reducer(command2);
175 reducer.combine(input_iter[i]);
178 s.m_host_reduce_storage[0] = reducer.reducedValue();
186 DataType reduced_value = init_value;
187 for (
Int32 i = 0; i < nb_item; ++i) {
188 reduced_value = reduce_op(reduced_value, *input_iter);
191 s.m_host_reduce_storage[0] = reduced_value;
247template <
typename DataType>
253 explicit GenericReducer(
const RunQueue& queue)
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>
314 void _apply(
Int32 nb_value, InputIterator input_iter, ReduceOperator reduce_op,
const TraceInfo& trace_info)
319 DataType init_value = reduce_op.defaultValue();
320 gf.apply(*base_ptr, nb_value, init_value, input_iter, reduce_op, trace_info);
323 template <
typename GetterLambda,
typename ReduceOperator>
324 void _applyWithIndex(
Int32 nb_value,
const GetterLambda& getter_lambda,
325 ReduceOperator reduce_op,
const TraceInfo& trace_info)
328 impl::GenericReducerBase<DataType>* base_ptr =
this;
329 impl::GenericReducerIf<DataType> gf;
330 impl::GetterLambdaIterator<DataType, GetterLambda> input_iter(getter_lambda);
331 DataType init_value = reduce_op.defaultValue();
332 gf.apply(*base_ptr, nb_value, init_value, input_iter, reduce_op, trace_info);
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.
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.
Classe pour effectuer une réduction 'max'.
Classe pour effectuer une réduction 'min'.
Classe pour effectuer une réduction 'somme'.
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.
Opérateur de Scan/Reduce pour le maximum.
Opérateur de Scan/Reduce pour le minimum.
void beginExecute()
Indique qu'on commence l'exécution de la commande.
void endExecute()
Signale la fin de l'exécution.
Opérateur de Scan/Reduce pour les sommes.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
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.
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
std::int32_t Int32
Type entier signé sur 32 bits.