12#ifndef ARCANE_UTILS_CONCURRENCYUTILS_H
13#define ARCANE_UTILS_CONCURRENCYUTILS_H
18#include "arcane/utils/RangeFunctor.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/ForLoopTraceInfo.h"
21#include "arcane/utils/ParallelLoopOptions.h"
75 virtual ITaskFunctor* clone(
void* buffer,Integer size) =0;
85template<
typename InstanceType>
90 typedef void (InstanceType::*FunctorType)();
92 TaskFunctor(InstanceType* instance,FunctorType func)
93 : m_instance(instance), m_function(func)
102 (m_instance->*m_function)();
106 if (
sizeof(*
this)>(
size_t)size)
107 ARCANE_FATAL(
"INTERNAL: task functor buffer is too small");
111 InstanceType* m_instance;
112 FunctorType m_function;
122template<
typename InstanceType>
127 typedef void (InstanceType::*FunctorType)(
const TaskContext& tc);
130 :
ITaskFunctor(), m_instance(instance), m_function(func)
137 (m_instance->*m_function)(tc);
141 if (
sizeof(*
this)>(
size_t)size)
142 ARCANE_FATAL(
"INTERNAL: task functor buffer is too small");
146 InstanceType* m_instance;
147 FunctorType m_function;
209 virtual void initialize(Int32 nb_thread) =0;
215 virtual void terminate() =0;
286 template<
typename InstanceType>
static ITask*
290 return m_impl->createRootTask(&functor);
298 template<
typename InstanceType>
static ITask*
299 createTask(InstanceType* instance,
void (InstanceType::*function)())
302 return m_impl->createRootTask(&functor);
311 template<
typename InstanceType>
static ITask*
316 return parent_task->_createChildTask(&functor);
325 template<
typename InstanceType>
static ITask*
330 return parent_task->_createChildTask(&functor);
336 m_impl->executeParallelFor(begin,size,options,f);
342 m_impl->executeParallelFor(begin,size,block_size,f);
348 m_impl->executeParallelFor(begin,size,f);
354 m_impl->executeParallelFor(loop_info);
362 m_impl->executeParallelFor(loop_ranges,options,functor);
370 m_impl->executeParallelFor(loop_ranges,options,functor);
378 m_impl->executeParallelFor(loop_ranges,options,functor);
386 m_impl->executeParallelFor(loop_ranges,options,functor);
392 return m_impl->nbAllowedThread();
404 return m_impl->currentTaskThreadIndex();
422 return m_impl->currentTaskIndex();
430 m_default_loop_options = v;
436 return m_default_loop_options;
448 return m_impl->isActive();
459 return m_impl->printInfos(o);
487 static void terminate();
507 static Int32 m_verbose_level;
529 : m_options(options) {}
531 : m_options(options), m_trace_info(trace_info) {}
533 : m_trace_info(trace_info) {}
537 std::optional<ParallelLoopOptions> options()
const {
return m_options; }
550 ForLoopOneExecStat*
execStat()
const {
return m_exec_stat; }
554 std::optional<ParallelLoopOptions> m_options;
556 ForLoopOneExecStat* m_exec_stat =
nullptr;
576 : m_begin(begin), m_size(size), m_functor(functor) {}
578 : m_run_info(run_info), m_begin(begin), m_size(size), m_functor(functor) {}
580 : m_begin(begin), m_size(size), m_functor(functor)
584 m_run_info.addOptions(opts);
589 Int32 beginIndex()
const {
return m_begin; }
590 Int32 size()
const {
return m_size; }
609template<
int RankValue,
typename LambdaType,
typename... ReducerArgs>
inline void
612 const LambdaType& lambda_function,
613 const ReducerArgs&... reducer_args)
627 using Type =
typename std::remove_reference<LambdaType>::type;
628 Type private_lambda(lambda_function);
641template <
int RankValue,
typename LambdaType,
typename... ReducerArgs>
inline void
644 const LambdaType& lambda_function,
645 const ReducerArgs&... reducer_args)
648 arcaneParallelFor(complex_loop_ranges, options, lambda_function, reducer_args...);
657template<
int RankValue,
typename LambdaType>
inline void
659 const LambdaType& lambda_function)
671template<
int RankValue,
typename LambdaType>
inline void
673 const LambdaType& lambda_function)
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Déclarations des types utilisés dans Arcane.
Informations d'exécution d'une boucle.
ForLoopOneExecStat * execStat() const
Pointeur contenant les statistiques d'exécution.
void setExecStat(ForLoopOneExecStat *v)
Positionne le pointeur conservant les statistiques d'exécution.
Informations de trace pour une boucle 'for'.
Interface d'un fonctor sur un interval d'itération multi-dimensionnel de dimension RankValue.
Interface d'un observable.
Interface d'un fonctor sur un interval d'itération.
virtual void executeFunctor(const TaskContext &tc)=0
Exécute la méthode associé
virtual void executeParallelFor(Integer begin, Integer size, const ParallelLoopOptions &options, IRangeFunctor *f)=0
Exécute le fonctor f en concurrence.
virtual void executeParallelFor(Integer begin, Integer size, IRangeFunctor *f)=0
Exécute le fonctor f en concurrence.
virtual void executeParallelFor(const ParallelFor1DLoopInfo &loop_info)=0
Exécute la boucle loop_info en concurrence.
virtual Int32 nbAllowedThread() const =0
Nombre de threads utilisés au maximum pour gérer les tâches.
virtual void executeParallelFor(Integer begin, Integer size, Integer block_size, IRangeFunctor *f)=0
Exécute le fonctor f en concurrence.
virtual ITask * createRootTask(ITaskFunctor *f)=0
Créé une tâche racine. L'implémentation doit recopier la valeur de f qui est soit un TaskFunctor,...
virtual Int32 currentTaskIndex() const =0
Implémentation de TaskFactory::currentTaskIndex()
virtual void executeParallelFor(const ComplexForLoopRanges< 4 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 4 > *functor)=0
Exécute une boucle 4D en concurrence.
virtual bool isActive() const =0
Indique si l'implémentation est active.
virtual void executeParallelFor(const ComplexForLoopRanges< 1 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 1 > *functor)=0
Exécute une boucle 1D en concurrence.
virtual void executeParallelFor(const ComplexForLoopRanges< 2 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 2 > *functor)=0
Exécute une boucle 2D en concurrence.
virtual void printInfos(std::ostream &o) const =0
Affiche les informations sur le runtime utilisé
virtual Int32 currentTaskThreadIndex() const =0
Implémentation de TaskFactory::currentTaskThreadIndex()
virtual void executeParallelFor(const ComplexForLoopRanges< 3 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 3 > *functor)=0
Exécute une boucle 3D en concurrence.
Interface d'une tâche concourante.
virtual void launchAndWait()=0
Lance la tâche et bloque jusqu'à ce qu'elle se termine.
virtual void launchAndWait(ConstArrayView< ITask * > tasks)=0
Lance les tâches filles tasks et bloque jusqu'à ce qu'elles se terminent.
Fonctor sur un interval d'itération instancié via une lambda fonction.
Caractéristiques d'un boucle 1D multi-thread.
Options d'exécution d'une boucle parallèle en multi-thread.
void setGrainSize(Integer v)
Positionne la taille (approximative) d'un intervalle d'itération.
Interval d'itération simple.
Contexte d'éxecution d'une tâche.
ITask * task() const
Tâche courante.
Fabrique pour les tâches.
static Int32 currentTaskIndex()
Indice (entre 0 et nbAllowedThread()-1) de la tâche actuelle.
static void executeParallelFor(const ParallelFor1DLoopInfo &loop_info)
Exécute la boucle loop_info en concurrence.
static void setVerboseLevel(Integer v)
Positionne le niveau de verbosité (0 pour pas d'affichage qui est le défaut)
static Int32 nbAllowedThread()
Nombre de threads utilisés au maximum pour gérer les tâches.
static void executeParallelFor(Integer begin, Integer size, IRangeFunctor *f)
Exécute le fonctor f en concurrence.
static ITask * createTask(InstanceType *instance, void(InstanceType::*function)())
Créé une tâche. Lors de l'exécution, la tâche appellera la méthode function via l'instance instance.
static const ParallelLoopOptions & defaultParallelLoopOptions()
Valeurs par défaut d'exécution d'une boucle parallèle.
static void executeParallelFor(const ComplexForLoopRanges< 1 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 1 > *functor)
Exécute une boucle simple.
static Integer verboseLevel()
Niveau de verbosité
static void executeParallelFor(const ComplexForLoopRanges< 4 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 4 > *functor)
Exécute une boucle 4D.
static void executeParallelFor(const ComplexForLoopRanges< 2 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 2 > *functor)
Exécute une boucle 2D.
static void setDefaultParallelLoopOptions(const ParallelLoopOptions &v)
Positionne les valeurs par défaut d'exécution d'une boucle parallèle.
static void executeParallelFor(Integer begin, Integer size, const ParallelLoopOptions &options, IRangeFunctor *f)
Exécute le fonctor f en concurrence.
static void executeParallelFor(Integer begin, Integer size, Integer block_size, IRangeFunctor *f)
Exécute le fonctor f en concurrence.
static void executeParallelFor(const ComplexForLoopRanges< 3 > &loop_ranges, const ParallelLoopOptions &options, IMDRangeFunctor< 3 > *functor)
Exécute une boucle 3D.
static ITask * createChildTask(ITask *parent_task, InstanceType *instance, void(InstanceType::*function)(const TaskContext &tc))
Créé une tâche fille.
static Int32 currentTaskThreadIndex()
Indice (entre 0 et nbAllowedThread()-1) du thread exécutant la tâche actuelle.
static ITask * createChildTask(ITask *parent_task, InstanceType *instance, void(InstanceType::*function)())
Créé une tâche fille.
static bool isActive()
Indique si les tâches sont actives. Les tâches sont actives si une implémentation est disponible et s...
static ITask * createTask(InstanceType *instance, void(InstanceType::*function)(const TaskContext &tc))
Créé une tâche. Lors de l'exécution, la tâche appellera la méthode function via l'instance instance.
static void printInfos(std::ostream &o)
Affiche les informations sur l'implémentation.
void executeFunctor(const TaskContext &tc) override
Exécute la méthode associé
void executeFunctor(const TaskContext &) override
Exécute la méthode associé
Vue constante d'un tableau de type T.
void arcaneParallelFor(Integer i0, Integer size, InstanceType *itype, void(InstanceType::*lambda_function)(Integer i0, Integer size))
Applique en concurrence la fonction lambda lambda_function sur l'intervalle d'itération [i0,...
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void arcaneSequentialFor(LoopBoundType< 1, IndexType > bounds, const Lambda &func, ReducerArgs... reducer_args)
Applique le fonctor func sur une boucle 1D.