14#include "arccore/base/ReferenceCounter.h"
16#include "arccore/message_passing/PointToPointMessageInfo.h"
18#include "arcane/utils/Collection.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/Real2.h"
22#include "arcane/utils/Real2x2.h"
23#include "arcane/utils/Real3.h"
24#include "arcane/utils/Real3x3.h"
25#include "arcane/utils/HPReal.h"
26#include "arcane/utils/NullThreadMng.h"
27#include "arcane/utils/ArgumentException.h"
29#include "arcane/core/IIOMng.h"
30#include "arcane/core/ISubDomain.h"
31#include "arcane/core/IApplication.h"
32#include "arcane/core/IParallelDispatch.h"
33#include "arcane/core/ParallelMngDispatcher.h"
34#include "arcane/core/ItemGroup.h"
35#include "arcane/core/IMesh.h"
36#include "arcane/core/IItemFamily.h"
37#include "arcane/core/MeshVariable.h"
38#include "arcane/core/Timer.h"
39#include "arcane/core/FactoryService.h"
40#include "arcane/core/AbstractService.h"
41#include "arcane/core/SerializeMessage.h"
43#include "arcane/parallel/IStat.h"
45#include "arcane/impl/TimerMng.h"
46#include "arcane/impl/GetVariablesValuesParallelOperation.h"
47#include "arcane/impl/ParallelExchanger.h"
48#include "arcane/impl/ParallelTopology.h"
49#include "arcane/impl/ParallelReplication.h"
50#include "arcane/impl/SequentialParallelSuperMng.h"
51#include "arcane/impl/SequentialParallelMng.h"
52#include "arcane/impl/ParallelMngUtilsFactoryBase.h"
53#include "arcane/impl/internal/VariableSynchronizer.h"
55#include "arccore/message_passing/RequestListBase.h"
56#include "arccore/message_passing/SerializeMessageList.h"
64using IRequestList = Parallel::IRequestList;
69extern "C++" IVariableSynchronizer*
70createNullVariableSynchronizer(IParallelMng* pm,
const ItemGroup& group);
102 void finalize()
override {}
106 ARCANE_UNUSED(send_buf);
109 void broadcast(
Span<Type> send_buf,Int32 rank)
override
111 ARCANE_UNUSED(send_buf);
116 recv_buf.copy(send_buf);
120 recv_buf.copy(send_buf);
125 recv_buf.copy(send_buf);
130 recv_buf.copy(send_buf);
135 recv_buf.copy(send_buf);
140 recv_buf.copy(send_buf);
144 gatherVariable(send_buf,recv_buf,0);
148 gatherVariable(send_buf,recv_buf,0);
153 recv_buf.resize(send_buf.size());
160 recv_buf.resize(send_buf.size());
166 ARCANE_UNUSED(count);
167 recv_buf.copy(send_buf);
171 ARCANE_UNUSED(count);
172 recv_buf.copy(send_buf);
181 ARCANE_UNUSED(send_count);
182 ARCANE_UNUSED(recv_count);
183 ARCANE_UNUSED(send_index);
184 ARCANE_UNUSED(recv_index);
185 recv_buf.copy(send_buf);
194 ARCANE_UNUSED(send_count);
195 ARCANE_UNUSED(recv_count);
196 ARCANE_UNUSED(send_index);
197 ARCANE_UNUSED(recv_index);
198 recv_buf.copy(send_buf);
263 ARCANE_UNUSED(send_buf);
268 ARCANE_UNUSED(send_buf);
273 ARCANE_UNUSED(send_buf);
274 ARCANE_UNUSED(recv_buf);
279 recv_buf.copy(send_buf);
284 ARCANE_UNUSED(send_buf);
291 recv_buf.copy(send_buf);
296 ARCANE_UNUSED(count);
297 recv_buf.copy(send_buf);
304 ARCANE_UNUSED(send_count);
305 ARCANE_UNUSED(recv_count);
306 ARCANE_UNUSED(send_index);
307 ARCANE_UNUSED(recv_index);
308 recv_buf.copy(send_buf);
319 ARCANE_UNUSED(send_buf);
335 const Integer n = values.size();
336 for(Integer i=0;i<n;++i) {
357 return makeRef(createNullVariableSynchronizer(pm,family->
allItems()));
361 return makeRef(createNullVariableSynchronizer(pm,group));
389 void setBaseObject(
IBase* m);
406 void sendSerializer(
ISerializer* values,Int32 rank)
override
408 ARCANE_UNUSED(values);
413 ARCANE_UNUSED(values);
415 ARCANE_UNUSED(bytes);
423 void recvSerializer(
ISerializer* values,Int32 rank)
override
425 ARCANE_UNUSED(values);
434 void broadcastString(
String& str,Int32 rank)
override
441 ARCANE_UNUSED(bytes);
444 void broadcastSerializer(
ISerializer* values,Int32 rank)
override
446 ARCANE_UNUSED(values);
451 ARCANE_UNUSED(message);
456 ARCANE_UNUSED(message);
461 ARCANE_UNUSED(values);
462 ARCANE_UNUSED(message);
465 Request receiveSerializer(ISerializer* values,
const PointToPointMessageInfo& message)
override
467 ARCANE_UNUSED(values);
468 ARCANE_UNUSED(message);
469 return Parallel::Request();
478 ARCANE_UNUSED(requests);
489 ARCANE_UNUSED(requests);
495 ARCANE_UNUSED(requests);
528 return createNullVariableSynchronizer(
this,family->
allItems());
532 return createNullVariableSynchronizer(
this,group);
543 return m_replication;
548 delete m_replication;
560 return m_utils_factory;
568 void build()
override;
584 static Ref<IParallelMng> createRef(
const SequentialParallelMngBuildInfo& bi)
586 return makeRef(create(bi));
593 ARCANE_UNUSED(kept_ranks);
594 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
595 bi.setThreadMng(m_thread_mng);
596 bi.setTraceMng(m_trace.get());
597 bi.setCommunicator(m_communicator);
603 ReferenceCounter<ITraceMng> m_trace;
604 IThreadMng* m_thread_mng =
nullptr;
605 ITimerMng* m_timer_mng =
nullptr;
606 IParallelMng* m_world_parallel_mng =
nullptr;
608 Parallel::IStat* m_stat;
609 IParallelReplication* m_replication;
611 Ref<IParallelMngUtilsFactory> m_utils_factory;
621arcaneCreateIOMng(IParallelMng* psm);
626extern "C++" IParallelMng*
627arcaneCreateSequentialParallelMng(
const SequentialParallelMngBuildInfo& bi)
629 return SequentialParallelMng::create(bi);
631extern "C++" Ref<IParallelMng>
632arcaneCreateSequentialParallelMngRef(
const SequentialParallelMngBuildInfo& bi)
634 return SequentialParallelMng::createRef(bi);
640SequentialParallelMng::
641SequentialParallelMng(
const SequentialParallelMngBuildInfo& bi)
642: ParallelMngDispatcher(ParallelMngDispatcherBuildInfo(0,1))
643, m_trace(bi.traceMng())
644, m_thread_mng(bi.threadMng())
645, m_timer_mng(bi.m_timer_mng)
646, m_world_parallel_mng(bi.m_world_parallel_mng)
649, m_replication(new ParallelReplication())
650, m_communicator(bi.communicator())
651, m_utils_factory(
makeRef<IParallelMngUtilsFactory>(new SequentialParallelMngUtilsFactory()))
653 ARCANE_CHECK_PTR(m_trace);
654 ARCANE_CHECK_PTR(m_thread_mng);
655 if (!m_world_parallel_mng)
656 m_world_parallel_mng =
this;
658 _messagePassingMng()->setCommunicator(m_communicator);
664SequentialParallelMng::
665~SequentialParallelMng()
668 delete m_replication;
675void SequentialParallelMng::
676setBaseObject(IBase* sd)
690 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
692 template<
typename DataType> SequentialParallelDispatchT<DataType>*
695 return new SequentialParallelDispatchT<DataType>(m_tm);
704 m_io_mng = arcaneCreateIOMng(
this);
705 DispatchCreator creator(m_trace.get());
706 this->createDispatchers(creator);
725SequentialParallelSuperMng::
728, m_application(
sbi.application())
738SequentialParallelSuperMng::
739SequentialParallelSuperMng(
const ServiceBuildInfo& sbi,Parallel::Communicator comm)
740: AbstractService(sbi)
741, m_application(sbi.application())
742, m_thread_mng(new NullThreadMng())
743, m_timer_mng(nullptr)
744, m_communicator(comm)
752SequentialParallelSuperMng::
753~SequentialParallelSuperMng()
770 _setDispatchers(
c,
i32,i64,
r);
781 m_timer_mng = m_owned_timer_mng.get();
798 return SequentialParallelMng::createRef(
bi);
854 bi.setThreadMng(m_thread_mng);
855 bi.setCommunicator(m_communicator);
856 return arcaneCreateSequentialParallelMngRef(
bi);
873 ARCANE_UNUSED(nb_rank);
886 ServiceProperty(
"SequentialParallelMngContainerFactory",
ST_Application),
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
#define ARCANE_REGISTER_APPLICATION_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Classe de base d'un service.
Tableau d'items de types quelconques.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface de l'application.
Interface de la classe de base des objets principaux arcane.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
Gestion des messages parallèles pour le type Type.
Echange d'informations entre processeurs.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface des opérations parallèles collectives non bloquantes.
Informations sur la réplication des sous-domaines en parallèle.
Classe abstraite du superviseur de parallélisme.
Informations sur la topologie d'allocation des coeurs de calcul.
Interface d'un gestionnaire de thread.
Interface d'un gestionnaire de timer.
Envoie de valeurs sur différents processeurs.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Gestionnaire de thread en mode mono-thread.
Echange d'informations entre processeurs.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
IMessagePassingMng * messagePassingMng() const override
Gestionnaire de message de Arccore associé
Classe de base d'une fabrique pour les fonctions utilitaires de IParallelMng.
Informations sur la topologie d'allocation des coeurs de calcul.
Statistiques sur le parallélisme.
Interface des messages pour le type Type.
Ref< IParallelMng > _createParallelMng(Int32 local_rank, ITraceMng *tm) override
Créé le IParallelMng pour le rang local local_rank.
Ref< IParallelMngContainer > _createParallelMngBuilder(Int32 nb_rank, Parallel::Communicator comm) override
Créé un conteneur pour nb_local_rank rangs locaux et avec comme communicateur communicator.
Ref< ITransferValuesParallelOperation > createTransferValuesOperation(IParallelMng *) override
Retourne une opération pour transférer des valeurs entre rangs.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, const ItemGroup &group) override
Retourne une interface pour synchroniser des variables sur le groupe group.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
Gestionnaire du parallélisme en mode séquentiel.
Parallel::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
ISerializeMessage * createReceiveSerializer(Int32 rank) override
Créé un message non bloquant pour recevoir des données sérialisées du rang rank.
IParallelNonBlockingCollective * nonBlockingCollective() const override
Interface des opérations collectives non blocantes.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Retourne une opération pour transférer des valeurs entre sous-domaine.
IThreadMng * threadMng() const override
Gestionnaire de threads.
UniqueArray< Integer > testSomeRequests(ArrayView< Request > requests) override
Test si une des requêtes rvalues est terminée.
Int32 commRank() const override
Rang de cette instance dans le communicateur.
ISerializeMessage * createSendSerializer(Int32 rank) override
Créé un message non bloquant pour envoyer des données sérialisées au rang rank.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
IParallelMng * sequentialParallelMng() override
Retourne un gestionnaire de parallélisme séquentiel.
void build() override
Construit l'instance.
void barrier() override
Effectue une barière.
void allGather(ISerializer *send_serializer, ISerializer *recv_serializer) override
Redéfinit ici allGather pour éviter de cacher le symbole dans les classes dérivées.
IGetVariablesValuesParallelOperation * createGetVariablesValuesOperation() override
Retourne une opération pour récupérer les valeurs d'une variable sur les entités d'un autre sous-doma...
IParallelReplication * replication() const override
Informations sur la réplication.
ITimerMng * timerMng() const override
Gestionnaire de timers.
MessageId probe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
Ref< IParallelMngUtilsFactory > _internalUtilsFactory() const override
Fabrique des fonctions utilitaires.
MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
void processMessages(ConstArrayView< ISerializeMessage * > messages) override
Exécute les opérations des messages messages.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
bool isThreadImplementation() const override
Indique si l'implémentation utilise les threads.
Ref< IRequestList > createRequestListRef() override
Créé une liste de requêtes pour ce gestionnaire.
Parallel::IStat * stat() override
Gestionnaire des statistiques.
void printStats() override
Affiche des statistiques liées à ce gestionnaire du parallélisme.
ITraceMng * traceMng() const override
Gestionnaire de traces.
void initialize() override
Initialise le gestionnaire du parallélisme.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
bool isHybridImplementation() const override
Indique si l'implémentation utilise le mode hybride.
IParallelTopology * createTopology() override
Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
void setReplication(IParallelReplication *v) override
Positionne les Informations sur la réplication.
void freeRequests(ArrayView< Parallel::Request > requests) override
Libère les requêtes.
void waitAllRequests(ArrayView< Request > requests) override
Bloque en attendant que les requêtes rvalues soient terminées.
UniqueArray< Integer > waitSomeRequests(ArrayView< Request > requests) override
Bloque en attendant qu'une des requêtes rvalues soit terminée.
void broadcastMemoryBuffer(ByteArray &bytes, Int32 rank) override
Effectue un broadcast d'une zone mémoire.
IVariableSynchronizer * createSynchronizer(const ItemGroup &group) override
Retourne une interface pour synchroniser des variables sur le groupe group.
IIOMng * ioMng() const override
Gestionnaire des entrées/sorties.
Int32 masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
IParallelExchanger * createExchanger() override
Retourne une interface pour transférer des messages entre processeurs.
Request sendSerializer(ISerializer *values, Int32 rank, ByteArray &bytes) override
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
Superviseur du parallélisme en mode séquentiel.
void initialize() override
Initialise l'instance.
Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank) override
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
MP::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
void tryAbort() override
Tente de faire un abort.
void build() override
Construction de niveau build du service.
IApplication * m_application
Superviseur associé
IThreadMng * threadMng() const override
Gestionnaire de thread.
void _wait(Parallel::eWaitType wait_mode)
Effectue l'attente ou le test.
Message utilisant un SerializeBuffer.
Structure contenant les informations pour créer un service.
Exception lorsqu'un argument est invalide.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Communicateur pour l'échange de message.
Liste de requête de messages.
Interface d'une liste de messages de sérialisation.
Interface d'un message de sérialisation entre IMessagePassingMng.
Gestion des messages parallèles pour le type Type.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
bool isBlocking() const
Indique si le message est bloquant.
Classe de base d'une liste de requêtes.
Liste de messages de sérialisation.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
IStat * createDefaultStat()
Créé une instance par défaut.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ ST_Application
Le service s'utilise au niveau de l'application.
eReduceType
Types des réductions supportées.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Infos pour construire un SequentialParallelMng.