14#include "arcane/utils/ApplicationInfo.h"
15#include "arcane/utils/NullThreadMng.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/ValueConvert.h"
20#include "arcane/utils/TraceClassConfig.h"
21#include "arcane/utils/ArgumentException.h"
22#include "arcane/utils/CommandLineArguments.h"
24#include "arcane/parallel/IStat.h"
26#include "arcane/parallel/mpi/MpiAdapter.h"
27#include "arcane/parallel/mpi/MpiParallelMng.h"
28#include "arcane/parallel/mpi/MpiParallelDispatch.h"
29#include "arcane/parallel/mpi/MpiLock.h"
30#include "arcane/parallel/mpi/MpiErrorHandler.h"
32#include "arcane/parallel/thread/SharedMemoryMessageQueue.h"
33#include "arcane/parallel/thread/SharedMemoryParallelMng.h"
34#include "arcane/parallel/thread/SharedMemoryParallelSuperMng.h"
35#include "arcane/parallel/thread/internal/SharedMemoryThreadMng.h"
37#include "arcane/parallel/mpithread/HybridParallelMng.h"
38#include "arcane/parallel/mpithread/HybridParallelDispatch.h"
40#include "arcane/core/FactoryService.h"
41#include "arcane/core/AbstractService.h"
42#include "arcane/core/IApplication.h"
43#include "arcane/core/ParallelSuperMngDispatcher.h"
44#include "arcane/core/ApplicationBuildInfo.h"
45#include "arcane/core/ServiceBuilder.h"
47#include "arcane/core/IMainFactory.h"
85 Int32 m_local_nb_rank = -1;
89 Mutex* m_internal_create_mutex =
nullptr;
96 void _setMPICommunicator();
102HybridParallelMngContainer::
109, m_mpi_lock(mpi_lock)
112, m_sub_builder_factory(factory)
113, m_mpi_communicator(mpi_comm)
115 _setMPICommunicator();
121HybridParallelMngContainer::
122~HybridParallelMngContainer()
126 delete m_message_queue;
128 delete m_all_dispatchers;
129 delete m_parallel_mng_list;
130 delete m_internal_create_mutex;
136void HybridParallelMngContainer::
139 m_internal_create_mutex =
new Mutex();
141 m_all_dispatchers =
new MpiThreadAllDispatcher();
142 m_all_dispatchers->resize(m_local_nb_rank);
144 m_parallel_mng_list->resize(m_local_nb_rank);
145 m_parallel_mng_list->fill(
nullptr);
147 m_message_queue =
new SharedMemoryMessageQueue();
148 m_message_queue->init(m_local_nb_rank);
151 m_thread_barrier->
init(m_local_nb_rank);
157void HybridParallelMngContainer::
162 if (comm==MPI_COMM_NULL)
163 ARCANE_THROW(ArgumentException,
"Null MPI Communicator");
183 local_rank,m_local_nb_rank);
193 bi.is_parallel = is_parallel;
197 bi.is_mpi_comm_owned =
false;
198 bi.mpi_lock = m_mpi_lock;
201 tm->
info() <<
"MPI implementation need serialized threads : using locks";
207 mpi_pm->adapter()->enableDebugRequest(
false);
217 build_info.parallel_mng_list = m_parallel_mng_list;
218 build_info.all_dispatchers = m_all_dispatchers;
219 build_info.sub_builder_factory = m_sub_builder_factory;
225 (*m_parallel_mng_list)[local_rank] = pm;
248 this,m_stat,m_mpi_lock);
283 void build()
override;
314 Int32 m_local_nb_rank = A_NULL_RANK;
324HybridParallelSuperMng::
326: m_application(
sbi.application())
330, m_local_nb_rank(A_NULL_RANK)
341HybridParallelSuperMng::
342~HybridParallelSuperMng()
344 m_error_handler.removeHandler();
346 delete m_datatype_list;
351 MPI_Barrier(m_mpi_communicator);
352 MPI_Comm_free(&m_mpi_communicator);
353 m_mpi_communicator = MPI_COMM_NULL;
372 ARCANE_FATAL(
"Can not create HybridParallelSuperMng because threads are disabled");
379 char*** argv =
nullptr;
402 Real
end_time = platform::getRealTime();
414 ARCANE_FATAL(
"MPI thread level provided!=wanted ({0}!={1})",
434 m_error_handler.registerHandler(m_mpi_communicator);
436 Integer n =
app->applicationBuildInfo().nbSharedMemorySubDomain();
438 ARCANE_FATAL(
"Number of shared memory sub-domains is not defined");
443 tm->
info() <<
"MPI has non blocking collective";
456 auto* adapter =
new MpiAdapter(
tm,m_stat->toArccoreStat(),m_communicator,
nullptr);
457 m_mpi_adapter = adapter;
462 _setDispatchers(
c,
i32,i64,
r);
#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_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base d'un service.
Informations sur une application.
Arguments de la ligne de commande.
Interface de l'application.
virtual ITraceMng * createAndInitializeTraceMng(ITraceMng *parent_trace, const String &file_suffix)=0
Créé et initialise une instance de ITraceMng.
virtual const ApplicationInfo & applicationInfo() const =0
Informations sur l'exécutable.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'une fabrique de conteneur de 'IParallelMng'.
virtual void build()=0
Construit l'instance.
Classe abstraite du superviseur de parallélisme.
Interface d'un gestionnaire de thread.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Ref< IParallelMngContainer > _createParallelMngBuilder(Int32 nb_rank, MP::Communicator mpi_communicator) override
Créé un conteneur pour nb_local_rank rangs locaux et avec comme communicateur communicator.
Conteneur des informations du gestionnaire de message en mode hybride.
Int32 m_mpi_comm_size
Nombre de processeurs.
IThreadMng * m_thread_mng
Statistiques.
IApplication * m_application
Gestionnaire principal.
Int32 m_mpi_comm_rank
Numéro du processeur actuel.
MPI_Comm m_mpi_communicator
Communicateur MPI.
Ref< IParallelMng > _createParallelMng(Int32 local_rank, ITraceMng *tm) override
Créé le IParallelMng pour le rang local local_rank.
Gestionnaire du parallélisme utilisant les threads.
Superviseur du parallélisme utilisant MPI et Threads.
void tryAbort() override
Tente de faire un abort.
Int32 commRank() const override
Retourne le numéro du process (compris entre 0 et nbProcess()-1)
MP::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
Int32 m_mpi_comm_rank
Statistiques.
void build() override
Construit les membres l'instance.
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
IThreadMng * threadMng() const override
Gestionnaire de thread.
IApplication * application() const override
Retourne le gestionnaire principal.
void barrier() override
Gestionnaire de parallèlisme pour l'ensemble des ressources allouées.
Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank) override
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
Integer masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
void initialize() override
Initialise l'instance.
Int32 m_mpi_comm_size
Nombre de processeurs.
Integer nbLocalSubDomain() override
Nombre de sous-domaines à créér localement.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
Int32 commSize() const override
Retourne le nombre total de process utilisés.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
Int32 traceRank() const override
Rang de cette instance pour les traces.
IApplication * m_application
Gestionnaire principal.
Interface d'une file de messages avec les threads.
Superviseur en mémoire partagé avec initialisation MPI.
void build() override
Construit les membres l'instance.
Superviseur du parallélisme utilisant les threads.
void build() override
Construit les membres l'instance.
Gère les MPI_Datatype associées aux types Arcane.
Interface des messages pour le type Type.
Gestionnaire du parallélisme utilisant MPI.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
Statistiques sur le parallélisme.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Exception lorsqu'un argument est invalide.
Interface d'une barrière entre threads.
virtual void destroy()=0
Détruit la barrière.
virtual void init(Integer nb_thread)=0
Initialise la barrière pour nb_thread.
Interface du gestionnaire de traces.
Communicateur pour l'échange de message.
void destroy()
Détruit l'instance. Elle ne doit plus être utilisée par la suite.
Verrou pour les appels MPI.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
IStat * createDefaultStat()
Créé une instance par défaut.
ARCANE_MPI_EXPORT void arcaneInitializeMPI(int *argc, char ***argv, int wanted_thread_level)
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
ARCANE_MPI_EXPORT bool arcaneIsCudaAwareMPI()
Indique si le runtime actuel de MPI a le support de CUDA.
@ ST_Application
Le service s'utilise au niveau de l'application.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
ARCANE_MPI_EXPORT void arcaneFinalizeMPI()
Infos pour construire un HybridParallelMng.
Infos pour construire un MpiParallelMng.