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);
78 explicit Impl(MPI_Comm mpi_comm,
bool clean_comm =
false)
79 : m_communicator(mpi_comm)
80 , m_clean_comm(clean_comm)
82 m_trace_mng = Arccore::arccoreCreateDefaultTraceMng();
83 ::MPI_Comm_rank(mpi_comm, &m_comm_rank);
84 ::MPI_Comm_size(mpi_comm, &m_comm_size);
87 MpiLock* mpi_lock =
nullptr;
88 m_adapter =
new MpiAdapter(m_trace_mng.get(), m_stat, mpi_comm, mpi_lock);
91 m_dispatchers->setDeleteDispatchers(
true);
100 std::cerr <<
"ERROR: msg=" << ex <<
"\n";
103 delete m_dispatchers;
107 MPI_Comm_free(&m_communicator);
110 MpiMessagePassingMng::BuildInfo
113 return MpiMessagePassingMng::BuildInfo(m_comm_rank, m_comm_size, m_dispatchers, m_communicator);
119 IStat* m_stat =
nullptr;
121 MpiAdapter* m_adapter =
nullptr;
122 int m_comm_rank = A_NULL_RANK;
123 int m_comm_size = A_NULL_RANK;
124 MPI_Comm m_communicator = MPI_COMM_NULL;
125 bool m_clean_comm =
false;
131StandaloneMpiMessagePassingMng2::
132StandaloneMpiMessagePassingMng2(
Impl* p)
133: MpiMessagePassingMng(p->buildInfo())
141StandaloneMpiMessagePassingMng2::
142~StandaloneMpiMessagePassingMng2()
149 template <
typename DataType>
void
151 MpiAdapter* adapter, MpiDatatype* datatype)
153 auto* x =
new MpiTypeDispatcher<DataType>(mpm, adapter, datatype);
154 x->setDestroyDatatype(
true);
155 dispatchers->setDispatcher(x);
158 template <
typename DataType>
void
162 MPI_Datatype mpi_dt = MpiBuiltIn::datatype(DataType());
163 auto dt =
new MpiDatatype(mpi_dt);
164 _createAndSetCustomDispatcher<DataType>(dispatchers, mpm, adapter, dt);
172MpiMessagePassingMng* StandaloneMpiMessagePassingMng2::
173create(MPI_Comm mpi_comm,
bool clean_comm)
175 Impl* p =
new Impl(mpi_comm, clean_comm);
176 auto mpm =
new StandaloneMpiMessagePassingMng2(p);
177 auto adapter = p->m_adapter;
178 auto dsp = p->m_dispatchers;
180 _createAndSetDispatcher<char>(dsp, mpm, adapter);
181 _createAndSetDispatcher<signed char>(dsp, mpm, adapter);
182 _createAndSetDispatcher<unsigned char>(dsp, mpm, adapter);
183 _createAndSetDispatcher<short>(dsp, mpm, adapter);
184 _createAndSetDispatcher<unsigned short>(dsp, mpm, adapter);
185 _createAndSetDispatcher<int>(dsp, mpm, adapter);
186 _createAndSetDispatcher<unsigned int>(dsp, mpm, adapter);
187 _createAndSetDispatcher<long>(dsp, mpm, adapter);
188 _createAndSetDispatcher<unsigned long>(dsp, mpm, adapter);
189 _createAndSetDispatcher<long long>(dsp, mpm, adapter);
190 _createAndSetDispatcher<unsigned long long>(dsp, mpm, adapter);
191 _createAndSetDispatcher<float>(dsp, mpm, adapter);
192 _createAndSetDispatcher<double>(dsp, mpm, adapter);
193 _createAndSetDispatcher<long double>(dsp, mpm, adapter);
195 dsp->setDispatcher(
new MpiControlDispatcher(adapter, mpm));
196 dsp->setDispatcher(
new MpiSerializeDispatcher(adapter, mpm));
198 MPI_Datatype uint8_datatype = MpiBuiltIn::datatype(uint8_t{});
201 MPI_Datatype mpi_datatype;
202 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
203 MPI_Type_commit(&mpi_datatype);
204 auto* x =
new MpiDatatype(mpi_datatype,
false,
new StdMpiReduceOperator<BFloat16>(
true));
205 _createAndSetCustomDispatcher<BFloat16>(dsp, mpm, adapter, x);
209 MPI_Datatype mpi_datatype;
210 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
211 MPI_Type_commit(&mpi_datatype);
212 auto* x =
new MpiDatatype(mpi_datatype,
false,
new StdMpiReduceOperator<Float16>(
true));
213 _createAndSetCustomDispatcher<Float16>(dsp, mpm, adapter, x);
221Ref<IMessagePassingMng> StandaloneMpiMessagePassingMng2::
222createRef(MPI_Comm mpi_comm,
bool clean_comm)
224 MpiMessagePassingMng* v = create(mpi_comm, clean_comm);
232create(MPI_Comm mpi_comm,
bool clean_comm)
234 return StandaloneMpiMessagePassingMng2::create(mpi_comm, clean_comm);
241createRef(MPI_Comm mpi_comm,
bool clean_comm)
243 return StandaloneMpiMessagePassingMng2::createRef(mpi_comm, clean_comm);
252 return StandaloneMpiMessagePassingMng2::createRef(MPI_COMM_WORLD);
Base class for an exception.
Interface of the dispatcher container.
Interface of the message passing manager.
Statistics on parallelism.
static Ref< IMessagePassingMng > createRef(MPI_Comm comm, bool clean_comm=false)
Creates a manager associated with the communicator comm.
static Ref< IMessagePassingMng > createWorldRef()
Creates a manager associated with the MPI_WORLD_COMM communicator.
static IMessagePassingMng * create(MPI_Comm comm, bool clean_comm=false)
Creates a manager associated with the communicator comm.
Reference to an instance.
Encapsulation of a pointer with a reference counter.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.