14#include "arccore/message_passing_mpi/StandaloneMpiMessagePassingMng.h"
16#include "arccore/message_passing/Dispatchers.h"
17#include "arccore/message_passing/Stat.h"
18#include "arccore/trace/ITraceMng.h"
19#include "arccore/base/ReferenceCounter.h"
20#include "arccore/base/BFloat16.h"
21#include "arccore/base/Float16.h"
23#include "arccore/message_passing_mpi/MpiDatatype.h"
24#include "arccore/message_passing_mpi/internal/MpiMessagePassingMng.h"
25#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
26#include "arccore/message_passing_mpi/internal/MpiTypeDispatcher.h"
27#include "arccore/message_passing_mpi/internal/MpiControlDispatcher.h"
28#include "arccore/message_passing_mpi/internal/MpiSerializeDispatcher.h"
33namespace Arcane::MessagePassing::Mpi
39class ARCCORE_MESSAGEPASSINGMPI_EXPORT StandaloneMpiMessagePassingMng2
40:
public MpiMessagePassingMng
43 friend class StandaloneMpiMessagePassingMng;
47 explicit StandaloneMpiMessagePassingMng2(
Impl* p);
51 ~StandaloneMpiMessagePassingMng2()
override;
56 static MpiMessagePassingMng*
create(MPI_Comm comm,
bool clean_comm =
false);
74 static MpiMessagePassingMng* _create(
Impl* p);
83 explicit Impl(MPI_Comm mpi_comm,
bool clean_comm=
false)
84 : m_communicator(mpi_comm), m_clean_comm(clean_comm)
89 explicit Impl(
int* argc,
char** argv[],
int wanted_thread_level)
90 : m_communicator(MPI_COMM_WORLD)
93 int r = MPI_Init_thread(argc, argv, wanted_thread_level, &provided);
95 ARCCORE_FATAL(
"Error when calling MPI_Init_thread err={0}", r);
96 if (provided != wanted_thread_level) {
98 ::MPI_Comm_rank(m_communicator, &rank);
100 std::cerr <<
"WARNING: MPI_Init_thread provided level (" << provided
101 <<
") is not the wanted level (" << wanted_thread_level <<
")\n";
103 m_do_finalize =
true;
110 m_adapter->destroy();
113 std::cerr <<
"ERROR: msg=" << ex <<
"\n";
116 delete m_dispatchers;
120 MPI_Comm_free(&m_communicator);
127 m_trace_mng = Arccore::arccoreCreateDefaultTraceMng();
128 MPI_Comm mpi_comm = m_communicator;
129 ::MPI_Comm_rank(mpi_comm, &m_comm_rank);
130 ::MPI_Comm_size(mpi_comm, &m_comm_size);
133 m_adapter =
new MpiAdapter(m_trace_mng.get(), m_stat, mpi_comm, mpi_lock);
136 m_dispatchers->setDeleteDispatchers(
true);
148 IStat* m_stat =
nullptr;
151 int m_comm_rank = A_NULL_RANK;
152 int m_comm_size = A_NULL_RANK;
153 MPI_Comm m_communicator = MPI_COMM_NULL;
154 bool m_clean_comm =
false;
155 bool m_do_finalize =
false;
161StandaloneMpiMessagePassingMng2::
162StandaloneMpiMessagePassingMng2(
Impl* p)
163: MpiMessagePassingMng(p->buildInfo())
166 setTraceMng(p->m_trace_mng.get());
172StandaloneMpiMessagePassingMng2::
173~StandaloneMpiMessagePassingMng2()
180 template <
typename DataType>
void
185 x->setDestroyDatatype(
true);
186 dispatchers->setDispatcher(x);
189 template <
typename DataType>
void
193 MPI_Datatype mpi_dt = MpiBuiltIn::datatype(DataType());
195 _createAndSetCustomDispatcher<DataType>(dispatchers, mpm, adapter, dt);
203MpiMessagePassingMng* StandaloneMpiMessagePassingMng2::
206 auto mpm =
new StandaloneMpiMessagePassingMng2(p);
207 auto adapter = p->m_adapter;
208 auto dsp = p->m_dispatchers;
210 _createAndSetDispatcher<char>(dsp, mpm, adapter);
211 _createAndSetDispatcher<signed char>(dsp, mpm, adapter);
212 _createAndSetDispatcher<unsigned char>(dsp, mpm, adapter);
213 _createAndSetDispatcher<short>(dsp, mpm, adapter);
214 _createAndSetDispatcher<unsigned short>(dsp, mpm, adapter);
215 _createAndSetDispatcher<int>(dsp, mpm, adapter);
216 _createAndSetDispatcher<unsigned int>(dsp, mpm, adapter);
217 _createAndSetDispatcher<long>(dsp, mpm, adapter);
218 _createAndSetDispatcher<unsigned long>(dsp, mpm, adapter);
219 _createAndSetDispatcher<long long>(dsp, mpm, adapter);
220 _createAndSetDispatcher<unsigned long long>(dsp, mpm, adapter);
221 _createAndSetDispatcher<float>(dsp, mpm, adapter);
222 _createAndSetDispatcher<double>(dsp, mpm, adapter);
223 _createAndSetDispatcher<long double>(dsp, mpm, adapter);
225 dsp->setDispatcher(
new MpiControlDispatcher(adapter, mpm));
226 dsp->setDispatcher(
new MpiSerializeDispatcher(adapter, mpm));
228 MPI_Datatype uint8_datatype = MpiBuiltIn::datatype(uint8_t{});
231 MPI_Datatype mpi_datatype;
232 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
233 MPI_Type_commit(&mpi_datatype);
234 auto* x =
new MpiDatatype(mpi_datatype,
false,
new StdMpiReduceOperator<BFloat16>(
true));
235 _createAndSetCustomDispatcher<BFloat16>(dsp, mpm, adapter, x);
239 MPI_Datatype mpi_datatype;
240 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
241 MPI_Type_commit(&mpi_datatype);
242 auto* x =
new MpiDatatype(mpi_datatype,
false,
new StdMpiReduceOperator<Float16>(
true));
243 _createAndSetCustomDispatcher<Float16>(dsp, mpm, adapter, x);
252create(MPI_Comm mpi_comm,
bool clean_comm)
254 Impl* p =
new Impl(mpi_comm, clean_comm);
262createRef(MPI_Comm mpi_comm,
bool clean_comm)
264 MpiMessagePassingMng* v =
create(mpi_comm, clean_comm);
272createAndInitializeMPI(
int* argc,
char** argv[],
int wanted_thread_level)
274 Impl* p =
new Impl(argc, argv, wanted_thread_level);
286create(MPI_Comm mpi_comm,
bool clean_comm)
295createRef(MPI_Comm mpi_comm,
bool clean_comm)
315 return StandaloneMpiMessagePassingMng2::createAndInitializeMPI(argc, argv, wanted_thread_level);
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe de base d'une exception.
Interface du conteneur des dispatchers.
Interface du gestionnaire des échanges de messages.
Statistiques sur le parallélisme.
Encapsulation d'un MPI_Datatype.
Verrou pour les appels MPI.
Implémentation MPI du gestionnaire des échanges de messages.
static MpiMessagePassingMng * create(MPI_Comm comm, bool clean_comm=false)
Crée un gestionnaire associé au communicateur comm.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Crée un gestionnaire associé au communicateur comm.
static Ref< IMessagePassingMng > createAndInitializeMPI(int *argc, char **argv[], int wanted_thread_level)
Initialise MPI et créé un gestionnaire associé au communicateur MPI_WORLD_COMM.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Créé un gestionnaire associé au communicateur comm.
static Ref< IMessagePassingMng > createWorldRef()
Créé un gestionnaire associé au communicateur MPI_WORLD_COMM.
static IMessagePassingMng * create(MPI_Comm comm, bool clean_comm=false)
Créé un gestionnaire associé au communicateur comm.
Gestionnaire de statistiques sur le parallélisme.
Référence à une instance.
Encapsulation d'un pointeur avec compteur de référence.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.