Arcane  v3.16.7.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MpiAdapter.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/* MpiAdapter.h (C) 2000-2025 */
9/* */
10/* Implémentation des messages avec MPI. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSINGMPI_MPIADAPTER_H
13#define ARCCORE_MESSAGEPASSINGMPI_MPIADAPTER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/trace/TraceAccessor.h"
18
19#include "arccore/message_passing_mpi/MessagePassingMpiGlobal.h"
20#include "arccore/message_passing_mpi/internal/MessagePassingMpiEnum.h"
21#include "arccore/message_passing/PointToPointMessageInfo.h"
22#include "arccore/message_passing/Request.h"
23#include "arccore/collections/CollectionsGlobal.h"
24
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane::MessagePassing::Mpi
31{
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
45class ARCCORE_MESSAGEPASSINGMPI_EXPORT MpiAdapter
46: public TraceAccessor
47, public IRequestCreator
48{
49 public:
50 class RequestSet;
51 struct SubRequestInfo;
52 public:
53
54 MpiAdapter(ITraceMng* msg,IStat* stat,
55 MPI_Comm comm,MpiLock* mpi_lock,
56 IMpiProfiling* mpi_prof = nullptr);
57 MpiAdapter(const MpiAdapter& rhs) = delete;
58 MpiAdapter& operator=(const MpiAdapter& rhs) = delete;
59
60 protected:
61
62 ~MpiAdapter() override;
63
64 public:
65
67 void destroy();
68
69 public:
70
71 void broadcast(void* buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
72 void allGather(const void* send_buf,void* recv_buf,
73 Int64 nb_elem,MPI_Datatype datatype);
74 void gather(const void* send_buf,void* recv_buf,
75 Int64 nb_elem,Int32 root,MPI_Datatype datatype);
76 void allGatherVariable(const void* send_buf,void* recv_buf,const int* recv_counts,
77 const int* recv_indexes,Int64 nb_elem,MPI_Datatype datatype);
78 void gatherVariable(const void* send_buf,void* recv_buf,const int* recv_counts,
79 const int* recv_indexes,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
80 void scatterVariable(const void* send_buf,const int* send_count,const int* send_indexes,
81 void* recv_buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
82 void allToAll(const void* send_buf,void* recv_buf,Int32 count,MPI_Datatype datatype);
83 void allToAllVariable(const void* send_buf,const int* send_counts,
84 const int* send_indexes,void* recv_buf,const int* recv_counts,
85 const int* recv_indexes,MPI_Datatype datatype);
86 void reduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op,Int32 root);
87 void allReduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op);
88 void scan(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op);
89 void directSendRecv(const void* send_buffer,Int64 send_buffer_size,
90 void* recv_buffer,Int64 recv_buffer_size,
91 Int32 proc,Int64 elem_size,MPI_Datatype data_type);
92
93 Request directSend(const void* send_buffer,Int64 send_buffer_size,
94 Int32 proc,Int64 elem_size,MPI_Datatype data_type,
95 int mpi_tag,bool is_blocked);
96
98 Request sendNonBlockingNoStat(const void* send_buffer,Int64 send_buffer_size,
99 Int32 proc,MPI_Datatype data_type,int mpi_tag);
100
101 Request directRecv(void* recv_buffer,Int64 recv_buffer_size,
102 Int32 source_rank,Int64 elem_size,MPI_Datatype data_type,
103 int mpi_tag,bool is_blocked);
104
106 Request receiveNonBlockingNoStat(void* recv_buffer,Int64 recv_buffer_size,
107 Int32 source_rank,MPI_Datatype data_type,int mpi_tag);
108
109 Request directSendPack(const void* send_buffer,Int64 send_buffer_size,
110 Int32 proc,int mpi_tag,bool is_blocked);
111
112 void probeRecvPack(UniqueArray<Byte>& recv_buffer,Int32 proc);
113
114 MessageId probeMessage(PointToPointMessageInfo message);
115
116 MessageSourceInfo legacyProbeMessage(PointToPointMessageInfo message);
117
118 Request directRecv(void* recv_buffer,Int64 recv_buffer_size,
119 MessageId message,Int64 elem_size,MPI_Datatype data_type,
120 bool is_blocked);
121
122 Request directRecvPack(void* recv_buffer,Int64 recv_buffer_size,
123 Int32 proc,int mpi_tag,bool is_blocking);
124
125 void waitAllRequests(ArrayView<Request> requests);
126
127
128 private:
129 bool _waitAllRequestsMPI(ArrayView<Request> requests,ArrayView<bool> indexes,
130 ArrayView<MPI_Status> mpi_status);
131 public:
132 void waitSomeRequests(ArrayView<Request> requests,
133 ArrayView<bool> indexes,
134 bool is_non_blocking);
135
136 void waitSomeRequestsMPI(ArrayView<Request> requests,
137 ArrayView<bool> indexes,
138 ArrayView<MPI_Status> mpi_status,bool is_non_blocking);
139 public:
141 int commRank() const { return m_comm_rank; }
142
144 int commSize() const { return m_comm_size; }
145
146 MpiMessagePassingMng* commSplit(bool keep);
147
148 void freeRequest(Request& request);
149 bool testRequest(Request& request);
150
151 void enableDebugRequest(bool enable_debug_request);
152
153 MpiLock* mpiLock() const { return m_mpi_lock; }
154
155 Request nonBlockingBroadcast(void* buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
156 Request nonBlockingAllGather(const void* send_buf,void* recv_buf,Int64 nb_elem,MPI_Datatype datatype);
157 Request nonBlockingGather(const void* send_buf,void* recv_buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
158
159 Request nonBlockingAllToAll(const void* send_buf,void* recv_buf,Int32 count,MPI_Datatype datatype);
160 Request nonBlockingAllReduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op);
161 Request nonBlockingAllToAllVariable(const void* send_buf,const int* send_counts,
162 const int* send_indexes,void* recv_buf,const int* recv_counts,
163 const int* recv_indexes,MPI_Datatype datatype);
164
165 Request nonBlockingBarrier();
166 void barrier();
167
168 int toMPISize(Int64 count);
169
171 Request buildRequest(int ret,MPI_Request request);
172
173 public:
174
176 void setRequestErrorAreFatal(bool v);
177 bool isRequestErrorAreFatal() const;
178
180 void setPrintRequestError(bool v);
181 bool isPrintRequestError() const;
182
184 void setTraceMPIMessage(bool v) { m_is_trace = v; }
185 bool isTraceMPIMessage() const { return m_is_trace; }
186
192 void setCheckRequest(bool v);
193 bool isCheckRequest() const;
194
195 public:
196
197 void setMpiProfiling(IMpiProfiling* mpi_profiling);
198 void setProfiler(IProfiler* profiler);
199 IMpiProfiling* getMpiProfiling() const;
200 IProfiler* profiler() const;
201
202 public:
203
204 ITimeMetricCollector* timeMetricCollector() const { return m_metric_collector; }
205 void setTimeMetricCollector(ITimeMetricCollector* v) { m_metric_collector = v; }
206
207 bool isAllowNullRankForAnySource() const { return m_is_allow_null_rank_for_any_source; }
208
209 public:
210
211 // void* createAllInOneMachineMemoryWindowBase(Integer sizeof_local) const;
212 // void freeAllInOneMachineMemoryWindowBase(void* aio_node_window) const;
213 // Ref<MpiAllInOneMachineMemoryWindowBase> readAllInOneMachineMemoryWindowBase(void* aio_node_window) const
214 // {
215 // return makeRef(new MpiAllInOneMachineMemoryWindowBase(aio_node_window, sizeof(MPI_Win), m_machine_communicator, m_machine_comm_rank));
216 // }
217
218 MpiMachineMemoryWindowBaseInternalCreator* windowCreator();
219
220 private:
221
222 IStat* m_stat = nullptr;
223 MpiLock* m_mpi_lock = nullptr;
224 IMpiProfiling* m_mpi_prof = nullptr;
225 ITimeMetricCollector* m_metric_collector = nullptr;
226 MPI_Comm m_communicator;
227 int m_comm_rank = A_PROC_NULL_RANK;
228 int m_comm_size = 0;
230 int m_machine_comm_rank = A_PROC_NULL_RANK;
231 int m_machine_comm_size = 0;
232 Int64 m_nb_all_reduce = 0;
233 Int64 m_nb_reduce = 0;
234 bool m_is_trace = false;
235 RequestSet* m_request_set = nullptr;
237 MPI_Request m_empty_request1;
238 MPI_Request m_empty_request2;
239 int m_recv_buffer_for_empty_request[1];
240 int m_send_buffer_for_empty_request2[1];
241 int m_recv_buffer_for_empty_request2[1];
242
243 // Si vrai, autorise d'utiliser le rang nul (A_NULL_RANK) pour spécifier MPI_ANY_SOURCE
244 // Cela est le défaut dans les versions de Arccore avant juillet 2024.
245 // A partir de 2025 il faudra l'interdire.
246 // La variable d'environnement ARCCORE_ALLOW_NULL_RANK_FOR_MPI_ANY_SOURCE permettra
247 // de temporairement garder un mode compatible.
248 bool m_is_allow_null_rank_for_any_source = true;
249
251
252 private:
253
254 void _trace(const char* function);
255 void _addRequest(MPI_Request request);
256 void _removeRequest(MPI_Request request);
257 void _checkFatalInRequest();
258 MessageId _probeMessage(MessageRank source,MessageTag tag,bool is_blocking);
259 MessageSourceInfo _legacyProbeMessage(MessageRank source,MessageTag tag,bool is_blocking);
260 bool _handleEndRequests(ArrayView<Request> requests,ArrayView<bool> done_indexes,
261 ArrayView<MPI_Status> status);
262 void _checkHasNoRequests();
263 MessageSourceInfo _buildSourceInfoFromStatus(const MPI_Status& status);
264};
265
266/*---------------------------------------------------------------------------*/
267/*---------------------------------------------------------------------------*/
268
269} // End namespace Arccore::MessagePassing::Mpi
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
274#endif
Déclarations des types de la composante 'base' de Arccore.
Vue modifiable d'un tableau d'un type T.
Interface gérant les statistiques sur l'exécution.
Interface du gestionnaire de traces.
Interface d'un profiler pour les échanges de messages.
Definition IProfiler.h:31
Interface d'un créateur de requête.
Definition Request.h:52
Informations sur la source d'un message.
Interface d'abstraction pour les operations MPI. Sert principalement a utiliser un decorateur pour le...
MpiAdapter(ITraceMng *msg, IStat *stat, MPI_Comm comm, MpiLock *mpi_lock, IMpiProfiling *mpi_prof=nullptr)
void setTraceMPIMessage(bool v)
Indique si on affiche des messages pour chaque appel MPI.
Definition MpiAdapter.h:184
int commRank() const
Rang de cette instance dans le communicateur.
Definition MpiAdapter.h:141
int commSize() const
Nombre de rangs dans le communicateur.
Definition MpiAdapter.h:144
void destroy()
Détruit l'instance. Elle ne doit plus être utilisée par la suite.
MPI_Comm m_communicator
Communicateur MPI.
Definition MpiAdapter.h:226
Request sendNonBlockingNoStat(const void *send_buffer, Int64 send_buffer_size, Int32 proc, MPI_Datatype data_type, int mpi_tag)
Version non bloquante de send sans statistique temporelle.
MPI_Comm m_machine_communicator
Communicateur MPI sur le noeud de calcul.
Definition MpiAdapter.h:229
MPI_Request m_empty_request1
Requêtes vides. Voir MpiAdapter.cc pour plus d'infos.
Definition MpiAdapter.h:237
void _addRequest(MPI_Request request)
Request receiveNonBlockingNoStat(void *recv_buffer, Int64 recv_buffer_size, Int32 source_rank, MPI_Datatype data_type, int mpi_tag)
Version non bloquante de receive sans statistiques temporelles.
void _removeRequest(MPI_Request request)
Verrou pour les appels MPI.
Definition MpiLock.h:37
Implémentation MPI du gestionnaire des échanges de messages.
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
Vecteur 1D de données avec sémantique par valeur (style STL).
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.