7#include <gtest/gtest.h>
9#include "arccore/message_passing_mpi/StandaloneMpiMessagePassingMng.h"
11#include "arccore/base/BFloat16.h"
12#include "arccore/base/Float16.h"
13#include "arccore/collections/Array.h"
15#include "arccore/message_passing/Communicator.h"
16#include "arccore/serialize/ISerializer.h"
24using namespace Arccore::MessagePassing::Mpi;
29TEST(MessagePassingMpi, Simple)
32 std::cout <<
"Rank=" << pm->commRank() <<
"\n";
33 if (pm->commSize() == 2) {
35 if (pm->commRank() == 0)
36 mpSend(pm.get(), send_buf, 1);
40 ASSERT_EQ(receive_buf.size(), 3);
41 ASSERT_EQ(receive_buf[0], 1);
42 ASSERT_EQ(receive_buf[1], 7);
43 ASSERT_EQ(receive_buf[2], -4);
49 std::cout <<
"Communicator=" << comm <<
"\n";
55TEST(MessagePassingMpi, SerializeGather)
60 ASSERT_EQ(pm->commSize(), 3);
61 Int32 my_rank = pm->commRank();
69 send_serializer->setMode(ISerializer::ModeReserve);
70 send_serializer->reserveArray(send_buf[my_rank]);
71 send_serializer->allocateBuffer();
73 send_serializer->putArray(send_buf[my_rank]);
76 mpAllGather(pm.get(), send_serializer.get(), receive_serializer.get());
79 receive_serializer->getArray(receive_buf[0]);
80 receive_serializer->getArray(receive_buf[1]);
81 receive_serializer->getArray(receive_buf[2]);
85 ASSERT_EQ(send_buf[0], receive_buf[0]);
86 ASSERT_EQ(send_buf[1], receive_buf[1]);
87 ASSERT_EQ(send_buf[2], receive_buf[2]);
96template <
typename DataType>
109 ASSERT_EQ(send_buf, receive_buf);
115 DataType expected_sum(0.0f);
116 for (Int32 i = 0; i < nb_rank; ++i) {
117 values[i] = (
static_cast<float>(i) - 1.2f) * 3.4f;
118 expected_sum = expected_sum + values[i];
120 DataType expected_min = values[0];
121 DataType expected_max = values[nb_rank - 1];
122 DataType my_value(values[my_rank]);
124 std::cout <<
"Sum=" << sum_result <<
"\n";
125 ASSERT_EQ(expected_sum, sum_result);
128 std::cout <<
"Max=" << max_result <<
"\n";
129 ASSERT_EQ(expected_max, max_result);
132 std::cout <<
"Min=" << min_result <<
"\n";
133 ASSERT_EQ(expected_min, min_result);
139TEST(MessagePassingMpi,
Float16)
144 _doTestFloat16<Float16>(pm.get());
145 _doTestFloat16<BFloat16>(pm.get());
#define ASSERT_TRUE(condition)
Checks that condition is true.
Brief list of message exchange functions.
Management of references to a C++ class.
Integer size() const
Number of elements in the vector.
@ ModePut
The serializer expects reserve().
@ ModeGet
The serializer expects get().
Communicator for message exchange.
Interface of the message passing manager.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual Int32 commSize() const =0
Number of instances in the communicator.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Creates a manager associated with the communicator comm.
Reference to an instance.
1D data vector with value semantics (STL style).
@ ReduceSum
Sum of values.
@ ReduceMin
Minimum of values.
@ ReduceMax
Maximum of values.
Namespace containing the types and declarations that manage the message-passing parallelism mechanism...
C char mpAllReduce(IMessagePassingMng *pm, eReduceType rt, char v)
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *recv_serializer)
allGather() message for serialization
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Receive message using an ISerializer.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Send message using an ISerializer.
Arcane::Float16 Float16
Type 'Float16' (binary16).
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Creates an instance of ISerializer.