Arcane  v3.16.0.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#include <set>
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::MessagePassing::Mpi
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
46class ARCCORE_MESSAGEPASSINGMPI_EXPORT MpiAdapter
47: public TraceAccessor
48, public IRequestCreator
49{
50 public:
51 class RequestSet;
52 struct SubRequestInfo;
53 public:
54
55 MpiAdapter(ITraceMng* msg,IStat* stat,
56 MPI_Comm comm,MpiLock* mpi_lock,
57 IMpiProfiling* mpi_prof = nullptr);
58 MpiAdapter(const MpiAdapter& rhs) = delete;
59 MpiAdapter& operator=(const MpiAdapter& rhs) = delete;
60
61 protected:
62
63 ~MpiAdapter() override;
64
65 public:
66
68 void destroy();
69
70 public:
71
72 void broadcast(void* buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
73 void allGather(const void* send_buf,void* recv_buf,
74 Int64 nb_elem,MPI_Datatype datatype);
75 void gather(const void* send_buf,void* recv_buf,
76 Int64 nb_elem,Int32 root,MPI_Datatype datatype);
77 void allGatherVariable(const void* send_buf,void* recv_buf,const int* recv_counts,
78 const int* recv_indexes,Int64 nb_elem,MPI_Datatype datatype);
79 void gatherVariable(const void* send_buf,void* recv_buf,const int* recv_counts,
80 const int* recv_indexes,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
81 void scatterVariable(const void* send_buf,const int* send_count,const int* send_indexes,
82 void* recv_buf,Int64 nb_elem,Int32 root,MPI_Datatype datatype);
83 void allToAll(const void* send_buf,void* recv_buf,Int32 count,MPI_Datatype datatype);
84 void allToAllVariable(const void* send_buf,const int* send_counts,
85 const int* send_indexes,void* recv_buf,const int* recv_counts,
86 const int* recv_indexes,MPI_Datatype datatype);
87 void reduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op,Int32 root);
88 void allReduce(const void* send_buf,void* recv_buf,Int64 count,MPI_Datatype datatype,MPI_Op op);
89 void scan(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 MpiMessagePassingMng* 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 private:
211
212 IStat* m_stat = nullptr;
213 MpiLock* m_mpi_lock = nullptr;
214 IMpiProfiling* m_mpi_prof = nullptr;
215 ITimeMetricCollector* m_metric_collector = nullptr;
216 MPI_Comm m_communicator;
217 int m_comm_rank = A_PROC_NULL_RANK;
218 int m_comm_size = 0;
219 Int64 m_nb_all_reduce = 0;
220 Int64 m_nb_reduce = 0;
221 bool m_is_trace = false;
222 RequestSet* m_request_set = nullptr;
224 MPI_Request m_empty_request1;
225 MPI_Request m_empty_request2;
226 int m_recv_buffer_for_empty_request[1];
227 int m_send_buffer_for_empty_request2[1];
228 int m_recv_buffer_for_empty_request2[1];
229
230 // Si vrai, autorise d'utiliser le rang nul (A_NULL_RANK) pour spécifier MPI_ANY_SOURCE
231 // Cela est le défaut dans les versions de Arccore avant juillet 2024.
232 // A partir de 2025 il faudra l'interdire.
233 // La variable d'environnement ARCCORE_ALLOW_NULL_RANK_FOR_MPI_ANY_SOURCE permettra
234 // de temporairement garder un mode compatible.
235 bool m_is_allow_null_rank_for_any_source = true;
236
237 private:
238
239 void _trace(const char* function);
240 void _addRequest(MPI_Request request);
241 void _removeRequest(MPI_Request request);
242 void _checkFatalInRequest();
243 MessageId _probeMessage(MessageRank source,MessageTag tag,bool is_blocking);
244 MessageSourceInfo _legacyProbeMessage(MessageRank source,MessageTag tag,bool is_blocking);
245 bool _handleEndRequests(ArrayView<Request> requests,ArrayView<bool> done_indexes,
246 ArrayView<MPI_Status> status);
247 void _checkHasNoRequests();
248 MessageSourceInfo _buildSourceInfoFromStatus(const MPI_Status& status);
249};
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arccore::MessagePassing::Mpi
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259#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: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:216
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:224
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.