77class ARCANE_CORE_EXPORT ParallelMngDispatcher
82 using BaseClass = MP::MessagePassingMng;
91 class ARCANE_CORE_EXPORT DefaultControlDispatcher
92 :
public MP::IControlDispatcher
96 explicit DefaultControlDispatcher(ParallelMngDispatcher* pm);
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;
115 ParallelMngDispatcher* m_parallel_mng =
nullptr;
121 friend class ParallelMngInternal;
130 ~ParallelMngDispatcher()
override;
134 ParallelMngDispatcher(
const ParallelMngDispatcher&) =
delete;
135 ParallelMngDispatcher(ParallelMngDispatcher&&) =
delete;
136 ParallelMngDispatcher& operator=(ParallelMngDispatcher&&) =
delete;
137 ParallelMngDispatcher& operator=(
const ParallelMngDispatcher&) =
delete;
141 void _setArccoreDispatchers();
146 void broadcastString(
String& str,
Int32 rank)
override;
154 Int32 m_comm_rank = A_NULL_RANK;
155 Int32 m_comm_size = A_NULL_RANK;
156 MP::IDispatchers* m_dispatchers =
nullptr;
158 MP::Communicator m_communicator;
162#define ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE(field, type) \
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;\
193 IParallelDispatchT<type>* field;
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)
216#undef ARCANE_PARALLEL_MANAGER_DISPATCH_PROTOTYPE
243 template <
class CreatorType>
void
244 createDispatchers(CreatorType& ct)
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>();
258 m_float = ct.template create<float>();
259 m_double = ct.template create<double>();
260 m_long_double = ct.template create<long double>();
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>();
269 _setArccoreDispatchers();
277 MP::IDispatchers* dispatchers()
override;
279 MP::Communicator
communicator()
const override {
return m_communicator; }
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);
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; }
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;