Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MpiParallelMng.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MpiParallelMng.h (C) 2000-2025 */
9/* */
10/* Implémentation des messages avec MPI. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLEL_MPI_MPIPARALLELMNG_H
13#define ARCANE_PARALLEL_MPI_MPIPARALLELMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/utils/Ref.h"
19
20#include "arcane/ParallelMngDispatcher.h"
21
22#include "arcane/parallel/mpi/ArcaneMpi.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34class MpiDatatypeList;
35class SerializeBuffer;
36class ArcaneMpiSerializeMessageList;
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
43struct ARCANE_MPI_EXPORT MpiParallelMngBuildInfo
44{
45 public:
46 MpiParallelMngBuildInfo(MPI_Comm comm, MPI_Comm machine_comm);
47 public:
48 Int32 commRank() const { return comm_rank; }
49 Int32 commSize() const { return comm_nb_rank; }
50 MPI_Comm mpiComm() const { return mpi_comm; }
51 MPI_Comm mpiMachineComm() const { return mpi_machine_comm; }
52 Ref<MP::Dispatchers> dispatchersRef() const { return m_dispatchers_ref; }
53 Ref<MP::MessagePassingMng> messagePassingMngRef() const { return m_message_passing_mng_ref; }
54 public:
55 bool is_parallel;
56 private:
57 Int32 comm_rank;
58 Int32 comm_nb_rank;
59 public:
60 Parallel::IStat* stat = nullptr;
61 ITraceMng* trace_mng = nullptr;
62 ITimerMng* timer_mng = nullptr;
63 IThreadMng* thread_mng = nullptr;
64 IParallelMng* world_parallel_mng = nullptr;
65 private:
66 MPI_Comm mpi_comm;
67 MPI_Comm mpi_machine_comm;
68 public:
69 bool is_mpi_comm_owned;
70 MpiLock* mpi_lock = nullptr;
71 private:
72 Ref<MP::Dispatchers> m_dispatchers_ref;
73 Ref<MP::MessagePassingMng> m_message_passing_mng_ref;
74};
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
81class ARCANE_MPI_EXPORT MpiParallelMng
82: public ParallelMngDispatcher
83{
84 public:
85 friend ArcaneMpiSerializeMessageList;
86 class RequestList;
87 class Impl;
88
89 public:
90
91 explicit MpiParallelMng(const MpiParallelMngBuildInfo& bi);
92 ~MpiParallelMng() override;
93
94 bool isParallel() const override { return m_is_parallel; }
95 Int32 commRank() const override { return m_comm_rank; }
96 Int32 commSize() const override { return m_comm_size; }
97 void* getMPICommunicator() override { return &m_communicator; }
98 bool isThreadImplementation() const override { return false; }
99 bool isHybridImplementation() const override { return false; }
100 ITraceMng* traceMng() const override { return m_trace; }
101 IThreadMng* threadMng() const override { return m_thread_mng; }
102 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
103 IIOMng* ioMng() const override { return m_io_mng; }
104
105 void initialize() override;
106 bool isMasterIO() const override { return commRank()==0; }
107 Integer masterIORank() const override { return 0; }
108
109 ITimerMng* timerMng() const override { return m_timer_mng; }
110
111 void sendSerializer(ISerializer* values,Int32 rank) override;
112 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override;
113 ISerializeMessage* createSendSerializer(Int32 rank) override;
114
115 void recvSerializer(ISerializer* values,Int32 rank) override;
116 ISerializeMessage* createReceiveSerializer(Int32 rank) override;
117
118 void freeRequests(ArrayView<Parallel::Request> requests) override;
119
120 void broadcastSerializer(ISerializer* values,Int32 rank) override;
121 MessageId probe(const PointToPointMessageInfo& message) override;
122 MessageSourceInfo legacyProbe(const PointToPointMessageInfo& message) override;
123 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override;
124 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override;
125
126 void printStats() override;
127 IParallelMng* sequentialParallelMng() override;
128 Ref<IParallelMng> sequentialParallelMngRef() override;
129 void barrier() override;
130 void waitAllRequests(ArrayView<Request> requests) override;
131 UniqueArray<Integer> waitSomeRequests(ArrayView<Request> requests) override;
132 UniqueArray<Integer> testSomeRequests(ArrayView<Request> requests) override;
133 ARCANE_DEPRECATED_260 Real reduceRank(eReduceType rt,Real v,Int32* rank)
134 {
135 Real rv = reduce(rt,v);
136 if (rank)
137 *rank = 0;
138 return rv;
139 }
140
141 IParallelNonBlockingCollective* nonBlockingCollective() const override { return m_non_blocking_collective; }
142
143 void build() override;
144
145 public:
146
147 MpiAdapter* adapter() { return m_adapter; }
148 Communicator communicator() const override { return Communicator(m_communicator); }
149 Communicator machineCommunicator() const override { return Communicator(m_machine_communicator); }
150
151 MpiLock* mpiLock() const { return m_mpi_lock; }
152
153 MpiDatatypeList* datatypes() { return m_datatype_list; }
154
155 MpiSerializeDispatcher* serializeDispatcher() const { return m_mpi_serialize_dispatcher; }
156
157 public:
158
159 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
160
161 protected:
162
163 ISerializeMessageList* _createSerializeMessageList() override;
164 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override;
165 bool _isAcceleratorAware() const override;
166 Ref<IParallelMng> _createSubParallelMngRef(Int32 color, Int32 key) override;
167
168 public:
169
170 IGetVariablesValuesParallelOperation* createGetVariablesValuesOperation() override;
171 ITransferValuesParallelOperation* createTransferValuesOperation() override;
172 IParallelExchanger* createExchanger() override;
173 IParallelTopology* createTopology() override;
174 IVariableSynchronizer* createSynchronizer(IItemFamily* family) override;
175 IVariableSynchronizer* createSynchronizer(const ItemGroup& group) override;
176 Parallel::IStat* stat() override { return m_stat; }
177 IParallelReplication* replication() const override;
178 void setReplication(IParallelReplication* v) override;
179 Ref<Parallel::IRequestList> createRequestListRef() override;
180 Ref<IParallelMngUtilsFactory> _internalUtilsFactory() const override;
181
182 private:
183
184 ITraceMng* m_trace = nullptr;
185 IThreadMng* m_thread_mng = nullptr;
186 IParallelMng* m_world_parallel_mng = nullptr;
187 IIOMng* m_io_mng = nullptr;
188 Ref<IParallelMng> m_sequential_parallel_mng;
189 ITimerMng* m_timer_mng = nullptr;
190 IParallelReplication* m_replication = nullptr;
191 bool m_is_timer_owned = false;
192 MpiDatatypeList* m_datatype_list = nullptr;
193 MpiAdapter* m_adapter = nullptr;
194 bool m_is_parallel = false;
195 Int32 m_comm_rank = A_NULL_RANK;
197 bool m_is_initialized = false;
198 Parallel::IStat* m_stat = nullptr;
199 MPI_Comm m_communicator = MPI_COMM_NULL;
200 MPI_Comm m_machine_communicator = MPI_COMM_NULL;
201 bool m_is_communicator_owned = false;
202 MpiLock* m_mpi_lock = nullptr;
203 IParallelNonBlockingCollective* m_non_blocking_collective = nullptr;
204 MpiSerializeDispatcher* m_mpi_serialize_dispatcher = nullptr;
205 Ref<IParallelMngUtilsFactory> m_utils_factory;
206 IParallelMngInternal* m_parallel_mng_internal = nullptr;
207
208 private:
209
210 void _checkFinishedSubRequests();
211 UniqueArray<Integer> _waitSomeRequests(ArrayView<Request> requests, bool is_non_blocking);
212 IParallelMng* _createSubParallelMng(MPI_Comm sub_communicator);
213};
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218} // End namespace Arcane
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223#endif
Vue modifiable d'un tableau d'un type T.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:36
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Échange d'informations entre processeurs.
Partie interne de IParallelMng.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface des opérations parallèles collectives non bloquantes.
Informations sur la réplication des sous-domaines en parallèle.
Informations sur la topologie d'allocation des coeurs de calcul.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:49
Interface du gestionnaire de traces.
Envoie de valeurs sur différents processeurs.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Communicateur pour l'échange de message.
Interface d'un message de sérialisation entre IMessagePassingMng.
Informations sur la source d'un message.
Verrou pour les appels MPI.
Definition MpiLock.h:37
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
Gère les MPI_Datatype associées aux types Arcane.
Spécialisation de MpiRequestList pour MpiParallelMng.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
bool m_is_initialized
true si déjà initialisé
Int32 commRank() const override
Rang de cette instance dans le communicateur.
Communicator machineCommunicator() const override
Communicateur MPI issus du communicateur communicator() réunissant tous les processus du noeud de cal...
IThreadMng * threadMng() const override
Gestionnaire de threads.
IIOMng * ioMng() const override
Gestionnaire des entrées/sorties.
bool isThreadImplementation() const override
Indique si l'implémentation utilise les threads.
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
ITimerMng * timerMng() const override
Gestionnaire de timers.
IParallelNonBlockingCollective * nonBlockingCollective() const override
Interface des opérations collectives non blocantes.
Int32 m_comm_size
Nombre de sous-domaines.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
ITraceMng * traceMng() const override
Gestionnaire de traces.
Int32 m_comm_rank
Numéro du processeur actuel.
Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
Integer masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
Parallel::IStat * stat() override
Gestionnaire des statistiques.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
bool isHybridImplementation() const override
Indique si l'implémentation utilise le mode hybride.
IParallelMngInternal * _internalApi() override
API interne à Arcane.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
Statistiques sur le parallélisme.
Référence à une instance.
Implémentation d'un tampon pour la sérialisation.
Vecteur 1D de données avec sémantique par valeur (style STL).
eReduceType
Types des réductions supportées.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:137
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:498
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un MpiParallelMng.