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"
34#include "arcane/parallel/thread/internal/SharedMemoryMachineMemoryWindowBaseInternalCreator.h"
36#include "arcane/core/FactoryService.h"
37#include "arcane/core/IApplication.h"
38#include "arcane/core/ParallelSuperMngDispatcher.h"
39#include "arcane/core/ApplicationBuildInfo.h"
40#include "arcane/core/AbstractService.h"
41#include "arcane/core/ServiceBuilder.h"
43#include "arcane/core/IMainFactory.h"
56class SharedMemoryParallelMngContainer
61 MP::Communicator mpi_comm,
63 ~SharedMemoryParallelMngContainer()
override;
73 Int32 m_nb_local_rank;
76 Mutex* m_internal_create_mutex =
nullptr;
84 MP::Communicator m_communicator;
90SharedMemoryParallelMngContainer::
92 MP::Communicator mpi_comm,
94: m_application(app), m_nb_local_rank(nb_local_rank)
96, m_sub_factory_builder(factory)
97, m_communicator(mpi_comm)
104SharedMemoryParallelMngContainer::
105~SharedMemoryParallelMngContainer()
107 if (m_thread_barrier)
109 delete m_message_queue;
111 delete m_all_dispatchers;
112 delete m_internal_create_mutex;
113 delete m_window_creator;
119void SharedMemoryParallelMngContainer::
122 m_message_queue =
new SharedMemoryMessageQueue();
123 m_message_queue->init(m_nb_local_rank);
126 m_thread_barrier->
init(m_nb_local_rank);
128 m_all_dispatchers =
new SharedMemoryAllDispatcher();
129 m_all_dispatchers->resize(m_nb_local_rank);
131 m_internal_create_mutex =
new Mutex();
133 m_window_creator =
new SharedMemoryMachineMemoryWindowBaseInternalCreator(m_nb_local_rank, m_thread_barrier);
142 if (local_rank<0 || local_rank>=m_nb_local_rank)
144 local_rank,m_nb_local_rank);
151 build_info.rank = local_rank;
152 build_info.nb_rank = m_nb_local_rank;
153 build_info.trace_mng = tm;
154 build_info.thread_mng = m_thread_mng;
156 build_info.world_parallel_mng =
nullptr;
157 build_info.message_queue = m_message_queue;
158 build_info.thread_barrier = m_thread_barrier;
159 build_info.all_dispatchers = m_all_dispatchers;
160 build_info.sub_builder_factory = m_sub_factory_builder;
162 build_info.window_creator = m_window_creator;
166 build_info.communicator = m_communicator;
177class SharedMemoryParallelMngContainerFactory
205SharedMemoryParallelSuperMng::
214SharedMemoryParallelSuperMng::
215SharedMemoryParallelSuperMng(
const ServiceBuildInfo& sbi,MP::Communicator comm,
217: m_application(sbi.application())
219, m_is_parallel(false)
220, m_communicator(comm)
223 m_has_mpi_init = has_mpi_init;
229SharedMemoryParallelSuperMng::
230~SharedMemoryParallelSuperMng()
250 ARCANE_FATAL(
"Can not create SharedMemoryParallelSuperMng because threads are disabled");
254 if (!m_has_mpi_init){
255 Request::setNullRequest(Request(0,
nullptr,0));
262 ARCANE_FATAL(
"Number of shared memory sub-domains is not defined");
265 app_tm->
info() <<
"SharedMemoryParallelSuperMng: nb_local_sub_domain=" << n;
268 String service_name =
"SharedMemoryParallelMngContainerFactory";
283 if (local_rank<0 || local_rank>=max_rank)
285 local_rank,max_rank);
294 tm =
m_application->createAndInitializeTraceMng(app_tm,String::fromNumber(local_rank));
317 ARCANE_UNUSED(send_buf);
318 ARCANE_UNUSED(process_id);
327 ARCANE_UNUSED(send_buf);
328 ARCANE_UNUSED(process_id);
337 ARCANE_UNUSED(send_buf);
338 ARCANE_UNUSED(process_id);
347 ARCANE_UNUSED(send_buf);
348 ARCANE_UNUSED(process_id);
357 return m_container->m_thread_mng;
366 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.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Exception lorsqu'un argument est invalide.
Interface de l'application.
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.
virtual Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank)=0
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
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 d'un gestionnaire de thread.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Communicateur pour l'échange de message.
Interface d'une file de messages avec les threads.
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.
void broadcast(ByteArrayView send_buf, Int32 rank) override
Envoie un tableau de valeurs sur tous les processus Cette opération synchronise le tableau de valeur ...
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.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
IApplication * application() const
Accès à l'application IApplication associé.
Structure contenant les informations pour créer un service.
Classe utilitaire pour instantier un service d'une interface donnée.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Propriétés de création d'un service.
Chaîne de caractères unicode.
#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.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
@ ST_Application
Le service s'utilise au niveau de l'application.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un SharedMemoryParallelMng.