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
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.