Arcane  4.2.3.0
User documentation
Loading...
Searching...
No Matches
Messages.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Messages.cc (C) 2000-2026 */
9/* */
10/* Identifier of a point-to-point message. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arccore/base/NotSupportedException.h"
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/base/NotImplementedException.h"
19
20#include "arccore/serialize/BasicSerializer.h"
21#include "arccore/serialize/internal/BasicSerializerInternal.h"
22
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"
28
29/*!
30 * \file Messages.h
31 *
32 * \brief Brief list of message exchange functions.
33 */
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38namespace Arcane
39{
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
45{
46 public:
47
48 void doAllGather(MessagePassing::IMessagePassingMng* pm, const BasicSerializer* send_serializer,
49 BasicSerializer* receive_serializer);
50
51 template <typename DataType> void
52 _doGatherOne(MessagePassing::IMessagePassingMng* pm, Span<const DataType> send_values, Span<DataType> recv_buffer)
53 {
55 mpAllGatherVariable(pm, send_values, buf);
56 recv_buffer.copy(buf);
57 }
58};
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
63void BasicSerializeGatherMessage::
64doAllGather(MessagePassing::IMessagePassingMng* pm, const BasicSerializer* send_serializer,
65 BasicSerializer* receive_serializer)
66{
67 // TODO: does not yet support types 'Float16', 'BFloat16'
68 // 'Float128' and 'Int128' because the latter are not supported
69 // in MPI messages.
70
71 const BasicSerializer* sbuf = send_serializer;
72 BasicSerializer* recv_buf = receive_serializer;
73 BasicSerializer::Impl2* sbuf_p2 = sbuf->m_p2;
74 BasicSerializer::Impl2* recv_p2 = recv_buf->m_p2;
75
76 Span<const Real> send_real = sbuf_p2->realBytes();
77 Span<const Int16> send_int16 = sbuf_p2->int16Bytes();
78 Span<const Int32> send_int32 = sbuf_p2->int32Bytes();
79 Span<const Int64> send_int64 = sbuf_p2->int64Bytes();
80 Span<const Byte> send_byte = sbuf_p2->byteBytes();
81 Span<const Int8> send_int8 = sbuf_p2->int8Bytes();
82 Span<const Float16> send_float16 = sbuf_p2->float16Bytes();
83 Span<const BFloat16> send_bfloat16 = sbuf_p2->bfloat16Bytes();
84 Span<const Float32> send_float32 = sbuf_p2->float32Bytes();
85 Span<const Float128> send_float128 = sbuf_p2->float128Bytes();
86 Span<const Int128> send_int128 = sbuf_p2->int128Bytes();
87
88 Int64 sizes[11];
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();
100
102
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];
114
115 if (recv_nb_float16 != 0)
116 ARCCORE_THROW(NotImplementedException, "AllGather with serialized type 'float16' is not yet implemented");
117 if (recv_nb_bfloat16 != 0)
118 ARCCORE_THROW(NotImplementedException, "AllGather with serialized type 'bfloat16' is not yet implemented");
119 if (recv_nb_float128 != 0)
120 ARCCORE_THROW(NotImplementedException, "AllGather with serialized type 'float128' is not yet implemented");
121 if (recv_nb_int128 != 0)
122 ARCCORE_THROW(NotImplementedException, "AllGather with serialized type 'int128' is not yet implemented");
123
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);
126
127 auto recv_p = recv_buf->_p();
128
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());
136}
137
138} // namespace Arcane
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
144{
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149/*!
150 * \brief Creates a list of requests.
151 *
152 * \sa IRequestList
153 */
154Ref<IRequestList>
156{
157 auto d = pm->dispatchers()->controlDispatcher();
158 return d->createRequestListRef();
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
165{
166 auto d = pm->dispatchers()->controlDispatcher();
167 d->waitAllRequests(requests);
168}
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
174{
175 mpWaitAll(pm, ArrayView<Request>(1, &request));
176}
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
182{
183 auto d = pm->dispatchers()->controlDispatcher();
184 d->waitSomeRequests(requests, indexes, false);
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
191{
192 auto d = pm->dispatchers()->controlDispatcher();
193 d->waitSomeRequests(requests, indexes, true);
194}
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
200 ArrayView<bool> indexes, eWaitType w_type)
201{
202 switch (w_type) {
203 case WaitAll:
204 mpWaitAll(pm, requests);
205 indexes.fill(true);
206 break;
207 case WaitSome:
208 mpWaitSome(pm, requests, indexes);
209 break;
211 mpTestSome(pm, requests, indexes);
212 break;
213 }
214}
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
218
221{
222 auto d = pm->dispatchers()->controlDispatcher();
223 return d->probe(message);
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
231{
232 auto d = pm->dispatchers()->controlDispatcher();
233 return d->legacyProbe(message);
234}
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
241{
242 auto d = pm->dispatchers()->controlDispatcher();
243 return d->commSplit(keep);
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
251{
252 auto d = pm->dispatchers()->controlDispatcher();
253 return d->splitCommunicator(keep);
254}
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
260{
261 auto d = pm->dispatchers()->controlDispatcher();
262 d->barrier();
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
270{
271 auto d = pm->dispatchers()->controlDispatcher();
272 return d->nonBlockingBarrier();
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
280{
281 auto d = pm->dispatchers()->serializeDispatcher();
283}
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
290 const PointToPointMessageInfo& message)
291{
292 auto d = pm->dispatchers()->serializeDispatcher();
293 return d->sendSerializer(values, message);
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
301 const PointToPointMessageInfo& message)
302{
303 auto d = pm->dispatchers()->serializeDispatcher();
304 return d->receiveSerializer(values, message);
305}
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310MessageSourceInfo IControlDispatcher::
311legacyProbe(const PointToPointMessageInfo&)
312{
313 ARCCORE_THROW(NotSupportedException, "pure virtual call to legacyProbe()");
314}
315
316/*---------------------------------------------------------------------------*/
317/*---------------------------------------------------------------------------*/
318
319void mpAllGather(IMessagePassingMng* pm, const ISerializer* send_serializer, ISerializer* receive_serialize)
320{
321 auto* s = dynamic_cast<const BasicSerializer*>(send_serializer);
322 if (!s)
323 ARCCORE_FATAL("send_serializer is not a BasicSerializer");
324 auto* r = dynamic_cast<BasicSerializer*>(receive_serialize);
325 if (!r)
326 ARCCORE_FATAL("receive_serializer is not a BasicSerializer");
328 message.doAllGather(pm, s, r);
329}
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333
336{
337 return internal::BasicSerializeMessage::create(MessageRank(pm->commRank()), target, type);
338}
339
342{
343 return internal::BasicSerializeMessage::create(MessageRank(pm->commRank()), id);
344}
345
346ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
348{
349 return mpCreateSerializeMessage(pm, destination, ePointToPointMessageType::MsgSend);
350}
351
352ARCCORE_MESSAGEPASSING_EXPORT Ref<ISerializeMessage>
354{
355 return mpCreateSerializeMessage(pm, source, ePointToPointMessageType::MsgReceive);
356}
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
361namespace
362{
363 template <typename DataType> inline ITypeDispatcher<DataType>*
364 _getDispatcher(IMessagePassingMng* pm)
365 {
367 DataType* x = nullptr;
368 auto* dispatcher = pm->dispatchers()->dispatcher(x);
369 ARCCORE_CHECK_POINTER(dispatcher);
370 return dispatcher;
371 }
372} // namespace
373
374#define ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(type) \
375 void mpAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
376 { \
377 _getDispatcher<type>(pm)->allGather(send_buf, recv_buf); \
378 } \
379 void mpGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
380 { \
381 _getDispatcher<type>(pm)->gather(send_buf, recv_buf, rank); \
382 } \
383 Request mpNonBlockingAllGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf) \
384 { \
385 return _getDispatcher<type>(pm)->nonBlockingAllGather(send_buf, recv_buf); \
386 } \
387 Request mpNonBlockingGather(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 rank) \
388 { \
389 return _getDispatcher<type>(pm)->nonBlockingGather(send_buf, recv_buf, rank); \
390 } \
391 void mpAllGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf) \
392 { \
393 _getDispatcher<type>(pm)->allGatherVariable(send_buf, recv_buf); \
394 } \
395 void mpGatherVariable(IMessagePassingMng* pm, Span<const type> send_buf, Array<type>& recv_buf, Int32 rank) \
396 { \
397 _getDispatcher<type>(pm)->gatherVariable(send_buf, recv_buf, rank); \
398 } \
399 Request mpGather(IMessagePassingMng* pm, GatherMessageInfo<type>& gather_info) \
400 { \
401 return _getDispatcher<type>(pm)->gather(gather_info); \
402 } \
403 void mpScatterVariable(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 root) \
404 { \
405 return _getDispatcher<type>(pm)->scatterVariable(send_buf, recv_buf, root); \
406 } \
407 type mpAllReduce(IMessagePassingMng* pm, eReduceType rt, type v) \
408 { \
409 return _getDispatcher<type>(pm)->allReduce(rt, v); \
410 } \
411 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<type> buf) \
412 { \
413 _getDispatcher<type>(pm)->allReduce(rt, buf); \
414 } \
415 void mpAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> receive_buf) \
416 { \
417 _getDispatcher<type>(pm)->allReduce(rt, send_buf, receive_buf); \
418 } \
419 void mpScanExclusive(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> receive_buf) \
420 { \
421 _getDispatcher<type>(pm)->scanExclusive(rt, send_buf, receive_buf); \
422 } \
423 Request mpNonBlockingAllReduce(IMessagePassingMng* pm, eReduceType rt, Span<const type> send_buf, Span<type> recv_buf) \
424 { \
425 return _getDispatcher<type>(pm)->nonBlockingAllReduce(rt, send_buf, recv_buf); \
426 } \
427 void mpBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
428 { \
429 _getDispatcher<type>(pm)->broadcast(send_buf, rank); \
430 } \
431 Request mpNonBlockingBroadcast(IMessagePassingMng* pm, Span<type> send_buf, Int32 rank) \
432 { \
433 return _getDispatcher<type>(pm)->nonBlockingBroadcast(send_buf, rank); \
434 } \
435 void mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank) \
436 { \
437 _getDispatcher<type>(pm)->send(values, rank, true); \
438 } \
439 void mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank) \
440 { \
441 _getDispatcher<type>(pm)->receive(values, rank, true); \
442 } \
443 Request mpSend(IMessagePassingMng* pm, Span<const type> values, Int32 rank, bool is_blocked) \
444 { \
445 return _getDispatcher<type>(pm)->send(values, rank, is_blocked); \
446 } \
447 Request mpSend(IMessagePassingMng* pm, Span<const type> values, const PointToPointMessageInfo& message) \
448 { \
449 return _getDispatcher<type>(pm)->send(values, message); \
450 } \
451 Request mpReceive(IMessagePassingMng* pm, Span<type> values, Int32 rank, bool is_blocked) \
452 { \
453 return _getDispatcher<type>(pm)->receive(values, rank, is_blocked); \
454 } \
455 Request mpReceive(IMessagePassingMng* pm, Span<type> values, const PointToPointMessageInfo& message) \
456 { \
457 return _getDispatcher<type>(pm)->receive(values, message); \
458 } \
459 void mpAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
460 { \
461 return _getDispatcher<type>(pm)->allToAll(send_buf, recv_buf, count); \
462 } \
463 Request mpNonBlockingAllToAll(IMessagePassingMng* pm, Span<const type> send_buf, Span<type> recv_buf, Int32 count) \
464 { \
465 return _getDispatcher<type>(pm)->nonBlockingAllToAll(send_buf, recv_buf, count); \
466 } \
467 void mpAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
468 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
469 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
470 { \
471 _getDispatcher<type>(pm)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
472 } \
473 Request mpNonBlockingAllToAllVariable(IMessagePassingMng* pm, Span<const type> send_buf, ConstArrayView<Int32> send_count, \
474 ConstArrayView<Int32> send_index, Span<type> recv_buf, \
475 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) \
476 { \
477 return _getDispatcher<type>(pm)->nonBlockingAllToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
478 }
479
480/*---------------------------------------------------------------------------*/
481/*---------------------------------------------------------------------------*/
482
483ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(char)
484ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(signed char)
485ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(unsigned char)
486
487ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(short)
488ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(unsigned short)
489ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(int)
490ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(unsigned int)
491ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(long)
492ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(unsigned long)
493ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(long long)
494ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(unsigned long long)
495
496ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(float)
497ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(double)
498ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(long double)
499
500ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(BFloat16)
501ARCCORE_GENERATE_MESSAGEPASSING_DEFINITION(Float16)
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
506} // namespace Arcane::MessagePassing
507
508/*---------------------------------------------------------------------------*/
509/*---------------------------------------------------------------------------*/
#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 &copy_array)
Copies the array copy_array into the instance.
Definition Span.h:475
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
Definition Span.h:325
View of an array of elements of type T.
Definition Span.h:633
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.
Definition Messages.cc:335
void mpTestSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Tests if any of the requests in request are finished.
Definition Messages.cc:190
Ref< ISerializeMessageList > mpCreateSerializeMessageListRef(IMessagePassingMng *pm)
Creates a serialization message list.
Definition Messages.cc:279
Ref< ISerializeMessage > mpCreateSendSerializeMessage(IMessagePassingMng *pm, MessageRank destination)
Creates a serialization message for sending.
Definition Messages.cc:347
MessageSourceInfo mpLegacyProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Tests if a message is available.
Definition Messages.cc:230
Ref< IMessagePassingMng > mpSplitCommunicator(IMessagePassingMng *pm, bool keep)
Creates a sub communicator.
Definition Messages.cc:250
Ref< ISerializeMessage > mpCreateReceiveSerializeMessage(IMessagePassingMng *pm, MessageRank source)
Creates a serialization message for receiving.
Definition Messages.cc:353
MessageId mpProbe(IMessagePassingMng *pm, const PointToPointMessageInfo &message)
Tests if a message is available.
Definition Messages.cc:220
C char mpAllReduce(IMessagePassingMng *pm, eReduceType rt, char v)
Ref< IRequestList > mpCreateRequestListRef(IMessagePassingMng *pm)
Creates a list of requests.
Definition Messages.cc:155
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.
Definition Messages.cc:259
Request mpNonBlockingBarrier(IMessagePassingMng *pm)
Performs a non-blocking barrier.
Definition Messages.cc:269
void mpWait(IMessagePassingMng *pm, Request request)
Blocks until the request request is finished.
Definition Messages.cc:173
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
allGather() message for serialization
Definition Messages.cc:319
void mpWaitAll(IMessagePassingMng *pm, ArrayView< Request > requests)
Blocks until the requests in requests are finished.
Definition Messages.cc:164
IMessagePassingMng * mpSplit(IMessagePassingMng *pm, bool keep)
Creates a sub communicator.
Definition Messages.cc:240
ePointToPointMessageType
Point-to-point message type.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Receive message using an ISerializer.
Definition Messages.cc:300
void mpWaitSome(IMessagePassingMng *pm, ArrayView< Request > requests, ArrayView< bool > indexes)
Blocks until at least one of the requests in request is finished.
Definition Messages.cc:181
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Send message using an ISerializer.
Definition Messages.cc:289
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.