Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
StandaloneMpiMessagePassingMng.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/* StandaloneMpiMessagePassingMng.cc (C) 2000-2025 */
9/* */
10/* MPI implementation of the message exchange manager. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/message_passing_mpi/StandaloneMpiMessagePassingMng.h"
15
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"
22
23#include "arccore/message_passing_mpi/MpiDatatype.h"
24#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
25#include "arccore/message_passing_mpi/internal/MpiTypeDispatcher.h"
26#include "arccore/message_passing_mpi/internal/MpiControlDispatcher.h"
27#include "arccore/message_passing_mpi/internal/MpiSerializeDispatcher.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::MessagePassing::Mpi
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39{
40 public:
41
42 explicit Impl(MPI_Comm mpi_comm, bool clean_comm = false)
43 : m_communicator(mpi_comm)
44 , m_clean_comm(clean_comm)
45 {
46 m_trace_mng = Arccore::arccoreCreateDefaultTraceMng();
47 ::MPI_Comm_rank(mpi_comm, &m_comm_rank);
48 ::MPI_Comm_size(mpi_comm, &m_comm_size);
49
50 m_stat = new Stat();
51 MpiLock* mpi_lock = nullptr;
52 m_adapter = new MpiAdapter(m_trace_mng.get(), m_stat, mpi_comm, mpi_lock);
53
54 m_dispatchers = new Dispatchers();
55 m_dispatchers->setDeleteDispatchers(true);
56 }
57
58 ~Impl()
59 {
60 try {
61 m_adapter->destroy();
62 }
63 catch (const Exception& ex) {
64 std::cerr << "ERROR: msg=" << ex << "\n";
65 }
66
67 delete m_dispatchers;
68 delete m_stat;
69
70 if (m_clean_comm)
71 MPI_Comm_free(&m_communicator);
72 }
73
75 buildInfo() const
76 {
77 return MpiMessagePassingMng::BuildInfo(m_comm_rank, m_comm_size, m_dispatchers, m_communicator);
78 }
79
80 public:
81
83 IStat* m_stat = nullptr;
84 Dispatchers* m_dispatchers = nullptr;
85 MpiAdapter* m_adapter = nullptr;
86 int m_comm_rank = A_NULL_RANK;
87 int m_comm_size = A_NULL_RANK;
88 MPI_Comm m_communicator = MPI_COMM_NULL;
89 bool m_clean_comm = false;
90};
91
92/*---------------------------------------------------------------------------*/
93/*---------------------------------------------------------------------------*/
94
95StandaloneMpiMessagePassingMng::
96StandaloneMpiMessagePassingMng(Impl* p)
97: MpiMessagePassingMng(p->buildInfo())
98, m_p(p)
99{
100}
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105StandaloneMpiMessagePassingMng::
106~StandaloneMpiMessagePassingMng()
107{
108 delete m_p;
109}
110
111namespace
112{
113 template <typename DataType> void
114 _createAndSetCustomDispatcher(Dispatchers* dispatchers, IMessagePassingMng* mpm,
115 MpiAdapter* adapter, MpiDatatype* datatype)
116 {
117 auto* x = new MpiTypeDispatcher<DataType>(mpm, adapter, datatype);
118 x->setDestroyDatatype(true);
119 dispatchers->setDispatcher(x);
120 }
121
122 template <typename DataType> void
123 _createAndSetDispatcher(Dispatchers* dispatchers, IMessagePassingMng* mpm,
124 MpiAdapter* adapter)
125 {
126 MPI_Datatype mpi_dt = MpiBuiltIn::datatype(DataType());
127 auto dt = new MpiDatatype(mpi_dt);
128 _createAndSetCustomDispatcher<DataType>(dispatchers, mpm, adapter, dt);
129 }
130
131} // namespace
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
137create(MPI_Comm mpi_comm, bool clean_comm)
138{
139 Impl* p = new Impl(mpi_comm, clean_comm);
140 auto mpm = new StandaloneMpiMessagePassingMng(p);
141 auto adapter = p->m_adapter;
142 auto dsp = p->m_dispatchers;
143
144 _createAndSetDispatcher<char>(dsp, mpm, adapter);
145 _createAndSetDispatcher<signed char>(dsp, mpm, adapter);
146 _createAndSetDispatcher<unsigned char>(dsp, mpm, adapter);
147 _createAndSetDispatcher<short>(dsp, mpm, adapter);
148 _createAndSetDispatcher<unsigned short>(dsp, mpm, adapter);
149 _createAndSetDispatcher<int>(dsp, mpm, adapter);
150 _createAndSetDispatcher<unsigned int>(dsp, mpm, adapter);
151 _createAndSetDispatcher<long>(dsp, mpm, adapter);
152 _createAndSetDispatcher<unsigned long>(dsp, mpm, adapter);
153 _createAndSetDispatcher<long long>(dsp, mpm, adapter);
154 _createAndSetDispatcher<unsigned long long>(dsp, mpm, adapter);
155 _createAndSetDispatcher<float>(dsp, mpm, adapter);
156 _createAndSetDispatcher<double>(dsp, mpm, adapter);
157 _createAndSetDispatcher<long double>(dsp, mpm, adapter);
158
159 dsp->setDispatcher(new MpiControlDispatcher(adapter, mpm));
160 dsp->setDispatcher(new MpiSerializeDispatcher(adapter, mpm));
161
162 MPI_Datatype uint8_datatype = MpiBuiltIn::datatype(uint8_t{});
163 {
164 // BFloat16
165 MPI_Datatype mpi_datatype;
166 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
167 MPI_Type_commit(&mpi_datatype);
168 auto* x = new MpiDatatype(mpi_datatype, false, new StdMpiReduceOperator<BFloat16>(true));
169 _createAndSetCustomDispatcher<BFloat16>(dsp, mpm, adapter, x);
170 }
171 {
172 // Float16
173 MPI_Datatype mpi_datatype;
174 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
175 MPI_Type_commit(&mpi_datatype);
176 auto* x = new MpiDatatype(mpi_datatype, false, new StdMpiReduceOperator<Float16>(true));
177 _createAndSetCustomDispatcher<Float16>(dsp, mpm, adapter, x);
178 }
179 return mpm;
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
186createRef(MPI_Comm mpi_comm, bool clean_comm)
187{
188 MpiMessagePassingMng* v = create(mpi_comm, clean_comm);
190}
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
195} // End namespace Arcane::MessagePassing::Mpi
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
Interface of the dispatcher container.
Definition Dispatchers.h:35
Interface of the message passing manager.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Creates a manager associated with the communicator comm.
static MpiMessagePassingMng * create(MPI_Comm comm, bool clean_comm=false)
Creates a manager associated with the communicator comm.
Statistics manager for parallelism.
Definition Stat.h:74
Reference to an instance.
Encapsulation of a pointer with a reference counter.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.