14#include "arcane/parallel/thread/SharedMemoryParallelSuperMng.h"
16#include "arcane/utils/ApplicationInfo.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/NotImplementedException.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/ValueConvert.h"
22#include "arcane/utils/IThreadMng.h"
23#include "arcane/utils/TraceClassConfig.h"
24#include "arcane/utils/ITraceMng.h"
25#include "arcane/utils/IThreadImplementation.h"
26#include "arcane/utils/Mutex.h"
28#include "arcane/parallel/IStat.h"
30#include "arcane/parallel/thread/SharedMemoryParallelMng.h"
31#include "arcane/parallel/thread/SharedMemoryParallelDispatch.h"
32#include "arcane/parallel/thread/SharedMemoryMessageQueue.h"
33#include "arcane/parallel/thread/internal/SharedMemoryThreadMng.h"
35#include "arcane/core/FactoryService.h"
36#include "arcane/core/IApplication.h"
37#include "arcane/core/ParallelSuperMngDispatcher.h"
38#include "arcane/core/ApplicationBuildInfo.h"
39#include "arcane/core/AbstractService.h"
40#include "arcane/core/ServiceBuilder.h"
42#include "arcane/core/IMainFactory.h"
72 Int32 m_nb_local_rank;
75 Mutex* m_internal_create_mutex =
nullptr;
88SharedMemoryParallelMngContainer::
94, m_sub_factory_builder(factory)
95, m_communicator(mpi_comm)
102SharedMemoryParallelMngContainer::
103~SharedMemoryParallelMngContainer()
105 if (m_thread_barrier)
107 delete m_message_queue;
109 delete m_all_dispatchers;
110 delete m_internal_create_mutex;
116void SharedMemoryParallelMngContainer::
119 m_message_queue =
new SharedMemoryMessageQueue();
120 m_message_queue->init(m_nb_local_rank);
123 m_thread_barrier->
init(m_nb_local_rank);
125 m_all_dispatchers =
new SharedMemoryAllDispatcher();
126 m_all_dispatchers->resize(m_nb_local_rank);
128 m_internal_create_mutex =
new Mutex();
139 local_rank,m_nb_local_rank);
150 build_info.sequential_parallel_mng =
sm->internalCreateWorldParallelMng(0);
154 build_info.all_dispatchers = m_all_dispatchers;
155 build_info.sub_builder_factory = m_sub_factory_builder;
199SharedMemoryParallelSuperMng::
208SharedMemoryParallelSuperMng::
209SharedMemoryParallelSuperMng(
const ServiceBuildInfo& sbi,
MP::Communicator comm,
211: m_application(sbi.application())
213, m_is_parallel(false)
214, m_communicator(comm)
217 m_has_mpi_init = has_mpi_init;
223SharedMemoryParallelSuperMng::
224~SharedMemoryParallelSuperMng()
244 ARCANE_FATAL(
"Can not create SharedMemoryParallelSuperMng because threads are disabled");
248 if (!m_has_mpi_init){
249 Request::setNullRequest(
Request(0,
nullptr,0));
256 ARCANE_FATAL(
"Number of shared memory sub-domains is not defined");
259 app_tm->
info() <<
"SharedMemoryParallelSuperMng: nb_local_sub_domain=" << n;
308void SharedMemoryParallelSuperMng::
311 ARCANE_UNUSED(send_buf);
318void SharedMemoryParallelSuperMng::
321 ARCANE_UNUSED(send_buf);
328void SharedMemoryParallelSuperMng::
331 ARCANE_UNUSED(send_buf);
332 ARCANE_UNUSED(process_id);
338void SharedMemoryParallelSuperMng::
341 ARCANE_UNUSED(send_buf);
342 ARCANE_UNUSED(process_id);
351 return m_container->m_thread_mng;
360 return m_container->m_nb_local_rank;
#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.
Interface de l'application.
virtual const ApplicationBuildInfo & applicationBuildInfo() const =0
Informations sur les paramètres de construction de l'instance.
virtual ITraceMng * createAndInitializeTraceMng(ITraceMng *parent_trace, const String &file_suffix)=0
Créé et initialise une instance de ITraceMng.
virtual IParallelSuperMng * sequentialParallelSuperMng()=0
Gestionnaire un superviseur séquentiel du parallélisme.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Interface du gestionnaire de parallélisme pour un sous-domaine.
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.
Interface d'une file de messages avec les threads.
Ref< IParallelMngContainer > _createParallelMngBuilder(Int32 nb_rank, MP::Communicator comm) override
Créé un conteneur pour nb_local_rank rangs locaux et avec comme communicateur communicator.
Conteneur des informations du gestionnaire de message en mémoire partagée.
Ref< IParallelMng > _createParallelMng(Int32 local_rank, ITraceMng *tm) override
Créé le IParallelMng pour le rang local local_rank.
IApplication * m_application
Gestionnaire principal.
Gestionnaire du parallélisme utilisant les threads.
Superviseur du parallélisme utilisant les threads.
Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank) override
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
void build() override
Construit les membres l'instance.
bool m_is_parallel
Statistiques.
IApplication * m_application
Gestionnaire principal.
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
Parallel::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
Int32 nbLocalSubDomain() override
Nombre de sous-domaines à créér localement.
IThreadMng * threadMng() const override
Gestionnaire de thread.
void tryAbort() override
Tente de faire un abort.
void initialize() override
Initialise l'instance.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
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.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
#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.
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
@ ST_Application
Le service s'utilise au niveau de l'application.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
Infos pour construire un SharedMemoryParallelMng.