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"
55class SharedMemoryParallelMngContainer
60 MP::Communicator mpi_comm,
62 ~SharedMemoryParallelMngContainer()
override;
72 Int32 m_nb_local_rank;
75 Mutex* m_internal_create_mutex =
nullptr;
82 MP::Communicator m_communicator;
88SharedMemoryParallelMngContainer::
90 MP::Communicator mpi_comm,
92: m_application(app), m_nb_local_rank(nb_local_rank)
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();
137 if (local_rank<0 || local_rank>=m_nb_local_rank)
139 local_rank,m_nb_local_rank);
146 build_info.rank = local_rank;
147 build_info.nb_rank = m_nb_local_rank;
148 build_info.trace_mng = tm;
149 build_info.thread_mng = m_thread_mng;
151 build_info.world_parallel_mng =
nullptr;
152 build_info.message_queue = m_message_queue;
153 build_info.thread_barrier = m_thread_barrier;
154 build_info.all_dispatchers = m_all_dispatchers;
155 build_info.sub_builder_factory = m_sub_factory_builder;
160 build_info.communicator = m_communicator;
171class SharedMemoryParallelMngContainerFactory
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;
262 String service_name =
"SharedMemoryParallelMngContainerFactory";
277 if (local_rank<0 || local_rank>=max_rank)
279 local_rank,max_rank);
288 tm =
m_application->createAndInitializeTraceMng(app_tm,String::fromNumber(local_rank));
311 ARCANE_UNUSED(send_buf);
312 ARCANE_UNUSED(process_id);
321 ARCANE_UNUSED(send_buf);
322 ARCANE_UNUSED(process_id);
331 ARCANE_UNUSED(send_buf);
332 ARCANE_UNUSED(process_id);
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.
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.