Arcane  4.2.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Messages.h
Aller à la documentation de ce fichier.
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/* Messages.h (C) 2000-2026 */
9/* */
10/* Interface du gestionnaire des échanges de messages. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_MESSAGES_H
13#define ARCCORE_MESSAGEPASSING_MESSAGES_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/message_passing/IMessagePassingMng.h"
18#include "arccore/message_passing/IDispatchers.h"
19#include "arccore/message_passing/ITypeDispatcher.h"
20#include "arccore/message_passing/Request.h"
21
23#include "arccore/base/Span.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34#define ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(type) \
35 /*! AllGather */ \
36 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
37 mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf); \
38 /*! gather */ \
39 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
40 mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank); \
41 /*! AllGather non bloquant */ \
42 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
43 mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf); \
44 /*! Gather non bloquant */ \
45 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
46 mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank); \
47 /*! AllGatherVariable */ \
48 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
49 mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf); \
50 /*! GatherVariable */ \
51 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
52 mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank); \
53 /*! Generic Gather */ \
54 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
55 mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info); \
56 /*! ScatterVariable */ \
57 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
58 mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root); \
59 /*! AllReduce */ \
60 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT type \
61 mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v); \
62 /*! AllReduce en place */ \
63 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
64 mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf); \
65 /*! AllReduce */ \
66 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
67 mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> receive_buf); \
68 /*! Scan exclusif */ \
69 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
70 mpScanExclusive(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> receive_buf); \
71 /*! AllReduce non bloquant */ \
72 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
73 mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf); \
74 /*! Broadcast */ \
75 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
76 mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank); \
77 /*! Broadcast non bloquant */ \
78 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
79 mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank); \
80 /*! Send */ \
81 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
82 mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank); \
83 /*! Receive */ \
84 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
85 mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank); \
86 /*! Send */ \
87 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
88 mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked); \
89 /*! Send */ \
90 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
91 mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message); \
92 /*! Receive */ \
93 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
94 mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked); \
95 /*! Receive */ \
96 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
97 mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message); \
98 /*! AllToAll */ \
99 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
100 mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count); \
101 /*! AllToAll non bloquant */ \
102 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
103 mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count); \
104 /*! AllToAllVariable */ \
105 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT void \
106 mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
107 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
108 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index); \
109 /*! AllToAllVariable non bloquant */ \
110 extern "C++" ARCCORE_MESSAGEPASSING_EXPORT Request \
111 mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
112 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
113 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index);
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117/*!
118 * \brief Créé une liste de requêtes.
119 *
120 * \sa IRequestList
121 */
122ARCCORE_MESSAGEPASSING_EXPORT Ref<IRequestList>
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127/*!
128 * \brief Bloque tant que les requêtes de \a requests ne sont pas terminées.
129 */
130ARCCORE_MESSAGEPASSING_EXPORT void
131mpWaitAll(IMessagePassingMng* pm, ArrayView<Request> requests);
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135/*!
136 * \brief Bloque jusqu'à ce que la requête \a request soit terminée.
137 */
138ARCCORE_MESSAGEPASSING_EXPORT void
139mpWait(IMessagePassingMng* pm, Request request);
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143/*!
144 * \brief Bloque jusqu'à ce qu'au moins une des requêtes de \a request soit terminée.
145 *
146 * En retour, le tableaux \a indexes contient la valeur \a true pour indiquer
147 * qu'une requête est terminée.
148 */
149ARCCORE_MESSAGEPASSING_EXPORT void
150mpWaitSome(IMessagePassingMng* pm, ArrayView<Request> requests, ArrayView<bool> indexes);
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154/*!
155 * \brief Teste si des requêtes de \a request sont terminées.
156 *
157 * En retour, le tableaux \a indexes contient la valeur \a true pour indiquer
158 * qu'une requête est terminée.
159 */
160ARCCORE_MESSAGEPASSING_EXPORT void
161mpTestSome(IMessagePassingMng* pm, ArrayView<Request> requests, ArrayView<bool> indexes);
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165/*!
166 * \brief Fonction générale d'attente de terminaison de requête.
167 *
168 * En fonction de la valeur de \a wait_type, appelle mpWait(), mpWaitSome(), ou
169 * mpTestSome().
170 */
171ARCCORE_MESSAGEPASSING_EXPORT void
172mpWait(IMessagePassingMng* pm, ArrayView<Request> requests,
173 ArrayView<bool> indexes, eWaitType wait_type);
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177/*!
178 * \brief Teste si un message est disponible.
179 *
180 * Cette fonction permet de savoir si un message issu du couple (rang,tag)
181 * est disponible. \a message doit avoir été initialisé avec un couple (rang,tag)
182 * (message.isRankTag() doit être vrai).
183 *
184 * Retourne une instance de \a MessageId.
185 *
186 * En mode non bloquant, si aucun message n'est disponible, alors
187 * MessageId::isValid() vaut \a false pour l'instance retournée.
188 *
189 * La sémantique est identique à celle de MPI_Mprobe. Le message retourné est enlevé
190 * de la liste des messages et donc un appel ultérieur à cette méthode avec les mêmes
191 * paramètres retournera un autre message ou un message nul. Si on souhaite un
192 * comportement identique à MPI_Iprobe()/MPI_Probe() alors il faut utiliser mpLegacyProbe().
193 */
194ARCCORE_MESSAGEPASSING_EXPORT MessageId
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199/*!
200 * \brief Teste si un message est disponible.
201 *
202 * Cette fonction permet de savoir si un message issu du couple (rang,tag)
203 * est disponible. \a message doit avoir été initialisé avec un couple (rang,tag)
204 * (message.isRankTag() doit être vrai).
205 *
206 * Retourne une instance de \a MessageSourceInfo. En mode non bloquant, si aucun message
207 * n'est disponible, alors MessageSourceInfo::isValid() vaut \a false pour
208 * l'instance retournée.
209 *
210 * La sémantique est identique à celle de MPI_Probe. Il est donc possible
211 * si on appelle plusieurs fois cette fonction de retourner le même message.
212 * Il n'est pas garanti non plus si on fait un mpReceive() avec l'instance retournée
213 * d'avoir le même message. Pour toutes ces raisons il est préférable d'utiliser
214 * la fonction mpProbe().
215 */
216ARCCORE_MESSAGEPASSING_EXPORT MessageSourceInfo
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221/*!
222 * \brief Créé un sous-communicateur.
223 *
224 * \a keep est vrai si ce rang est présent dans le nouveau communicateur.
225 *
226 * La valeur retournée est nulle si \a keep est faux. Si elle n'est pas nulle,
227 * l'instance retournée doit être détruite par l'appel à l'opérateur
228 * operator delete().
229 *
230 * \deprecated Utiliser mpSplitCommunicator() à la place.
231 */
232ARCCORE_DEPRECATED_REASON("Y2026: Use mpSplitCommunicator() instead.")
233ARCCORE_MESSAGEPASSING_EXPORT IMessagePassingMng*
234mpSplit(IMessagePassingMng* pm, bool keep);
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238/*!
239 * \brief Créé un sous-communicateur.
240 *
241 * \a keep est vrai si ce rang est présent dans le nouveau communicateur.
242 *
243 * La valeur retournée est nulle si \a keep est faux.
244 */
245ARCCORE_MESSAGEPASSING_EXPORT Ref<IMessagePassingMng>
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251/*!
252 * \brief Effectue une barrière
253 *
254 * Bloque tant que tous les rangs n'ont pas atteint cette appel.
255 */
256ARCCORE_MESSAGEPASSING_EXPORT void
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261/*!
262 * \brief Effectue une barrière non bloquante.
263 */
264ARCCORE_MESSAGEPASSING_EXPORT Request
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269/*!
270 * \brief Créé une liste de messages de sérialisation.
271 *
272 * \sa ISerializeMessageList
273 */
274ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessageList>
276
277//! Message d'envoi utilisant un ISerializer.
278ARCCORE_MESSAGEPASSING_EXPORT Request
279mpSend(IMessagePassingMng* pm, const ISerializer* values, const PointToPointMessageInfo& message);
280
281//! Message de réception utilisant un ISerializer.
282ARCCORE_MESSAGEPASSING_EXPORT Request
283mpReceive(IMessagePassingMng* pm, ISerializer* values, const PointToPointMessageInfo& message);
284
285//! Message allGather() pour une sérialisation
286ARCCORE_MESSAGEPASSING_EXPORT void
287mpAllGather(IMessagePassingMng* pm, const ISerializer* send_serializer, ISerializer* recv_serializer);
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291/*!
292 * \brief Créé un message de sérialisation.
293 *
294 * \a type est le type de message et \a target la cible.
295 * Si le message est un envoi, \a target est la destination du message.
296 * Si le message est une réception, \a target est la source du message.
297 *
298 * \sa ISerializeMessageList
299 */
300ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
302
303/*!
304 * \brief Créé un message de sérialisation correspondant à \a id.
305 *
306 * \sa ISerializeMessageList
307 */
308ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
310
311/*!
312 * \brief Créé un message de sérialisation en envoi.
313 *
314 * Cette méthode est équivalente à
315 * mpCreateSerializeMessage(pm, destination, ePointToPointMessageType::MsgSend).
316 *
317 * \sa ISerializeMessageList
318 */
319ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
321
322/*!
323 * \brief Créé un message de sérialisation en envoi.
324 *
325 * Cette méthode est équivalente à
326 * mpCreateSerializeMessage(pm, source, ePointToPointMessageType::MsgReceive).
327 *
328 * \sa ISerializeMessageList
329 */
330ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
335
336ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(char)
337ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(signed char)
338ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(unsigned char)
339
340ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(short)
341ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(unsigned short)
342ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(int)
343ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(unsigned int)
344ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(long)
345ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(unsigned long)
346ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(long long)
347ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(unsigned long long)
348
349ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(float)
350ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(double)
351ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(long double)
352
353ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(BFloat16)
354ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE(Float16)
355
356#undef ARCCORE_GENERATE_MESSAGEPASSING_PROTOTYPE
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
361} // namespace Arcane::MessagePassing
362
363/*---------------------------------------------------------------------------*/
364/*---------------------------------------------------------------------------*/
365
367{
399}
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
404#endif
Types et fonctions associés aux classes SpanImpl, SmallSpan et Span.
Type flottant demi-précision.
Interface du gestionnaire des échanges de messages.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
C void mpGather(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf, Int32 rank)
Ref< ISerializeMessage > mpCreateSerializeMessage(IMessagePassingMng *pm, MessageRank target, ePointToPointMessageType type)
Créé un message de sérialisation.
Definition Messages.cc:334
C void mpScatterVariable(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf, Int32 root)
C Request mpNonBlockingAllGather(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf)
C void mpBroadcast(IMessagePassingMng *pm, Span< char > send_buf, Int32 rank)
void mpTestSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Teste si des requêtes de request sont terminées.
Definition Messages.cc:189
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Créé une liste de messages de sérialisation.
Definition Messages.cc:278
Ref< ISerializeMessage > mpCreateSendSerializeMessage(IMessagePassingMng *pm, MessageRank destination)
Créé un message de sérialisation en envoi.
Definition Messages.cc:346
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Definition Messages.cc:229
Ref< IMessagePassingMng > mpSplitCommunicator(IMessagePassingMng *pm, bool keep)
Créé un sous-communicateur.
Definition Messages.cc:249
Ref< ISerializeMessage > mpCreateReceiveSerializeMessage(IMessagePassingMng *pm, MessageRank source)
Créé un message de sérialisation en envoi.
Definition Messages.cc:352
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Definition Messages.cc:219
C void mpAllToAll(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf, Int32 count)
C Request mpNonBlockingAllToAll(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf, Int32 count)
C void mpAllToAllVariable(IMessagePassingMng *pm, Span< const char > send_buf, ConstArrayView< Int32 > send_count, ConstArrayView< Int32 > send_index, Span< char > recv_buf, ConstArrayView< Int32 > recv_count, ConstArrayView< Int32 > recv_index)
C void mpGatherVariable(IMessagePassingMng *pm, Span< const char > send_buf, Array< char > &recv_buf, Int32 rank)
C char mpAllReduce(IMessagePassingMng *pm, eReduceType rt, char v)
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Créé une liste de requêtes.
Definition Messages.cc:154
C void mpAllGatherVariable(IMessagePassingMng *pm, Span< const char > send_buf, Array< char > &recv_buf)
void mpBarrier(IMessagePassingMng *pm)
Effectue une barrière.
Definition Messages.cc:258
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Effectue une barrière non bloquante.
Definition Messages.cc:268
void mpWait(IMessagePassingMng *pm, Request request)
Bloque jusqu'à ce que la requête request soit terminée.
Definition Messages.cc:172
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
Message allGather() pour une sérialisation.
Definition Messages.cc:318
void mpWaitAll(IMessagePassingMng *pm, ArrayView< Request > requests)
Bloque tant que les requêtes de requests ne sont pas terminées.
Definition Messages.cc:163
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Créé un sous-communicateur.
Definition Messages.cc:239
C Request mpNonBlockingAllToAllVariable(IMessagePassingMng *pm, Span< const char > send_buf, ConstArrayView< Int32 > send_count, ConstArrayView< Int32 > send_index, Span< char > recv_buf, ConstArrayView< Int32 > recv_count, ConstArrayView< Int32 > recv_index)
ePointToPointMessageType
Type de message point à point.
C Request mpNonBlockingGather(IMessagePassingMng *pm, Span< const char > send_buf, Span< char > recv_buf, Int32 rank)
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
Definition Messages.cc:299
void mpWaitSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Bloque jusqu'à ce qu'au moins une des requêtes de request soit terminée.
Definition Messages.cc:180
C Request mpNonBlockingBroadcast(IMessagePassingMng *pm, Span< char > send_buf, Int32 rank)
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
Definition Messages.cc:288
C Request mpNonBlockingAllReduce(IMessagePassingMng *pm, eReduceType rt, Span< const char > send_buf, Span< char > recv_buf)
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...