16#include "arccore/base/NotSupportedException.h"
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/base/NotImplementedException.h"
20#include "arccore/serialize/BasicSerializer.h"
21#include "arccore/serialize/BasicSerializerInternal.h"
23#include "arccore/message_passing/ISerializeDispatcher.h"
24#include "arccore/message_passing/IControlDispatcher.h"
25#include "arccore/message_passing/MessageId.h"
26#include "arccore/message_passing/PointToPointMessageInfo.h"
50 template <
typename DataType>
void
54 mpAllGatherVariable(pm, send_values, buf);
55 recv_buffer.
copy(buf);
62void BasicSerializeGatherMessage::
71 BasicSerializer::Impl2* sbuf_p2 = sbuf->m_p2;
72 BasicSerializer::Impl2* recv_p2 = recv_buf->m_p2;
85 sizes[0] = send_real.
size();
86 sizes[1] = send_int16.
size();
87 sizes[2] = send_int32.
size();
88 sizes[3] = send_int64.
size();
89 sizes[4] = send_byte.
size();
90 sizes[5] = send_int8.
size();
91 sizes[6] = send_float16.
size();
92 sizes[7] = send_bfloat16.
size();
93 sizes[8] = send_float32.
size();
97 Int64 recv_nb_real = sizes[0];
98 Int64 recv_nb_int16 = sizes[1];
99 Int64 recv_nb_int32 = sizes[2];
100 Int64 recv_nb_int64 = sizes[3];
101 Int64 recv_nb_byte = sizes[4];
102 Int64 recv_nb_int8 = sizes[5];
103 Int64 recv_nb_float16 = sizes[6];
104 Int64 recv_nb_bfloat16 = sizes[7];
105 Int64 recv_nb_float32 = sizes[8];
107 if (recv_nb_float16 != 0)
109 if (recv_nb_bfloat16 != 0)
112 recv_p2->allocateBuffer(recv_nb_real, recv_nb_int16, recv_nb_int32, recv_nb_int64, recv_nb_byte,
113 recv_nb_int8, recv_nb_float16, recv_nb_bfloat16, recv_nb_float32);
115 auto recv_p = recv_buf->_p();
117 _doGatherOne(pm, send_real, recv_p->getRealBuffer());
118 _doGatherOne(pm, send_int32, recv_p->getInt32Buffer());
119 _doGatherOne(pm, send_int16, recv_p->getInt16Buffer());
120 _doGatherOne(pm, send_int64, recv_p->getInt64Buffer());
121 _doGatherOne(pm, send_byte, recv_p->getByteBuffer());
122 _doGatherOne(pm, send_int8, recv_p->getInt8Buffer());
123 _doGatherOne(pm, send_float32, recv_p->getFloat32Buffer());
144 auto d = pm->dispatchers()->controlDispatcher();
153 auto d = pm->dispatchers()->controlDispatcher();
170 auto d = pm->dispatchers()->controlDispatcher();
179 auto d = pm->dispatchers()->controlDispatcher();
209 auto d = pm->dispatchers()->controlDispatcher();
210 return d->
probe(message);
219 auto d = pm->dispatchers()->controlDispatcher();
229 auto d = pm->dispatchers()->controlDispatcher();
230 return d->commSplit(keep);
238 auto d = pm->dispatchers()->controlDispatcher();
248 auto d = pm->dispatchers()->controlDispatcher();
249 return d->nonBlockingBarrier();
258 auto d = pm->dispatchers()->serializeDispatcher();
269 auto d = pm->dispatchers()->serializeDispatcher();
270 return d->sendSerializer(values, message);
280 auto d = pm->dispatchers()->serializeDispatcher();
281 return d->receiveSerializer(values, message);
287MessageSourceInfo IControlDispatcher::
288legacyProbe(
const PointToPointMessageInfo&)
300 ARCCORE_FATAL(
"send_serializer is not a BasicSerializer");
303 ARCCORE_FATAL(
"receive_serializer is not a BasicSerializer");
305 message.doAllGather(pm, s, r);
312 template <
typename DataType>
inline ITypeDispatcher<DataType>*
313 _getDispatcher(IMessagePassingMng* pm)
315 ARCCORE_CHECK_POINTER(pm);
316 DataType* x =
nullptr;
317 auto* dispatcher = pm->dispatchers()->dispatcher(x);
318 ARCCORE_CHECK_POINTER(dispatcher);
323#define ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(type) \
324 void mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
326 _getDispatcher<type>(pm)->allGather(send_buf, recv_buf); \
328 void mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
330 _getDispatcher<type>(pm)->gather(send_buf, recv_buf, rank); \
332 Request mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
334 return _getDispatcher<type>(pm)->nonBlockingAllGather(send_buf, recv_buf); \
336 Request mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
338 return _getDispatcher<type>(pm)->nonBlockingGather(send_buf, recv_buf, rank); \
340 void mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf) \
342 _getDispatcher<type>(pm)->allGatherVariable(send_buf, recv_buf); \
344 void mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank) \
346 _getDispatcher<type>(pm)->gatherVariable(send_buf, recv_buf, rank); \
348 Request mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info) \
350 return _getDispatcher<type>(pm)->gather(gather_info); \
352 void mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root) \
354 return _getDispatcher<type>(pm)->scatterVariable(send_buf, recv_buf, root); \
356 type mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v) \
358 return _getDispatcher<type>(pm)->allReduce(rt, v); \
360 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf) \
362 _getDispatcher<type>(pm)->allReduce(rt, buf); \
364 Request mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf) \
366 return _getDispatcher<type>(pm)->nonBlockingAllReduce(rt, send_buf, recv_buf); \
368 void mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
370 _getDispatcher<type>(pm)->broadcast(send_buf, rank); \
372 Request mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
374 return _getDispatcher<type>(pm)->nonBlockingBroadcast(send_buf, rank); \
376 void mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank) \
378 _getDispatcher<type>(pm)->send(values, rank, true); \
380 void mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank) \
382 _getDispatcher<type>(pm)->receive(values, rank, true); \
384 Request mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked) \
386 return _getDispatcher<type>(pm)->send(values, rank, is_blocked); \
388 Request mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message) \
390 return _getDispatcher<type>(pm)->send(values, message); \
392 Request mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked) \
394 return _getDispatcher<type>(pm)->receive(values, rank, is_blocked); \
396 Request mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message) \
398 return _getDispatcher<type>(pm)->receive(values, message); \
400 void mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
402 return _getDispatcher<type>(pm)->allToAll(send_buf, recv_buf, count); \
404 Request mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
406 return _getDispatcher<type>(pm)->nonBlockingAllToAll(send_buf, recv_buf, count); \
408 void mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
409 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
410 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
412 _getDispatcher<type>(pm)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
414 Request mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
415 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
416 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
418 return _getDispatcher<type>(pm)->nonBlockingAllToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
424ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
char)
425ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
signed char)
426ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned char)
428ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
short)
429ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned short)
430ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
int)
431ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned int)
432ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long)
433ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long)
434ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long long)
435ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long long)
437ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
float)
438ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
double)
439ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long double)
441ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(BFloat16)
442ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(Float16)
Liste des fonctions d'échange de message.
virtual Ref< Parallel::IRequestList > createRequestListRef()=0
Créé une liste de requêtes pour ce gestionnaire.
virtual MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message)=0
Sonde si des messages sont disponibles.
virtual UniqueArray< Integer > waitSomeRequests(ArrayView< Request > rvalues)=0
Bloque en attendant qu'une des requêtes rvalues soit terminée.
virtual Ref< ISerializeMessageList > createSerializeMessageListRef()=0
Créé une liste pour gérer les 'ISerializeMessage'.
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
virtual MessageId probe(const PointToPointMessageInfo &message)=0
Sonde si des messages sont disponibles.
virtual void barrier()=0
Effectue une barière.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
Implémentation basique de 'ISerializer'.
Interface d'un sérialiseur.
Interface du gestionnaire des échanges de messages.
Informations pour envoyer/recevoir un message point à point.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Référence à une instance.
ARCCORE_HOST_DEVICE void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Vecteur 1D de données avec sémantique par valeur (style STL).
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Effectue une barrière non bloquante.
void mpBarrier(IMessagePassingMng *pm)
Effectue une barrière.
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
Message allGather() pour une sérialisation.
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Créé une nouvelle instance de IMessagePassingMng.
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Créé une liste de messages de sérialisation.
void mpWaitAll(IMessagePassingMng *pm, ArrayView< Request > requests)
Bloque tant que les requêtes de requests ne sont pas terminées.
void mpTestSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Teste si des requêtes de request sont terminées.
@ WaitSome
Attend que tous les messages de la liste soient traités.
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.
void mpWait(IMessagePassingMng *pm, Request request)
Bloque jusqu'à ce que la requête request soit terminée.
@ ReduceSum
Somme des valeurs.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Créé une liste de requêtes.
Espace de nom de Arccore.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.