Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParallelMngDispatcher.h
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/* ParallelMngDispatcher.h (C) 2000-2026 */
9/* */
10/* Interface du gestionnaire du parallélisme sur un domaine. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLELMNGDISPATCHER_H
13#define ARCANE_PARALLELMNGDISPATCHER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/IParallelMng.h"
19#include "arccore/message_passing/IMessagePassingMng.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
27}
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36template <typename T>
38class ITimeStats;
39namespace MP = ::Arccore::MessagePassing;
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44class ARCANE_CORE_EXPORT ParallelMngDispatcherBuildInfo
45{
46 public:
47
48 ParallelMngDispatcherBuildInfo(Int32 comm_rank, Int32 comm_size);
49 ParallelMngDispatcherBuildInfo(Int32 comm_rank, Int32 comm_size, MP::Communicator communicator);
50
51 public:
52
53 Int32 commRank() const { return m_comm_rank; }
54 Int32 commSize() const { return m_comm_size; }
55 MP::Communicator communicator() const { return m_communicator; }
56 Ref<MP::Dispatchers> dispatchersRef() const { return m_dispatchers_ref; }
57
58 private:
59
60 Int32 m_comm_rank = -1;
61 Int32 m_comm_size = -1;
62 MP::Communicator m_communicator;
63 Ref<MP::Dispatchers> m_dispatchers_ref;
64
65 private:
66
67 void _init();
68};
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
77class ARCANE_CORE_EXPORT ParallelMngDispatcher
79, public IMessagePassingMng
80, public IParallelMng
81{
82 using BaseClass = MP::MessagePassingMng;
83
84 public:
85
86 using ReferenceCounterTagType = ::Arcane::ReferenceCounterTag;
87
88 public:
89
91 class ARCANE_CORE_EXPORT DefaultControlDispatcher
92 : public MP::IControlDispatcher
93 {
94 public:
95
96 explicit DefaultControlDispatcher(ParallelMngDispatcher* pm);
97
98 public:
99
100 void waitAllRequests(ArrayView<Request> requests) override;
101 void waitSomeRequests(ArrayView<Request> requests,
102 ArrayView<bool> indexes, bool is_non_blocking) override;
103 IMessagePassingMng* commSplit(bool keep) override;
104 Ref<IMessagePassingMng> splitCommunicator(bool keep) override;
105 void barrier() override;
106 Request nonBlockingBarrier() override;
107 MessageId probe(const PointToPointMessageInfo& message) override;
108 MP::MessageSourceInfo legacyProbe(const PointToPointMessageInfo& message) override;
110 MP::IProfiler* profiler() const override { return nullptr; }
111 void setProfiler(MP::IProfiler* p) override;
112
113 private:
114
115 ParallelMngDispatcher* m_parallel_mng = nullptr;
116 };
117
120
121 friend class ParallelMngInternal;
122
123 public:
124
126
127 public:
128
129 explicit ParallelMngDispatcher(const ParallelMngDispatcherBuildInfo& bi);
130 ~ParallelMngDispatcher() override;
131
132 public:
133
134 ParallelMngDispatcher(const ParallelMngDispatcher&) = delete;
135 ParallelMngDispatcher(ParallelMngDispatcher&&) = delete;
136 ParallelMngDispatcher& operator=(ParallelMngDispatcher&&) = delete;
137 ParallelMngDispatcher& operator=(const ParallelMngDispatcher&) = delete;
138
139 private:
140
141 void _setArccoreDispatchers();
142
143 public:
144
145 IMessagePassingMng* messagePassingMng() const override;
146 void broadcastString(String& str, Int32 rank) override;
147 void broadcastMemoryBuffer(ByteArray& bytes, Int32 rank) override;
148
150 void allGather(ISerializer* send_serializer, ISerializer* recv_serializer) override;
151
152 private:
153
154 Int32 m_comm_rank = A_NULL_RANK;
155 Int32 m_comm_size = A_NULL_RANK;
156 MP::IDispatchers* m_dispatchers = nullptr;
157 ITimeMetricCollector* m_time_metric_collector = nullptr;
158 MP::Communicator m_communicator;
159
160 public:
161
162#define ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(field, type) \
163 public:\
164 void allGather(ConstArrayView<type> send_buf, ArrayView<type> recv_buf) override; \
165 void gather(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer rank) override; \
166 void allGatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf) override; \
167 void gatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf, Integer rank) override; \
168 void scatterVariable(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer root) override; \
169 type reduce(eReduceType rt, type v) override; \
170 void reduce(eReduceType rt, ArrayView<type> v) override;\
171 void broadcast(ArrayView<type> send_buf, Integer id) override;\
172 void send(ConstArrayView<type> values, Integer id) override;\
173 void recv(ArrayView<type> values, Integer id) override;\
174 Request send(ConstArrayView<type> values, Int32 rank, bool is_blocked) override; \
175 Request send(Span<const type> values, const PointToPointMessageInfo& message) override; \
176 Request recv(ArrayView<type> values, Int32 rank, bool is_blocked) override;\
177 Request receive(Span<type> values, const PointToPointMessageInfo& message) override; \
178 void sendRecv(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer id) override;\
179 void allToAll(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer count) override;\
180 void allToAllVariable(ConstArrayView<type> send_buf, Int32ConstArrayView send_count,\
181 Int32ConstArrayView send_index, ArrayView<type> recv_buf,\
182 Int32ConstArrayView recv_count, Int32ConstArrayView recv_index) override;\
183 type scan(eReduceType rt, type v); \
184 void computeMinMaxSum(type val, type& min_val, type& max_val, type& sum_val, Int32& min_proc, Int32& max_proc) override;\
185 void computeMinMaxSum(ConstArrayView<type> values,\
186 ArrayView<type> min_values,\
187 ArrayView<type> max_values,\
188 ArrayView<type> sum_values,\
189 ArrayView<Int32> min_ranks,\
190 ArrayView<Int32> max_ranks) override;\
191 void scan(eReduceType rt, ArrayView<type> v) override;\
192 protected:\
193 IParallelDispatchT<type>* field;
194
195 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_char, char)
196 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_char, unsigned char)
197 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_signed_char, signed char)
198 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_short, short)
199 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_short, unsigned short)
200 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_int, int)
201 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_int, unsigned int)
202 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long, long)
203 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_long, unsigned long)
204 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long_long, long long)
205 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_long_long, unsigned long long)
206 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_float, float)
207 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_double, double)
208 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long_double, long double)
209 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_apreal, APReal)
210 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real2, Real2)
211 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real3, Real3)
212 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real2x2, Real2x2)
213 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real3x3, Real3x3)
214 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_hpreal, HPReal)
215
216#undef ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE
217
218 public:
219
220 virtual IParallelDispatchT<char>* dispatcher(char*);
221 virtual IParallelDispatchT<signed char>* dispatcher(signed char*);
222 virtual IParallelDispatchT<unsigned char>* dispatcher(unsigned char*);
223 virtual IParallelDispatchT<short>* dispatcher(short*);
224 virtual IParallelDispatchT<unsigned short>* dispatcher(unsigned short*);
225 virtual IParallelDispatchT<int>* dispatcher(int*);
226 virtual IParallelDispatchT<unsigned int>* dispatcher(unsigned int*);
227 virtual IParallelDispatchT<long>* dispatcher(long*);
228 virtual IParallelDispatchT<unsigned long>* dispatcher(unsigned long*);
229 virtual IParallelDispatchT<long long>* dispatcher(long long*);
230 virtual IParallelDispatchT<unsigned long long>* dispatcher(unsigned long long*);
231 virtual IParallelDispatchT<APReal>* dispatcher(APReal*);
232 virtual IParallelDispatchT<float>* dispatcher(float*);
233 virtual IParallelDispatchT<double>* dispatcher(double*);
234 virtual IParallelDispatchT<long double>* dispatcher(long double*);
235 virtual IParallelDispatchT<Real2>* dispatcher(Real2*);
236 virtual IParallelDispatchT<Real3>* dispatcher(Real3*);
237 virtual IParallelDispatchT<Real2x2>* dispatcher(Real2x2*);
238 virtual IParallelDispatchT<Real3x3>* dispatcher(Real3x3*);
239 virtual IParallelDispatchT<HPReal>* dispatcher(HPReal*);
240
241 public:
242
243 template <class CreatorType> void
244 createDispatchers(CreatorType& ct)
245 {
246 m_char = ct.template create<char>();
247 m_signed_char = ct.template create<signed char>();
248 m_unsigned_char = ct.template create<unsigned char>();
249 m_short = ct.template create<short>();
250 m_unsigned_short = ct.template create<unsigned short>();
251 m_int = ct.template create<int>();
252 m_unsigned_int = ct.template create<unsigned int>();
253 m_long = ct.template create<long>();
254 m_unsigned_long = ct.template create<unsigned long>();
255 m_long_long = ct.template create<long long>();
256 m_unsigned_long_long = ct.template create<unsigned long long>();
257
258 m_float = ct.template create<float>();
259 m_double = ct.template create<double>();
260 m_long_double = ct.template create<long double>();
261
262 m_apreal = ct.template create<APReal>();
263 m_real2 = ct.template create<Real2>();
264 m_real3 = ct.template create<Real3>();
265 m_real2x2 = ct.template create<Real2x2>();
266 m_real3x3 = ct.template create<Real3x3>();
267 m_hpreal = ct.template create<HPReal>();
268
269 _setArccoreDispatchers();
270 }
271
272 public:
273
274 // Implémentations de IMessagePassingMng
275 Int32 commSize() const override { return m_comm_size; }
276 Int32 commRank() const override { return m_comm_rank; }
277 MP::IDispatchers* dispatchers() override;
278 ITimeMetricCollector* timeMetricCollector() const override;
279 MP::Communicator communicator() const override { return m_communicator; }
280
281 ITimeStats* timeStats() const override { return m_time_stats; }
282 void setTimeStats(ITimeStats* ts) override;
283
284 UniqueArray<Integer> waitSomeRequests(ArrayView<Request> requests) override;
285 UniqueArray<Integer> testSomeRequests(ArrayView<Request> requests) override;
286 void processMessages(ConstArrayView<ISerializeMessage*> messages) override;
287 void processMessages(ConstArrayView<Ref<ISerializeMessage>> messages) override;
288 ISerializeMessageList* createSerializeMessageList() final;
289 Ref<ISerializeMessageList> createSerializeMessageListRef() final;
290 IParallelMng* createSubParallelMng(Int32ConstArrayView kept_ranks) final;
291 Ref<IParallelMng> createSubParallelMngRef(Int32ConstArrayView kept_ranks) override;
292
293 public:
294
295 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
296
297 protected:
298
299 MP::IMessagePassingMng* _messagePassingMng() const { return m_message_passing_mng; }
300 UniqueArray<Integer> _doWaitRequests(ArrayView<Request> requests, Parallel::eWaitType wait_type);
301 virtual ISerializeMessageList* _createSerializeMessageList() = 0;
302 virtual IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) = 0;
303 virtual bool _isAcceleratorAware() const { return false; }
304 virtual Ref<IParallelMng> _createSubParallelMngRef(Int32 color, Int32 key);
305 virtual Ref<IParallelMng> _createSubParallelMngRef(bool is_kept);
306
307 protected:
308
309 TimeMetricAction _communicationTimeMetricAction() const;
310 void _setControlDispatcher(MP::IControlDispatcher* d);
311 void _setSerializeDispatcher(MP::ISerializeDispatcher* d);
312 void _setCommunicator(MP::Communicator c) { m_communicator = c; }
313
314 private:
315
316 ITimeStats* m_time_stats = nullptr;
317 Ref<MP::Dispatchers> m_mp_dispatchers_ref;
318 MP::IMessagePassingMng* m_message_passing_mng = nullptr;
319 MP::IControlDispatcher* m_control_dispatcher = nullptr;
320 MP::ISerializeDispatcher* m_serialize_dispatcher = nullptr;
321 IParallelMngInternal* m_parallel_mng_internal = nullptr;
322};
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337} // End namespace Arcane
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
342#endif
#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour déclarer qu'une classe utilise un compteur de référence.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro pour définir les méthodes gérant les compteurs de référence.
Emulation de réel en précision arbitraire.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Classe implémentant un nombre réel de haute précision.
Gestion des messages parallèles pour le type Type.
Interface d'un conteneur de 'IParallelMng'.
Partie interne de IParallelMng.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface gérant les statistiques sur l'exécution.
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:43
Interface du gestionnaire des échanges de messages.
Ref< Parallel::IRequestList > createRequestListRef() override
Création d'une liste de requêtes associé à ce gestionnaire.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
void allGather(ISerializer *send_serializer, ISerializer *recv_serializer) override
Redéfinit ici allGather pour éviter de cacher le symbole dans les classes dérivées.
MP::Communicator communicator() const override
Communicateur MPI associé à cette instance.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
IParallelMngInternal * _internalApi() override
API interne à Arcane.
IMessagePassingMng * messagePassingMng() const override
Gestionnaire de message de Arccore associé
Int32 commRank() const override
Rang de cette instance dans le communicateur.
ITimeStats * timeStats() const override
Gestionnaire de statistiques associé (peut être nul).
void broadcastMemoryBuffer(ByteArray &bytes, Int32 rank) override
Effectue un broadcast d'une zone mémoire.
Classe gérant un vecteur réel 2-dimensionnel.
Classe gérant une matrice 2x2 de réels.
Classe gérant un vecteur réel de 3 dimensions.
Classe gérant une matrice réelle 3x3.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:115
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:480
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
Structure servant à tagger les interfaces/classes qui utilisent un compteur de référence interne.