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());
157 auto d = pm->dispatchers()->controlDispatcher();
166 auto d = pm->dispatchers()->controlDispatcher();
167 d->waitAllRequests(requests);
183 auto d = pm->dispatchers()->controlDispatcher();
184 d->waitSomeRequests(requests, indexes,
false);
192 auto d = pm->dispatchers()->controlDispatcher();
193 d->waitSomeRequests(requests, indexes,
true);
222 auto d = pm->dispatchers()->controlDispatcher();
223 return d->probe(message);
232 auto d = pm->dispatchers()->controlDispatcher();
233 return d->legacyProbe(message);
242 auto d = pm->dispatchers()->controlDispatcher();
243 return d->commSplit(keep);
251 auto d = pm->dispatchers()->controlDispatcher();
261 auto d = pm->dispatchers()->controlDispatcher();
262 return d->nonBlockingBarrier();
271 auto d = pm->dispatchers()->serializeDispatcher();
282 auto d = pm->dispatchers()->serializeDispatcher();
293 auto d = pm->dispatchers()->serializeDispatcher();
316 ARCCORE_FATAL(
"receive_serializer is not a BasicSerializer");
318 message.doAllGather(pm, s, r);
357 DataType* x =
nullptr;
358 auto* dispatcher = pm->dispatchers()->dispatcher(x);
364#define ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(type) \
365 void mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
367 _getDispatcher<type>(pm)->allGather(send_buf, recv_buf); \
369 void mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
371 _getDispatcher<type>(pm)->gather(send_buf, recv_buf, rank); \
373 Request mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
375 return _getDispatcher<type>(pm)->nonBlockingAllGather(send_buf, recv_buf); \
377 Request mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
379 return _getDispatcher<type>(pm)->nonBlockingGather(send_buf, recv_buf, rank); \
381 void mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf) \
383 _getDispatcher<type>(pm)->allGatherVariable(send_buf, recv_buf); \
385 void mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank) \
387 _getDispatcher<type>(pm)->gatherVariable(send_buf, recv_buf, rank); \
389 Request mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info) \
391 return _getDispatcher<type>(pm)->gather(gather_info); \
393 void mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root) \
395 return _getDispatcher<type>(pm)->scatterVariable(send_buf, recv_buf, root); \
397 type mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v) \
399 return _getDispatcher<type>(pm)->allReduce(rt, v); \
401 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf) \
403 _getDispatcher<type>(pm)->allReduce(rt, buf); \
405 Request mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf) \
407 return _getDispatcher<type>(pm)->nonBlockingAllReduce(rt, send_buf, recv_buf); \
409 void mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
411 _getDispatcher<type>(pm)->broadcast(send_buf, rank); \
413 Request mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
415 return _getDispatcher<type>(pm)->nonBlockingBroadcast(send_buf, rank); \
417 void mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank) \
419 _getDispatcher<type>(pm)->send(values, rank, true); \
421 void mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank) \
423 _getDispatcher<type>(pm)->receive(values, rank, true); \
425 Request mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked) \
427 return _getDispatcher<type>(pm)->send(values, rank, is_blocked); \
429 Request mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message) \
431 return _getDispatcher<type>(pm)->send(values, message); \
433 Request mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked) \
435 return _getDispatcher<type>(pm)->receive(values, rank, is_blocked); \
437 Request mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message) \
439 return _getDispatcher<type>(pm)->receive(values, message); \
441 void mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
443 return _getDispatcher<type>(pm)->allToAll(send_buf, recv_buf, count); \
445 Request mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
447 return _getDispatcher<type>(pm)->nonBlockingAllToAll(send_buf, recv_buf, count); \
449 void mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
450 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
451 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
453 _getDispatcher<type>(pm)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
455 Request mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
456 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
457 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
459 return _getDispatcher<type>(pm)->nonBlockingAllToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
465ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
char)
466ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
signed char)
467ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned char)
469ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
short)
470ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned short)
471ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
int)
472ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned int)
473ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long)
474ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long)
475ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long long)
476ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
unsigned long long)
478ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
float)
479ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
double)
480ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
long double)
482ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(BFloat16)
483ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(
Float16)
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
#define ARCCORE_THROW(exception_class,...)
Macro to throw an exception with formatting.
#define ARCCORE_CHECK_POINTER(ptr)
Macro that returns the pointer ptr if it is not null or throws an exception if it is null.
Brief list of message exchange functions.
Modifiable view of an array of type T.
void fill(const T &o) noexcept
Fills the array with the value o.
virtual Ref< IRequestList > createRequestListRef()=0
Creation of a request list associated with this manager.
Interface of the message passing manager.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual Request receiveSerializer(ISerializer *s, const PointToPointMessageInfo &message)=0
Receiving message.
virtual Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message)=0
Sending message.
virtual Ref< ISerializeMessageList > createSerializeMessageListRef()=0
Create a list of serialization messages.
Information about the source of a message.
Information for sending/receiving a point-to-point message.
Reference to an instance.
__host__ __device__ void copy(const U ©_array)
Copies the array copy_array into the instance.
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
View of an array of elements of type T.
1D data vector with value semantics (STL style).
Declarations of types and methods used by message exchange mechanisms.
Ref< ISerializeMessage > mpCreateSerializeMessage(IMessagePassingMng *pm, MessageRank target, ePointToPointMessageType type)
Creates a serialization message.
void mpTestSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Tests if any of the requests in request are finished.
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Creates a serialization message list.
Ref< ISerializeMessage > mpCreateSendSerializeMessage(IMessagePassingMng *pm, MessageRank destination)
Creates a serialization message for sending.
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Tests if a message is available.
Ref< ISerializeMessage > mpCreateReceiveSerializeMessage(IMessagePassingMng *pm, MessageRank source)
Creates a serialization message for receiving.
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Tests if a message is available.
C char mpAllReduce(IMessagePassingMng *pm, eReduceType rt, char v)
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Creates a list of requests.
C void mpAllGatherVariable(IMessagePassingMng *pm, Span< const char > send_buf, Array< char > &recv_buf)
@ WaitSome
Wait until all messages in the list are processed.
void mpBarrier(IMessagePassingMng *pm)
Performs a barrier.
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Performs a non-blocking barrier.
void mpWait(IMessagePassingMng *pm, Request request)
Blocks until the request request is finished.
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
allGather() message for serialization
void mpWaitAll(IMessagePassingMng *pm, ArrayView< Request > requests)
Blocks until the requests in requests are finished.
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Creates a new instance of IMessagePassingMng.
ePointToPointMessageType
Point-to-point message type.
@ ReduceSum
Sum of values.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Receive message using an ISerializer.
void mpWaitSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Blocks until at least one of the requests in request is finished.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Send message using an ISerializer.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
@ Float16
Float16 data type.