Arcane  v3.14.10.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-2024 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-2024 */
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{
29using Communicator = MP::Communicator;
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34class MpiDatatypeList;
35class SerializeBuffer;
36class ArcaneMpiSerializeMessageList;
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
43struct ARCANE_MPI_EXPORT MpiParallelMngBuildInfo
44{
45 public:
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 Ref<MP::Dispatchers> dispatchersRef() const { return m_dispatchers_ref; }
52 Ref<MP::MessagePassingMng> messagePassingMngRef() const { return m_message_passing_mng_ref; }
53 public:
54 bool is_parallel;
55 private:
56 Int32 comm_rank;
57 Int32 comm_nb_rank;
58 public:
59 Parallel::IStat* stat = nullptr;
60 ITraceMng* trace_mng = nullptr;
61 ITimerMng* timer_mng = nullptr;
62 IThreadMng* thread_mng = nullptr;
63 IParallelMng* world_parallel_mng = nullptr;
64 private:
65 MPI_Comm mpi_comm;
66 public:
67 bool is_mpi_comm_owned;
68 MpiLock* mpi_lock = nullptr;
69 private:
70 Ref<MP::Dispatchers> m_dispatchers_ref;
71 Ref<MP::MessagePassingMng> m_message_passing_mng_ref;
72};
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
79class ARCANE_MPI_EXPORT MpiParallelMng
81{
82 public:
83 friend ArcaneMpiSerializeMessageList;
84 class RequestList;
85
86 public:
87
89 ~MpiParallelMng() override;
90
91 bool isParallel() const override { return m_is_parallel; }
92 Int32 commRank() const override { return m_comm_rank; }
93 Int32 commSize() const override { return m_comm_size; }
94 void* getMPICommunicator() override { return &m_communicator; }
95 bool isThreadImplementation() const override { return false; }
96 bool isHybridImplementation() const override { return false; }
97 ITraceMng* traceMng() const override { return m_trace; }
98 IThreadMng* threadMng() const override { return m_thread_mng; }
99 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
100 IIOMng* ioMng() const override { return m_io_mng; }
101
102 void initialize() override;
103 bool isMasterIO() const override { return commRank()==0; }
104 Integer masterIORank() const override { return 0; }
105
106 ITimerMng* timerMng() const override { return m_timer_mng; }
107
108 void sendSerializer(ISerializer* values,Int32 rank) override;
109 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override;
110 ISerializeMessage* createSendSerializer(Int32 rank) override;
111
112 void recvSerializer(ISerializer* values,Int32 rank) override;
113 ISerializeMessage* createReceiveSerializer(Int32 rank) override;
114
115 void freeRequests(ArrayView<Parallel::Request> requests) override;
116
117 void broadcastSerializer(ISerializer* values,Int32 rank) override;
118 MessageId probe(const PointToPointMessageInfo& message) override;
119 MessageSourceInfo legacyProbe(const PointToPointMessageInfo& message) override;
120 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override;
121 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override;
122
123 void printStats() override;
124 IParallelMng* sequentialParallelMng() override;
125 Ref<IParallelMng> sequentialParallelMngRef() override;
126 void barrier() override;
127 void waitAllRequests(ArrayView<Request> requests) override;
128 UniqueArray<Integer> waitSomeRequests(ArrayView<Request> requests) override;
129 UniqueArray<Integer> testSomeRequests(ArrayView<Request> requests) override;
130 ARCANE_DEPRECATED_260 Real reduceRank(eReduceType rt,Real v,Int32* rank)
131 {
132 Real rv = reduce(rt,v);
133 if (rank)
134 *rank = 0;
135 return rv;
136 }
137
138 IParallelNonBlockingCollective* nonBlockingCollective() const override { return m_non_blocking_collective; }
139
140 void build() override;
141
142 public:
143
144 MpiAdapter* adapter() { return m_adapter; }
145 Communicator communicator() const override { return Communicator(m_communicator); }
146
147 MpiLock* mpiLock() const { return m_mpi_lock; }
148
149 MpiDatatypeList* datatypes() { return m_datatype_list; }
150
151 MpiSerializeDispatcher* serializeDispatcher() const { return m_mpi_serialize_dispatcher; }
152
153 protected:
154
155 ISerializeMessageList* _createSerializeMessageList() override;
156 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override;
157 bool _isAcceleratorAware() const override;
158 Ref<IParallelMng> _createSubParallelMngRef(Int32 color, Int32 key) override;
159
160 public:
161
162 IGetVariablesValuesParallelOperation* createGetVariablesValuesOperation() override;
163 ITransferValuesParallelOperation* createTransferValuesOperation() override;
164 IParallelExchanger* createExchanger() override;
165 IParallelTopology* createTopology() override;
166 IVariableSynchronizer* createSynchronizer(IItemFamily* family) override;
167 IVariableSynchronizer* createSynchronizer(const ItemGroup& group) override;
168 Parallel::IStat* stat() override { return m_stat; }
169 IParallelReplication* replication() const override;
170 void setReplication(IParallelReplication* v) override;
171 Ref<Parallel::IRequestList> createRequestListRef() override;
172 Ref<IParallelMngUtilsFactory> _internalUtilsFactory() const override;
173
174 private:
175
176 ITraceMng* m_trace = nullptr;
177 IThreadMng* m_thread_mng = nullptr;
178 IParallelMng* m_world_parallel_mng = nullptr;
179 IIOMng* m_io_mng = nullptr;
180 Ref<IParallelMng> m_sequential_parallel_mng;
181 ITimerMng* m_timer_mng = nullptr;
182 IParallelReplication* m_replication = nullptr;
183 bool m_is_timer_owned = false;
184 MpiDatatypeList* m_datatype_list = nullptr;
185 MpiAdapter* m_adapter = nullptr;
186 bool m_is_parallel = false;
187 Int32 m_comm_rank = A_NULL_RANK;
188 Int32 m_comm_size = 0;
189 bool m_is_initialized = false;
190 Parallel::IStat* m_stat = nullptr;
191 MPI_Comm m_communicator = MPI_COMM_NULL;
192 bool m_is_communicator_owned = false;
193 MpiLock* m_mpi_lock = nullptr;
194 IParallelNonBlockingCollective* m_non_blocking_collective = nullptr;
195 MpiSerializeDispatcher* m_mpi_serialize_dispatcher = nullptr;
196 Ref<IParallelMngUtilsFactory> m_utils_factory;
197 bool m_use_serialize_list_v2 = true;
198
199 private:
200
201 void _checkFinishedSubRequests();
202 UniqueArray<Integer> _waitSomeRequests(ArrayView<Request> requests, bool is_non_blocking);
203 IParallelMng* _createSubParallelMng(MPI_Comm sub_communicator);
204};
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209} // End namespace Arcane
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214#endif
Tableau d'items de types quelconques.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
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.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:53
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Gère les MPI_Datatype associées aux types Arcane.
Spécialisation de MpiRequestList pour MpiParallelMng.
Gestionnaire du parallélisme utilisant MPI.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
Int32 commRank() const override
Rang de cette instance dans le communicateur.
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.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
ITraceMng * traceMng() const override
Gestionnaire de traces.
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.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
Statistiques sur le parallélisme.
Interface du gestionnaire de traces.
Communicateur pour l'échange de message.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eReduceType
Types des réductions supportées.
Infos pour construire un MpiParallelMng.