Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
StandaloneMpiMessagePassingMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Implémentation MPI du gestionnaire des échanges de messages. */
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 explicit Impl(MPI_Comm mpi_comm, bool clean_comm=false)
42 : m_communicator(mpi_comm), m_clean_comm(clean_comm)
43 {
44 m_trace_mng = Arccore::arccoreCreateDefaultTraceMng();
45 ::MPI_Comm_rank(mpi_comm, &m_comm_rank);
46 ::MPI_Comm_size(mpi_comm, &m_comm_size);
47
48 m_stat = new Stat();
49 MpiLock* mpi_lock = nullptr;
50 m_adapter = new MpiAdapter(m_trace_mng.get(), m_stat, mpi_comm, mpi_lock);
51
52 m_dispatchers = new Dispatchers();
53 m_dispatchers->setDeleteDispatchers(true);
54 }
55
56 ~Impl()
57 {
58 try {
59 m_adapter->destroy();
60 }
61 catch (const Exception& ex) {
62 std::cerr << "ERROR: msg=" << ex << "\n";
63 }
64
65 delete m_dispatchers;
66 delete m_stat;
67
68 if (m_clean_comm)
69 MPI_Comm_free(&m_communicator);
70 }
71
73 buildInfo() const
74 {
75 return MpiMessagePassingMng::BuildInfo(m_comm_rank, m_comm_size, m_dispatchers, m_communicator);
76 }
77
78 public:
79
81 IStat* m_stat = nullptr;
82 Dispatchers* m_dispatchers = nullptr;
83 MpiAdapter* m_adapter = nullptr;
84 int m_comm_rank = A_NULL_RANK;
85 int m_comm_size = A_NULL_RANK;
86 MPI_Comm m_communicator = MPI_COMM_NULL;
87 bool m_clean_comm = false;
88};
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93StandaloneMpiMessagePassingMng::
94StandaloneMpiMessagePassingMng(Impl* p)
95: MpiMessagePassingMng(p->buildInfo())
96, m_p(p)
97{
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103StandaloneMpiMessagePassingMng::
104~StandaloneMpiMessagePassingMng()
105{
106 delete m_p;
107}
108
109namespace
110{
111 template <typename DataType> void
112 _createAndSetCustomDispatcher(Dispatchers* dispatchers, IMessagePassingMng* mpm,
113 MpiAdapter* adapter, MpiDatatype* datatype)
114 {
115 auto* x = new MpiTypeDispatcher<DataType>(mpm, adapter, datatype);
116 x->setDestroyDatatype(true);
117 dispatchers->setDispatcher(x);
118 }
119
120 template <typename DataType> void
121 _createAndSetDispatcher(Dispatchers* dispatchers, IMessagePassingMng* mpm,
122 MpiAdapter* adapter)
123 {
124 MPI_Datatype mpi_dt = MpiBuiltIn::datatype(DataType());
125 auto dt = new MpiDatatype(mpi_dt);
126 _createAndSetCustomDispatcher<DataType>(dispatchers, mpm, adapter, dt);
127 }
128
129} // namespace
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
135create(MPI_Comm mpi_comm, bool clean_comm)
136{
137 Impl* p = new Impl(mpi_comm, clean_comm);
138 auto mpm = new StandaloneMpiMessagePassingMng(p);
139 auto adapter = p->m_adapter;
140 auto dsp = p->m_dispatchers;
141
142 _createAndSetDispatcher<char>(dsp, mpm, adapter);
143 _createAndSetDispatcher<signed char>(dsp, mpm, adapter);
144 _createAndSetDispatcher<unsigned char>(dsp, mpm, adapter);
145 _createAndSetDispatcher<short>(dsp, mpm, adapter);
146 _createAndSetDispatcher<unsigned short>(dsp, mpm, adapter);
147 _createAndSetDispatcher<int>(dsp, mpm, adapter);
148 _createAndSetDispatcher<unsigned int>(dsp, mpm, adapter);
149 _createAndSetDispatcher<long>(dsp, mpm, adapter);
150 _createAndSetDispatcher<unsigned long>(dsp, mpm, adapter);
151 _createAndSetDispatcher<long long>(dsp, mpm, adapter);
152 _createAndSetDispatcher<unsigned long long>(dsp, mpm, adapter);
153 _createAndSetDispatcher<float>(dsp, mpm, adapter);
154 _createAndSetDispatcher<double>(dsp, mpm, adapter);
155 _createAndSetDispatcher<long double>(dsp, mpm, adapter);
156
157 dsp->setDispatcher(new MpiControlDispatcher(adapter, mpm));
158 dsp->setDispatcher(new MpiSerializeDispatcher(adapter, mpm));
159
160 MPI_Datatype uint8_datatype = MpiBuiltIn::datatype(uint8_t{});
161 {
162 // BFloat16
163 MPI_Datatype mpi_datatype;
164 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
165 MPI_Type_commit(&mpi_datatype);
166 auto* x = new MpiDatatype(mpi_datatype, false, new StdMpiReduceOperator<BFloat16>(true));
167 _createAndSetCustomDispatcher<BFloat16>(dsp, mpm, adapter, x);
168 }
169 {
170 // Float16
171 MPI_Datatype mpi_datatype;
172 MPI_Type_contiguous(2, uint8_datatype, &mpi_datatype);
173 MPI_Type_commit(&mpi_datatype);
174 auto* x = new MpiDatatype(mpi_datatype, false, new StdMpiReduceOperator<Float16>(true));
175 _createAndSetCustomDispatcher<Float16>(dsp, mpm, adapter, x);
176 }
177 return mpm;
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
184createRef(MPI_Comm mpi_comm, bool clean_comm)
185{
186 MpiMessagePassingMng* v = create(mpi_comm, clean_comm);
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193} // End namespace Arcane::MessagePassing::Mpi
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
Classe de base d'une exception.
Interface du conteneur des dispatchers.
Definition Dispatchers.h:34
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.
static MpiMessagePassingMng * create(MPI_Comm comm, bool clean_comm=false)
Créé un gestionnaire associé au communicateur comm.
Opérateurs de réduction pour les types classiques.
Definition MpiDatatype.h:58
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.