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/internal/BasicSerializerInternal.h"
23#include "arccore/message_passing/BasicSerializeMessage.h"
24#include "arccore/message_passing/ISerializeDispatcher.h"
25#include "arccore/message_passing/IControlDispatcher.h"
26#include "arccore/message_passing/MessageId.h"
27#include "arccore/message_passing/PointToPointMessageInfo.h"
51 template <
typename DataType>
void
54 UniqueArray<DataType> buf;
56 recv_buffer.
copy(buf);
63void BasicSerializeGatherMessage::
73 BasicSerializer::Impl2* sbuf_p2 = sbuf->m_p2;
74 BasicSerializer::Impl2* recv_p2 = recv_buf->m_p2;
89 sizes[0] = send_real.
size();
90 sizes[1] = send_int16.
size();
91 sizes[2] = send_int32.
size();
92 sizes[3] = send_int64.
size();
93 sizes[4] = send_byte.
size();
94 sizes[5] = send_int8.
size();
95 sizes[6] = send_float16.
size();
96 sizes[7] = send_bfloat16.
size();
97 sizes[8] = send_float32.
size();
98 sizes[9] = send_float128.
size();
99 sizes[10] = send_int128.
size();
103 Int64 recv_nb_real = sizes[0];
104 Int64 recv_nb_int16 = sizes[1];
105 Int64 recv_nb_int32 = sizes[2];
106 Int64 recv_nb_int64 = sizes[3];
107 Int64 recv_nb_byte = sizes[4];
108 Int64 recv_nb_int8 = sizes[5];
109 Int64 recv_nb_float16 = sizes[6];
110 Int64 recv_nb_bfloat16 = sizes[7];
111 Int64 recv_nb_float32 = sizes[8];
112 Int64 recv_nb_float128 = sizes[9];
113 Int64 recv_nb_int128 = sizes[10];
115 if (recv_nb_float16 != 0)
117 if (recv_nb_bfloat16 != 0)
119 if (recv_nb_float128 != 0)
121 if (recv_nb_int128 != 0)
124 recv_p2->allocateBuffer(recv_nb_real, recv_nb_int16, recv_nb_int32, recv_nb_int64, recv_nb_byte,
125 recv_nb_int8, recv_nb_float16, recv_nb_bfloat16, recv_nb_float32, recv_nb_float128, recv_nb_int128);
127 auto recv_p = recv_buf->_p();
129 _doGatherOne(pm, send_real, recv_p->getRealBuffer());
130 _doGatherOne(pm, send_int32, recv_p->getInt32Buffer());
131 _doGatherOne(pm, send_int16, recv_p->getInt16Buffer());
132 _doGatherOne(pm, send_int64, recv_p->getInt64Buffer());
133 _doGatherOne(pm, send_byte, recv_p->getByteBuffer());
134 _doGatherOne(pm, send_int8, recv_p->getInt8Buffer());
135 _doGatherOne(pm, send_float32, recv_p->getFloat32Buffer());
156 auto d = pm->dispatchers()->controlDispatcher();
165 auto d = pm->dispatchers()->controlDispatcher();
166 d->waitAllRequests(requests);
182 auto d = pm->dispatchers()->controlDispatcher();
183 d->waitSomeRequests(requests, indexes,
false);
191 auto d = pm->dispatchers()->controlDispatcher();
192 d->waitSomeRequests(requests, indexes,
true);
221 auto d = pm->dispatchers()->controlDispatcher();
222 return d->probe(message);
231 auto d = pm->dispatchers()->controlDispatcher();
232 return d->legacyProbe(message);
241 auto d = pm->dispatchers()->controlDispatcher();
242 return d->commSplit(keep);
250 auto d = pm->dispatchers()->controlDispatcher();
260 auto d = pm->dispatchers()->controlDispatcher();
261 return d->nonBlockingBarrier();
270 auto d = pm->dispatchers()->serializeDispatcher();
281 auto d = pm->dispatchers()->serializeDispatcher();
292 auto d = pm->dispatchers()->serializeDispatcher();
312 ARCCORE_FATAL(
"send_serializer is not a BasicSerializer");
315 ARCCORE_FATAL(
"receive_serializer is not a BasicSerializer");
317 message.doAllGather(pm, s, r);
355 ARCCORE_CHECK_POINTER(pm);
356 DataType* x =
nullptr;
357 auto* dispatcher = pm->dispatchers()->dispatcher(x);
358 ARCCORE_CHECK_POINTER(dispatcher);
363#define ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(type) \
364 void mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
366 _getDispatcher<type>(pm)->allGather(send_buf, recv_buf); \
368 void mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
370 _getDispatcher<type>(pm)->gather(send_buf, recv_buf, rank); \
372 Request mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
374 return _getDispatcher<type>(pm)->nonBlockingAllGather(send_buf, recv_buf); \
376 Request mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
378 return _getDispatcher<type>(pm)->nonBlockingGather(send_buf, recv_buf, rank); \
380 void mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf) \
382 _getDispatcher<type>(pm)->allGatherVariable(send_buf, recv_buf); \
384 void mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank) \
386 _getDispatcher<type>(pm)->gatherVariable(send_buf, recv_buf, rank); \
388 Request mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info) \
390 return _getDispatcher<type>(pm)->gather(gather_info); \
392 void mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root) \
394 return _getDispatcher<type>(pm)->scatterVariable(send_buf, recv_buf, root); \
396 type mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v) \
398 return _getDispatcher<type>(pm)->allReduce(rt, v); \
400 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf) \
402 _getDispatcher<type>(pm)->allReduce(rt, buf); \
404 Request mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf) \
406 return _getDispatcher<type>(pm)->nonBlockingAllReduce(rt, send_buf, recv_buf); \
408 void mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
410 _getDispatcher<type>(pm)->broadcast(send_buf, rank); \
412 Request mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
414 return _getDispatcher<type>(pm)->nonBlockingBroadcast(send_buf, rank); \
416 void mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank) \
418 _getDispatcher<type>(pm)->send(values, rank, true); \
420 void mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank) \
422 _getDispatcher<type>(pm)->receive(values, rank, true); \
424 Request mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked) \
426 return _getDispatcher<type>(pm)->send(values, rank, is_blocked); \
428 Request mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message) \
430 return _getDispatcher<type>(pm)->send(values, message); \
432 Request mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked) \
434 return _getDispatcher<type>(pm)->receive(values, rank, is_blocked); \
436 Request mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message) \
438 return _getDispatcher<type>(pm)->receive(values, message); \
440 void mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
442 return _getDispatcher<type>(pm)->allToAll(send_buf, recv_buf, count); \
444 Request mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
446 return _getDispatcher<type>(pm)->nonBlockingAllToAll(send_buf, recv_buf, count); \
448 void mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
449 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
450 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
452 _getDispatcher<type>(pm)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
454 Request mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
455 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
456 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
458 return _getDispatcher<type>(pm)->nonBlockingAllToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
464ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
char)
465ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
signed char)
466ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned char)
468ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
short)
469ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned short)
470ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
int)
471ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned int)
472ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long)
473ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long)
474ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long long)
475ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long long)
477ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
float)
478ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
double)
479ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long double)
481ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(BFloat16)
482ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
Float16)
Liste des fonctions d'échange de message.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
Interface d'un sérialiseur.
virtual Ref< IRequestList > createRequestListRef()=0
Création d'une liste de requêtes associé à ce gestionnaire.
Interface du gestionnaire des échanges de messages.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Request receiveSerializer(ISerializer *s, const PointToPointMessageInfo &message)=0
Message de réception.
virtual Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message)=0
Message d'envoi.
virtual Ref< ISerializeMessageList > createSerializeMessageListRef()=0
Créé une liste de messages de sérialisation.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
Référence à une instance.
__host__ __device__ void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
Ref< ISerializeMessage > mpCreateSerializeMessage(IMessagePassingMng *pm, MessageRank target, ePointToPointMessageType type)
Créé un message de sérialisation.
void mpTestSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Teste si des requêtes de request sont terminées.
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Créé une liste de messages de sérialisation.
Ref< ISerializeMessage > mpCreateSendSerializeMessage(IMessagePassingMng *pm, MessageRank destination)
Créé un message de sérialisation en envoi.
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Ref< ISerializeMessage > mpCreateReceiveSerializeMessage(IMessagePassingMng *pm, MessageRank source)
Créé un message de sérialisation en envoi.
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
C char mpAllReduce(IMessagePassingMng *pm, eReduceType rt, char v)
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Créé une liste de requêtes.
C void mpAllGatherVariable(IMessagePassingMng *pm, Span< const char > send_buf, Array< char > &recv_buf)
@ WaitSome
Attend que tous les messages de la liste soient traités.
void mpBarrier(IMessagePassingMng *pm)
Effectue une barrière.
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Effectue une barrière non bloquante.
void mpWait(IMessagePassingMng *pm, Request request)
Bloque jusqu'à ce que la requête request soit terminée.
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
Message allGather() pour une sérialisation.
void mpWaitAll(IMessagePassingMng *pm, ArrayView< Request > requests)
Bloque tant que les requêtes de requests ne sont pas terminées.
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Créé une nouvelle instance de IMessagePassingMng.
ePointToPointMessageType
Type de message point à point.
@ ReduceSum
Somme des valeurs.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
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.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
@ Float16
Donnée de type Float16.