Arcane  4.2.3.0
User documentation
Loading...
Searching...
No Matches
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 of the parallelism manager on a domain. */
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/*---------------------------------------------------------------------------*/
72/*!
73 * \internal
74 * \brief Redirects the message management of sub-domains
75 * according to the argument type.
76 */
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
90 //! Implementation of Arccore::MessagePassing::IControlDispatcher.
91 class ARCANE_CORE_EXPORT DefaultControlDispatcher
92 : public MP::IControlDispatcher
93 {
94 public:
95
96 explicit DefaultControlDispatcher(IParallelMng* 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 IParallelMng* m_parallel_mng = nullptr;
116 };
117
118 //! Implementation of Arccore::MessagePassing::ISerializeDispatcher.
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
149 //! Redefines allGather here to avoid hiding the symbol in derived classes.
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\
165 void allGather(ConstArrayView<type> send_buf, ArrayView<type> recv_buf) override; \
166 void gather(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer rank) override; \
167 void allGatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf) override; \
168 void gatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf, Integer rank) override; \
169 void scatterVariable(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer root) override; \
170 type reduce(eReduceType rt, type v) override; \
171 void reduce(eReduceType rt, ArrayView<type> v) override; \
172 void broadcast(ArrayView<type> send_buf, Integer id) override; \
173 void send(ConstArrayView<type> values, Integer id) override; \
174 void recv(ArrayView<type> values, Integer id) override; \
175 Request send(ConstArrayView<type> values, Int32 rank, bool is_blocked) override; \
176 Request send(Span<const type> values, const PointToPointMessageInfo& message) override; \
177 Request recv(ArrayView<type> values, Int32 rank, bool is_blocked) override; \
178 Request receive(Span<type> values, const PointToPointMessageInfo& message) override; \
179 void sendRecv(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer id) override; \
180 void allToAll(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer count) override; \
181 void allToAllVariable(ConstArrayView<type> send_buf, Int32ConstArrayView send_count, \
182 Int32ConstArrayView send_index, ArrayView<type> recv_buf, \
183 Int32ConstArrayView recv_count, Int32ConstArrayView recv_index) override; \
184 type scan(eReduceType rt, type v); \
185 void computeMinMaxSum(type val, type& min_val, type& max_val, type& sum_val, Int32& min_proc, Int32& max_proc) override; \
186 void computeMinMaxSum(ConstArrayView<type> values, \
187 ArrayView<type> min_values, \
188 ArrayView<type> max_values, \
189 ArrayView<type> sum_values, \
190 ArrayView<Int32> min_ranks, \
191 ArrayView<Int32> max_ranks) override; \
192 void scan(eReduceType rt, ArrayView<type> v) override; \
193\
194 protected: \
195\
196 IParallelDispatchT<type>* field;
197
198 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_char, char)
199 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_char, unsigned char)
200 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_signed_char, signed char)
201 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_short, short)
202 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_short, unsigned short)
203 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_int, int)
204 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_int, unsigned int)
205 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long, long)
206 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_long, unsigned long)
207 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long_long, long long)
208 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_unsigned_long_long, unsigned long long)
209 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_float, float)
210 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_double, double)
211 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_long_double, long double)
212 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_apreal, APReal)
213 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real2, Real2)
214 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real3, Real3)
215 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real2x2, Real2x2)
216 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_real3x3, Real3x3)
217 ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(m_hpreal, HPReal)
218
219#undef ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE
220
221 public:
222
223 virtual IParallelDispatchT<char>* dispatcher(char*);
224 virtual IParallelDispatchT<signed char>* dispatcher(signed char*);
225 virtual IParallelDispatchT<unsigned char>* dispatcher(unsigned char*);
226 virtual IParallelDispatchT<short>* dispatcher(short*);
227 virtual IParallelDispatchT<unsigned short>* dispatcher(unsigned short*);
228 virtual IParallelDispatchT<int>* dispatcher(int*);
229 virtual IParallelDispatchT<unsigned int>* dispatcher(unsigned int*);
230 virtual IParallelDispatchT<long>* dispatcher(long*);
231 virtual IParallelDispatchT<unsigned long>* dispatcher(unsigned long*);
232 virtual IParallelDispatchT<long long>* dispatcher(long long*);
233 virtual IParallelDispatchT<unsigned long long>* dispatcher(unsigned long long*);
234 virtual IParallelDispatchT<APReal>* dispatcher(APReal*);
235 virtual IParallelDispatchT<float>* dispatcher(float*);
236 virtual IParallelDispatchT<double>* dispatcher(double*);
237 virtual IParallelDispatchT<long double>* dispatcher(long double*);
238 virtual IParallelDispatchT<Real2>* dispatcher(Real2*);
239 virtual IParallelDispatchT<Real3>* dispatcher(Real3*);
240 virtual IParallelDispatchT<Real2x2>* dispatcher(Real2x2*);
241 virtual IParallelDispatchT<Real3x3>* dispatcher(Real3x3*);
242 virtual IParallelDispatchT<HPReal>* dispatcher(HPReal*);
243
244 public:
245
246 template <class CreatorType> void
247 createDispatchers(CreatorType& ct)
248 {
249 m_char = ct.template create<char>();
250 m_signed_char = ct.template create<signed char>();
251 m_unsigned_char = ct.template create<unsigned char>();
252 m_short = ct.template create<short>();
253 m_unsigned_short = ct.template create<unsigned short>();
254 m_int = ct.template create<int>();
255 m_unsigned_int = ct.template create<unsigned int>();
256 m_long = ct.template create<long>();
257 m_unsigned_long = ct.template create<unsigned long>();
258 m_long_long = ct.template create<long long>();
259 m_unsigned_long_long = ct.template create<unsigned long long>();
260
261 m_float = ct.template create<float>();
262 m_double = ct.template create<double>();
263 m_long_double = ct.template create<long double>();
264
265 m_apreal = ct.template create<APReal>();
266 m_real2 = ct.template create<Real2>();
267 m_real3 = ct.template create<Real3>();
268 m_real2x2 = ct.template create<Real2x2>();
269 m_real3x3 = ct.template create<Real3x3>();
270 m_hpreal = ct.template create<HPReal>();
271
272 _setArccoreDispatchers();
273 }
274
275 public:
276
277 // Overrides from IMessagePassingMng
278 Int32 commSize() const override { return m_comm_size; }
279 Int32 commRank() const override { return m_comm_rank; }
280 MP::IDispatchers* dispatchers() override;
281 ITimeMetricCollector* timeMetricCollector() const override;
282 MP::Communicator communicator() const override { return m_communicator; }
283
284 ITimeStats* timeStats() const override { return m_time_stats; }
285 void setTimeStats(ITimeStats* ts) override;
286
287 UniqueArray<Integer> waitSomeRequests(ArrayView<Request> requests) override;
288 UniqueArray<Integer> testSomeRequests(ArrayView<Request> requests) override;
289 void processMessages(ConstArrayView<ISerializeMessage*> messages) override;
290 void processMessages(ConstArrayView<Ref<ISerializeMessage>> messages) override;
291 ISerializeMessageList* createSerializeMessageList() final;
292 Ref<ISerializeMessageList> createSerializeMessageListRef() final;
293 IParallelMng* createSubParallelMng(Int32ConstArrayView kept_ranks) final;
294 Ref<IParallelMng> createSubParallelMngRef(Int32ConstArrayView kept_ranks) override;
295
296 public:
297
298 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
299
300 protected:
301
302 MP::IMessagePassingMng* _messagePassingMng() const { return m_message_passing_mng; }
303 UniqueArray<Integer> _doWaitRequests(ArrayView<Request> requests, Parallel::eWaitType wait_type);
304 virtual ISerializeMessageList* _createSerializeMessageList() = 0;
305 virtual IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) = 0;
306 virtual bool _isAcceleratorAware() const { return false; }
307 virtual Ref<IParallelMng> _createSubParallelMngRef(Int32 color, Int32 key);
308
309 protected:
310
311 TimeMetricAction _communicationTimeMetricAction() const;
312 void _setControlDispatcher(MP::IControlDispatcher* d);
313 void _setSerializeDispatcher(MP::ISerializeDispatcher* d);
314 void _setCommunicator(MP::Communicator c) { m_communicator = c; }
315
316 private:
317
318 ITimeStats* m_time_stats = nullptr;
319 Ref<MP::Dispatchers> m_mp_dispatchers_ref;
320 MP::IMessagePassingMng* m_message_passing_mng = nullptr;
321 MP::IControlDispatcher* m_control_dispatcher = nullptr;
322 MP::ISerializeDispatcher* m_serialize_dispatcher = nullptr;
323 IParallelMngInternal* m_parallel_mng_internal = nullptr;
324};
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
339} // End namespace Arcane
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343
344#endif
#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name)
Macro to declare that a class uses a reference counter.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro to define methods managing counters of references.
Emulation of real number in arbitrary precision.
Modifiable view of an array of type T.
Constant view of an array of type T.
Class implementing a High-Precision real number.
Interface of the parallelism manager for a subdomain.
Interface of the message passing manager.
Ref< Parallel::IRequestList > createRequestListRef() override
Creation of a request list associated with this manager.
void allGather(ISerializer *send_serializer, ISerializer *recv_serializer) override
Redefines allGather here to avoid hiding the symbol in derived classes.
MP::Communicator communicator() const override
MPI communicator associated with this instance.
Int32 commSize() const override
Number of instances in the communicator.
IParallelMngInternal * _internalApi() override
Internal Arcane API.
IMessagePassingMng * messagePassingMng() const override
Associated Arccore message passing manager.
Int32 commRank() const override
Rank of this instance in the communicator.
ITimeStats * timeStats() const override
Associated statistics manager (can be null).
void broadcastMemoryBuffer(ByteArray &bytes, Int32 rank) override
Performs a broadcast of a memory region.
Class managing a 2-dimensional real vector.
Class managing a 2x2 matrix of reals.
Class managing a 3-dimensional real vector.
Class managing a 3x3 real matrix.
Reference to an instance.
Thread-safe implementation of a reference counter.
1D data vector with value semantics (STL style).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Array< Byte > ByteArray
Dynamic one-dimensional array of characters.
Definition UtilsTypes.h:115
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:476
std::int32_t Int32
Signed integer type of 32 bits.
Namespace containing the types and declarations that manage the message-passing parallelism mechanism...
Structure used to tag interfaces/classes that use an internal reference counter.