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/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
55 recv_buffer.
copy(buf);
62void BasicSerializeGatherMessage::
72 BasicSerializer::Impl2* sbuf_p2 = sbuf->m_p2;
73 BasicSerializer::Impl2* recv_p2 = recv_buf->m_p2;
88 sizes[0] = send_real.
size();
89 sizes[1] = send_int16.
size();
90 sizes[2] = send_int32.
size();
91 sizes[3] = send_int64.
size();
92 sizes[4] = send_byte.
size();
93 sizes[5] = send_int8.
size();
94 sizes[6] = send_float16.
size();
95 sizes[7] = send_bfloat16.
size();
96 sizes[8] = send_float32.
size();
97 sizes[9] = send_float128.
size();
98 sizes[10] = send_int128.
size();
102 Int64 recv_nb_real = sizes[0];
103 Int64 recv_nb_int16 = sizes[1];
104 Int64 recv_nb_int32 = sizes[2];
105 Int64 recv_nb_int64 = sizes[3];
106 Int64 recv_nb_byte = sizes[4];
107 Int64 recv_nb_int8 = sizes[5];
108 Int64 recv_nb_float16 = sizes[6];
109 Int64 recv_nb_bfloat16 = sizes[7];
110 Int64 recv_nb_float32 = sizes[8];
111 Int64 recv_nb_float128 = sizes[9];
112 Int64 recv_nb_int128 = sizes[10];
114 if (recv_nb_float16 != 0)
116 if (recv_nb_bfloat16 != 0)
118 if (recv_nb_float128 != 0)
120 if (recv_nb_int128 != 0)
123 recv_p2->allocateBuffer(recv_nb_real, recv_nb_int16, recv_nb_int32, recv_nb_int64, recv_nb_byte,
124 recv_nb_int8, recv_nb_float16, recv_nb_bfloat16, recv_nb_float32, recv_nb_float128, recv_nb_int128);
126 auto recv_p = recv_buf->_p();
128 _doGatherOne(pm, send_real, recv_p->getRealBuffer());
129 _doGatherOne(pm, send_int32, recv_p->getInt32Buffer());
130 _doGatherOne(pm, send_int16, recv_p->getInt16Buffer());
131 _doGatherOne(pm, send_int64, recv_p->getInt64Buffer());
132 _doGatherOne(pm, send_byte, recv_p->getByteBuffer());
133 _doGatherOne(pm, send_int8, recv_p->getInt8Buffer());
134 _doGatherOne(pm, send_float32, recv_p->getFloat32Buffer());
155 auto d = pm->dispatchers()->controlDispatcher();
164 auto d = pm->dispatchers()->controlDispatcher();
165 d->waitAllRequests(requests);
181 auto d = pm->dispatchers()->controlDispatcher();
182 d->waitSomeRequests(requests, indexes,
false);
190 auto d = pm->dispatchers()->controlDispatcher();
191 d->waitSomeRequests(requests, indexes,
true);
220 auto d = pm->dispatchers()->controlDispatcher();
221 return d->probe(message);
230 auto d = pm->dispatchers()->controlDispatcher();
231 return d->legacyProbe(message);
240 auto d = pm->dispatchers()->controlDispatcher();
241 return d->commSplit(keep);
249 auto d = pm->dispatchers()->controlDispatcher();
259 auto d = pm->dispatchers()->controlDispatcher();
260 return d->nonBlockingBarrier();
269 auto d = pm->dispatchers()->serializeDispatcher();
280 auto d = pm->dispatchers()->serializeDispatcher();
291 auto d = pm->dispatchers()->serializeDispatcher();
311 ARCCORE_FATAL(
"send_serializer is not a BasicSerializer");
314 ARCCORE_FATAL(
"receive_serializer is not a BasicSerializer");
316 message.doAllGather(pm, s, r);
326 ARCCORE_CHECK_POINTER(pm);
327 DataType* x =
nullptr;
328 auto* dispatcher = pm->dispatchers()->dispatcher(x);
329 ARCCORE_CHECK_POINTER(dispatcher);
334#define ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(type) \
335 void mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
337 _getDispatcher<type>(pm)->allGather(send_buf, recv_buf); \
339 void mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
341 _getDispatcher<type>(pm)->gather(send_buf, recv_buf, rank); \
343 Request mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
345 return _getDispatcher<type>(pm)->nonBlockingAllGather(send_buf, recv_buf); \
347 Request mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
349 return _getDispatcher<type>(pm)->nonBlockingGather(send_buf, recv_buf, rank); \
351 void mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf) \
353 _getDispatcher<type>(pm)->allGatherVariable(send_buf, recv_buf); \
355 void mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank) \
357 _getDispatcher<type>(pm)->gatherVariable(send_buf, recv_buf, rank); \
359 Request mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info) \
361 return _getDispatcher<type>(pm)->gather(gather_info); \
363 void mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root) \
365 return _getDispatcher<type>(pm)->scatterVariable(send_buf, recv_buf, root); \
367 type mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v) \
369 return _getDispatcher<type>(pm)->allReduce(rt, v); \
371 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf) \
373 _getDispatcher<type>(pm)->allReduce(rt, buf); \
375 Request mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf) \
377 return _getDispatcher<type>(pm)->nonBlockingAllReduce(rt, send_buf, recv_buf); \
379 void mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
381 _getDispatcher<type>(pm)->broadcast(send_buf, rank); \
383 Request mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
385 return _getDispatcher<type>(pm)->nonBlockingBroadcast(send_buf, rank); \
387 void mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank) \
389 _getDispatcher<type>(pm)->send(values, rank, true); \
391 void mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank) \
393 _getDispatcher<type>(pm)->receive(values, rank, true); \
395 Request mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked) \
397 return _getDispatcher<type>(pm)->send(values, rank, is_blocked); \
399 Request mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message) \
401 return _getDispatcher<type>(pm)->send(values, message); \
403 Request mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked) \
405 return _getDispatcher<type>(pm)->receive(values, rank, is_blocked); \
407 Request mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message) \
409 return _getDispatcher<type>(pm)->receive(values, message); \
411 void mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
413 return _getDispatcher<type>(pm)->allToAll(send_buf, recv_buf, count); \
415 Request mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
417 return _getDispatcher<type>(pm)->nonBlockingAllToAll(send_buf, recv_buf, count); \
419 void mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
420 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
421 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
423 _getDispatcher<type>(pm)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
425 Request mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
426 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
427 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
429 return _getDispatcher<type>(pm)->nonBlockingAllToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
435ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
char)
436ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
signed char)
437ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned char)
439ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
short)
440ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned short)
441ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
int)
442ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned int)
443ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long)
444ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long)
445ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long long)
446ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long long)
448ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
float)
449ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
double)
450ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long double)
452ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(BFloat16)
453ARCCORE_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 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.
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.
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
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.
@ 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.