Arcane  v3.14.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestMpi.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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#include <gtest/gtest.h>
8
9#include "arccore/message_passing_mpi/StandaloneMpiMessagePassingMng.h"
10#include "arccore/base/Ref.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"
17
18#include "TestMain.h"
19
20#include <iostream>
21
22using namespace Arccore;
23using namespace Arccore::MessagePassing;
24using namespace Arccore::MessagePassing::Mpi;
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29TEST(MessagePassingMpi, Simple)
30{
32 std::cout << "Rank=" << pm->commRank() << "\n";
33 if (pm->commSize() == 2) {
34 UniqueArray<Int32> send_buf = { 1, 7, -4 };
35 if (pm->commRank() == 0)
36 mpSend(pm.get(), send_buf, 1);
37 else {
39 mpReceive(pm.get(), receive_buf, 0);
40 ASSERT_EQ(receive_buf.size(), 3);
43 ASSERT_EQ(receive_buf[2], -4);
44 }
45 }
47 ASSERT_TRUE(c.isValid());
48 MPI_Comm comm = c;
49 std::cout << "Communicator=" << comm << "\n";
50}
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
56{
57 // Teste uniquement l'appel. Les tests avec des vraies valeurs
58 // sont faits dans Arcane.
60 ASSERT_EQ(pm->commSize(), 3);
61 Int32 my_rank = pm->commRank();
64
65 send_buf[0] = UniqueArray<Int32>{ 1, 12, 4, -3 };
66 send_buf[1] = UniqueArray<Int32>{ 27, 0 };
67 send_buf[2] = UniqueArray<Int32>{ -5, 32, 8, -1, 8932 };
68
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]);
74
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]);
82
83 //UniqueArray<Int32> expected_receive_buf = { 1, 12, 4, -3, 27, 0, -5, 32, 8, -1, 8932 };
84
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]);
88}
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93namespace
94{
95
96template <typename DataType>
98{
99 Int32 nb_rank = pm->commSize();
100 ASSERT_EQ(pm->commSize(), 2);
101 Int32 my_rank = pm->commRank();
102 UniqueArray<DataType> send_buf = { DataType{ -1.2f }, DataType{ 4.5f }, DataType{ 3.2e5f } };
103 UniqueArray<DataType> receive_buf(send_buf.size());
104 if (my_rank == 0) {
105 mpSend(pm, send_buf, 1);
106 }
107 else {
108 mpReceive(pm, receive_buf, 0);
109 ASSERT_EQ(send_buf, receive_buf);
110 }
111
112 // Teste les réductions
113 {
114 UniqueArray<DataType> values(nb_rank);
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];
119 }
120 DataType expected_min = values[0];
121 DataType expected_max = values[nb_rank - 1];
122 DataType my_value(values[my_rank]);
123 DataType sum_result = mpAllReduce(pm, eReduceType::ReduceSum, my_value);
124 std::cout << "Sum=" << sum_result << "\n";
126
127 DataType max_result = mpAllReduce(pm, eReduceType::ReduceMax, my_value);
128 std::cout << "Max=" << max_result << "\n";
130
131 DataType min_result = mpAllReduce(pm, eReduceType::ReduceMin, my_value);
132 std::cout << "Min=" << min_result << "\n";
134 }
135}
136
137} // namespace
138
140{
141 // Teste uniquement l'appel. Les tests avec des vraies valeurs
142 // sont faits dans Arcane.
144 _doTestFloat16<Float16>(pm.get());
145 _doTestFloat16<BFloat16>(pm.get());
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
Definition Assertion.h:126
Liste des fonctions d'échange de message.
Gestion des références à une classe C++.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual Parallel::Communicator communicator() const =0
Communicateur MPI associé à ce gestionnaire.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Type flottant demi-précision.
Communicateur pour l'échange de message.
Interface du gestionnaire des échanges de messages.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Créé un gestionnaire associé au communicateur comm.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
Message allGather() pour une sérialisation.
Definition Messages.cc:296
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
Definition Messages.cc:266
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
Definition Messages.cc:277
Espace de nom de Arccore.
Definition ArcaneTypes.h:24
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.