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
54 mpAllGatherVariable(pm, send_values, buf);
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();
266Ref<ISerializeMessageList>
269 auto d = pm->dispatchers()->serializeDispatcher();
280 auto d = pm->dispatchers()->serializeDispatcher();
291 auto d = pm->dispatchers()->serializeDispatcher();
298MessageSourceInfo IControlDispatcher::
299legacyProbe(
const PointToPointMessageInfo&)
311 ARCCORE_FATAL(
"send_serializer is not a BasicSerializer");
314 ARCCORE_FATAL(
"receive_serializer is not a BasicSerializer");
316 message.doAllGather(pm, s, r);
323 template <
typename DataType>
inline ITypeDispatcher<DataType>*
324 _getDispatcher(IMessagePassingMng* pm)
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 Ref< ISerializeMessageList > createSerializeMessageListRef()=0
Créé une liste de messages de sérialisation.
virtual Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message)=0
Message d'envoi.
Informations pour envoyer/recevoir un message point à point.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
__host__ __device__ void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
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...
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.
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Créé une nouvelle instance de IMessagePassingMng.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
void mpBarrier(IMessagePassingMng *pm)
Effectue une barrière.
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Créé une liste de requêtes.
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.
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Effectue une barrière non bloquante.
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.
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Créé une liste de messages de sérialisation.
@ ReduceSum
Somme des valeurs.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
void mpWait(IMessagePassingMng *pm, Request request)
Bloque jusqu'à ce que la requête request soit terminée.
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Teste si un message est disponible.
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.