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__ pointer data() const noexcept
Pointeur sur le début de la vue.
 
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
 
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.