Arcane  4.2.3.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-2026 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-2026 */
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 scanExclusive(const void* send_buf, void* recv_buf, Int64 count, MPI_Datatype datatype, MPI_Op op);
90 void directSendRecv(const void* send_buffer, Int64 send_buffer_size,
91 void* recv_buffer, Int64 recv_buffer_size,
92 Int32 proc, Int64 elem_size, MPI_Datatype data_type);
93
94 Request directSend(const void* send_buffer, Int64 send_buffer_size,
95 Int32 proc, Int64 elem_size, MPI_Datatype data_type,
96 int mpi_tag, bool is_blocked);
97
99 Request sendNonBlockingNoStat(const void* send_buffer, Int64 send_buffer_size,
100 Int32 proc, MPI_Datatype data_type, int mpi_tag);
101
102 Request directRecv(void* recv_buffer, Int64 recv_buffer_size,
103 Int32 source_rank, Int64 elem_size, MPI_Datatype data_type,
104 int mpi_tag, bool is_blocked);
105
107 Request receiveNonBlockingNoStat(void* recv_buffer, Int64 recv_buffer_size,
108 Int32 source_rank, MPI_Datatype data_type, int mpi_tag);
109
110 Request directSendPack(const void* send_buffer, Int64 send_buffer_size,
111 Int32 proc, int mpi_tag, bool is_blocked);
112
113 void probeRecvPack(UniqueArray<Byte>& recv_buffer, Int32 proc);
114
115 MessageId probeMessage(PointToPointMessageInfo message);
116
117 MessageSourceInfo legacyProbeMessage(PointToPointMessageInfo message);
118
119 Request directRecv(void* recv_buffer,Int64 recv_buffer_size,
120 MessageId message,Int64 elem_size,MPI_Datatype data_type,
121 bool is_blocked);
122
123 Request directRecvPack(void* recv_buffer,Int64 recv_buffer_size,
124 Int32 proc,int mpi_tag,bool is_blocking);
125
126 void waitAllRequests(ArrayView<Request> requests);
127
128
129 private:
130 bool _waitAllRequestsMPI(ArrayView<Request> requests,ArrayView<bool> indexes,
131 ArrayView<MPI_Status> mpi_status);
132 public:
133 void waitSomeRequests(ArrayView<Request> requests,
134 ArrayView<bool> indexes,
135 bool is_non_blocking);
136
137 void waitSomeRequestsMPI(ArrayView<Request> requests,
138 ArrayView<bool> indexes,
139 ArrayView<MPI_Status> mpi_status,bool is_non_blocking);
140 public:
142 int commRank() const { return m_comm_rank; }
143
145 int commSize() const { return m_comm_size; }
146
147 IMessagePassingMng* commSplit(bool keep);
148
149 void freeRequest(Request& request);
150 bool testRequest(Request& request);
151
152 void enableDebugRequest(bool enable_debug_request);
153
154 MpiLock* mpiLock() const { return m_mpi_lock; }
155
156 Request nonBlockingBroadcast(void* buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
157 Request nonBlockingAllGather(const void* send_buf,void* recv_buf,Int64 nb_elem,MPI_Datatype datatype);
158 Request nonBlockingGather(const void* send_buf,void* recv_buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
159
160 Request nonBlockingAllToAll(const void* send_buf,void* recv_buf,Int32 count,MPI_Datatype datatype);
161 Request nonBlockingAllReduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op);
162 Request nonBlockingAllToAllVariable(const void* send_buf,const int* send_counts,
163 const int* send_indexes,void* recv_buf,const int* recv_counts,
164 const int* recv_indexes,MPI_Datatype datatype);
165
166 Request nonBlockingBarrier();
167 void barrier();
168
169 int toMPISize(Int64 count);
170
172 Request buildRequest(int ret,MPI_Request request);
173
174 public:
175
177 void setRequestErrorAreFatal(bool v);
178 bool isRequestErrorAreFatal() const;
179
181 void setPrintRequestError(bool v);
182 bool isPrintRequestError() const;
183
185 void setTraceMPIMessage(bool v) { m_is_trace = v; }
186 bool isTraceMPIMessage() const { return m_is_trace; }
187
193 void setCheckRequest(bool v);
194 bool isCheckRequest() const;
195
196 public:
197
198 void setMpiProfiling(IMpiProfiling* mpi_profiling);
199 void setProfiler(IProfiler* profiler);
200 IMpiProfiling* getMpiProfiling() const;
201 IProfiler* profiler() const;
202
203 public:
204
205 ITimeMetricCollector* timeMetricCollector() const { return m_metric_collector; }
206 void setTimeMetricCollector(ITimeMetricCollector* v) { m_metric_collector = v; }
207
208 bool isAllowNullRankForAnySource() const { return m_is_allow_null_rank_for_any_source; }
209
210 public:
211
212 void initializeWindowCreator(MPI_Comm comm_machine);
213 MpiMachineShMemWinBaseInternalCreator* windowCreator() const;
214
215 private:
216
217 IStat* m_stat = nullptr;
218 MpiLock* m_mpi_lock = nullptr;
219 IMpiProfiling* m_mpi_prof = nullptr;
220 ITimeMetricCollector* m_metric_collector = nullptr;
221 MPI_Comm m_communicator;
222 int m_comm_rank = A_PROC_NULL_RANK;
223 int m_comm_size = 0;
224 Int64 m_nb_all_reduce = 0;
225 Int64 m_nb_reduce = 0;
226 bool m_is_trace = false;
227 RequestSet* m_request_set = nullptr;
229 MPI_Request m_empty_request1;
230 MPI_Request m_empty_request2;
231 int m_recv_buffer_for_empty_request[1];
232 int m_send_buffer_for_empty_request2[1];
233 int m_recv_buffer_for_empty_request2[1];
234
235 // Si vrai, autorise d'utiliser le rang nul (A_NULL_RANK) pour spécifier MPI_ANY_SOURCE
236 // Cela est le défaut dans les versions de Arccore avant juillet 2024.
237 // A partir de 2025 il faudra l'interdire.
238 // La variable d'environnement ARCCORE_ALLOW_NULL_RANK_FOR_MPI_ANY_SOURCE permettra
239 // de temporairement garder un mode compatible.
240 bool m_is_allow_null_rank_for_any_source = true;
241
243
244 private:
245
246 void _trace(const char* function);
247 void _addRequest(MPI_Request request);
248 void _removeRequest(MPI_Request request);
249 void _checkFatalInRequest();
250 MessageId _probeMessage(MessageRank source,MessageTag tag,bool is_blocking);
251 MessageSourceInfo _legacyProbeMessage(MessageRank source,MessageTag tag,bool is_blocking);
252 bool _handleEndRequests(ArrayView<Request> requests,ArrayView<bool> done_indexes,
253 ArrayView<MPI_Status> status);
254 void _checkHasNoRequests();
255 MessageSourceInfo _buildSourceInfoFromStatus(const MPI_Status& status);
256};
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
261} // End namespace Arccore::MessagePassing::Mpi
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
266#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 du gestionnaire des échanges de messages.
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:185
int commRank() const
Rang de cette instance dans le communicateur.
Definition MpiAdapter.h:142
int commSize() const
Nombre de rangs dans le communicateur.
Definition MpiAdapter.h:145
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:221
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_Request m_empty_request1
Requêtes vides. Voir MpiAdapter.cc pour plus d'infos.
Definition MpiAdapter.h:229
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
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
Référence à une instance.
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.