Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParallelMngDispatcher.cc
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.cc (C) 2000-2026 */
9/* */
10/* Redirection de la gestion des messages suivant le type des arguments. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Array.h"
15#include "arcane/utils/HPReal.h"
16#include "arcane/utils/NumericTypes.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/ScopedPtr.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/ValueConvert.h"
22#include "arcane/utils/FatalErrorException.h"
23
24#include "arcane/core/ParallelMngDispatcher.h"
25#include "arcane/core/IParallelDispatch.h"
26#include "arcane/core/Timer.h"
27#include "arcane/core/ITimeStats.h"
28#include "arcane/core/IParallelNonBlockingCollective.h"
29#include "arcane/core/internal/ParallelMngInternal.h"
30
31#include "arcane/accelerator/core/Runner.h"
32#include "arcane/accelerator/core/RunQueueBuildInfo.h"
33
34#include "arccore/message_passing/Dispatchers.h"
36#include "arccore/message_passing/MessagePassingMng.h"
37#include "arccore/message_passing/IControlDispatcher.h"
38#include "arccore/message_passing/ISerializeDispatcher.h"
39#include "arccore/message_passing/PointToPointMessageInfo.h"
40#include "arccore/message_passing/IRequestList.h"
41#include "arccore/message_passing/ISerializeMessageList.h"
42#include "arccore/trace/internal/TimeMetric.h"
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
47namespace Arcane
48{
49using namespace Arccore::MessagePassing;
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
54ParallelMngDispatcherBuildInfo::
55ParallelMngDispatcherBuildInfo(Int32 comm_rank, Int32 comm_size)
56: m_comm_rank(comm_rank)
57, m_comm_size(comm_size)
58{
59 _init();
60}
61
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66ParallelMngDispatcherBuildInfo::
67ParallelMngDispatcherBuildInfo(Int32 comm_rank, Int32 comm_size, MP::Communicator communicator)
68: m_comm_rank(comm_rank)
69, m_comm_size(comm_size)
70, m_communicator(communicator)
71{
72 _init();
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78void ParallelMngDispatcherBuildInfo::
79_init()
80{
81 m_dispatchers_ref = createRef<MP::Dispatchers>();
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87ParallelMngDispatcher::DefaultControlDispatcher::
88DefaultControlDispatcher(ParallelMngDispatcher* pm)
89: m_parallel_mng(pm)
90{
91}
92
93
94void ParallelMngDispatcher::DefaultControlDispatcher::
95waitAllRequests(ArrayView<Request> requests)
96{
97 m_parallel_mng->waitAllRequests(requests);
98}
99
100void ParallelMngDispatcher::DefaultControlDispatcher::
101waitSomeRequests(ArrayView<Request> requests,ArrayView<bool> indexes,
102 bool is_non_blocking)
103{
104 UniqueArray<Integer> done_requests;
105 if (is_non_blocking)
106 done_requests = m_parallel_mng->testSomeRequests(requests);
107 else
108 done_requests = m_parallel_mng->waitSomeRequests(requests);
109 indexes.fill(false);
110 for( int x : done_requests )
111 indexes[x] = true;
112}
113
114IMessagePassingMng* ParallelMngDispatcher::DefaultControlDispatcher::
115commSplit(bool keep)
116{
117 ARCANE_UNUSED(keep);
118 ARCANE_THROW(NotSupportedException, "Use mpSplitCommunicator() instead");
119}
120
121Ref<IMessagePassingMng> ParallelMngDispatcher::DefaultControlDispatcher::
122splitCommunicator(bool keep)
123{
124 Ref<IParallelMng> new_pm = m_parallel_mng->_createSubParallelMngRef(keep);
125 // Le nouveau IParallelMng peut être nul si ce rang n'est pas dans le nouveau communicateur
126 if (new_pm)
127 return makeRef<IMessagePassingMng>(new_pm->messagePassingMng());
128 return {};
129}
130
131void ParallelMngDispatcher::DefaultControlDispatcher::
132barrier()
133{
134 m_parallel_mng->barrier();
135}
136
137Request ParallelMngDispatcher::DefaultControlDispatcher::
138nonBlockingBarrier()
139{
140 return m_parallel_mng->nonBlockingCollective()->barrier();
141}
142
143MessageId ParallelMngDispatcher::DefaultControlDispatcher::
144probe(const PointToPointMessageInfo& message)
145{
146 return m_parallel_mng->probe(message);
147}
148
149MessageSourceInfo ParallelMngDispatcher::DefaultControlDispatcher::
150legacyProbe(const PointToPointMessageInfo& message)
151{
152 return m_parallel_mng->legacyProbe(message);
153}
154
155Ref<Parallel::IRequestList> ParallelMngDispatcher::DefaultControlDispatcher::
156createRequestListRef()
157{
158 return m_parallel_mng->createRequestListRef();
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164void ParallelMngDispatcher::DefaultControlDispatcher::
165setProfiler(MP::IProfiler* p)
166{
167 ARCANE_UNUSED(p);
168 ARCANE_THROW(NotImplementedException,"setProfiler() from MessagePassing::IControlDispatcher");
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
175: public MP::ISerializeDispatcher
176{
177 public:
178
179 explicit SerializeDispatcher(IParallelMng* pm)
180 : m_parallel_mng(pm)
181 {}
182
183 public:
185 {
186 return m_parallel_mng->createSerializeMessageListRef();
187 }
188 Request sendSerializer(const ISerializer* s,const PointToPointMessageInfo& message) override
189 {
190 return m_parallel_mng->sendSerializer(s,message);
191 }
192 Request receiveSerializer(ISerializer* s,const PointToPointMessageInfo& message) override
193 {
194 return m_parallel_mng->receiveSerializer(s,message);
195 }
196 private:
197
198 IParallelMng* m_parallel_mng = nullptr;
199};
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207ParallelMngDispatcher::
208ParallelMngDispatcher(const ParallelMngDispatcherBuildInfo& bi)
209: m_comm_rank(bi.commRank())
210, m_comm_size(bi.commSize())
211, m_communicator(bi.communicator())
212, m_char(nullptr)
213, m_unsigned_char(nullptr)
214, m_signed_char(nullptr)
215, m_short(nullptr)
216, m_unsigned_short(nullptr)
217, m_int(nullptr)
218, m_unsigned_int(nullptr)
219, m_long(nullptr)
220, m_unsigned_long(nullptr)
221, m_long_long(nullptr)
222, m_unsigned_long_long(nullptr)
223, m_float(nullptr)
224, m_double(nullptr)
225, m_long_double(nullptr)
226, m_apreal(nullptr)
227, m_real2(nullptr)
228, m_real3(nullptr)
229, m_real2x2(nullptr)
230, m_real3x3(nullptr)
231, m_hpreal(nullptr)
232, m_time_stats(nullptr)
233, m_mp_dispatchers_ref(bi.dispatchersRef())
234, m_control_dispatcher(new DefaultControlDispatcher(this))
235, m_serialize_dispatcher(new SerializeDispatcher(this))
236, m_parallel_mng_internal(new ParallelMngInternal(this))
237{
238 m_message_passing_mng = this;
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
244ParallelMngDispatcher::
245~ParallelMngDispatcher()
246{
247 m_mp_dispatchers_ref.reset();
248
249 delete m_parallel_mng_internal;
250
251 delete m_serialize_dispatcher;
252 delete m_control_dispatcher;
253 delete m_char;
254 delete m_signed_char;
255 delete m_unsigned_char;
256 delete m_short;
257 delete m_unsigned_short;
258 delete m_int;
259 delete m_unsigned_int;
260 delete m_long;
261 delete m_unsigned_long;
262 delete m_long_long;
263 delete m_unsigned_long_long;
264 delete m_apreal;
265 delete m_float;
266 delete m_double;
267 delete m_long_double;
268 delete m_real2;
269 delete m_real3;
270 delete m_real2x2;
271 delete m_real3x3;
272 delete m_hpreal;
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
278void ParallelMngDispatcher::
279_setControlDispatcher(MP::IControlDispatcher* d)
280{
281 delete m_control_dispatcher;
282 m_control_dispatcher = d;
283}
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
288void ParallelMngDispatcher::
289_setSerializeDispatcher(MP::ISerializeDispatcher* d)
290{
291 delete m_serialize_dispatcher;
292 m_serialize_dispatcher = d;
293}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298void ParallelMngDispatcher::
299_setArccoreDispatchers()
300{
301 m_mp_dispatchers_ref->setDispatcher(m_char->toArccoreDispatcher());
302 m_mp_dispatchers_ref->setDispatcher(m_signed_char->toArccoreDispatcher());
303 m_mp_dispatchers_ref->setDispatcher(m_unsigned_char->toArccoreDispatcher());
304 m_mp_dispatchers_ref->setDispatcher(m_short->toArccoreDispatcher());
305 m_mp_dispatchers_ref->setDispatcher(m_unsigned_short->toArccoreDispatcher());
306 m_mp_dispatchers_ref->setDispatcher(m_int->toArccoreDispatcher());
307 m_mp_dispatchers_ref->setDispatcher(m_unsigned_int->toArccoreDispatcher());
308 m_mp_dispatchers_ref->setDispatcher(m_long->toArccoreDispatcher());
309 m_mp_dispatchers_ref->setDispatcher(m_unsigned_long->toArccoreDispatcher());
310 m_mp_dispatchers_ref->setDispatcher(m_long_long->toArccoreDispatcher());
311 m_mp_dispatchers_ref->setDispatcher(m_unsigned_long_long->toArccoreDispatcher());
312 m_mp_dispatchers_ref->setDispatcher(m_float->toArccoreDispatcher());
313 m_mp_dispatchers_ref->setDispatcher(m_double->toArccoreDispatcher());
314 m_mp_dispatchers_ref->setDispatcher(m_long_double->toArccoreDispatcher());
315
316 ARCANE_CHECK_POINTER(m_control_dispatcher);
317 m_mp_dispatchers_ref->setDispatcher(m_control_dispatcher);
318 ARCANE_CHECK_POINTER(m_serialize_dispatcher);
319 m_mp_dispatchers_ref->setDispatcher(m_serialize_dispatcher);
320}
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
326messagePassingMng() const
327{
328 return m_message_passing_mng;
329}
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333
334MP::IDispatchers* ParallelMngDispatcher::
335dispatchers()
336{
337 return m_mp_dispatchers_ref.get();
338}
339
340/*---------------------------------------------------------------------------*/
341/*---------------------------------------------------------------------------*/
342
345{
346 ITimeMetricCollector* c = nullptr;
347 ITimeStats* s = m_time_stats;
348 if (s)
349 c = s->metricCollector();
350 return c;
351}
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355
358{
359 m_time_stats = ts;
360 if (ts){
362 m_time_metric_collector = c;
363 }
364}
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
369TimeMetricAction ParallelMngDispatcher::
370_communicationTimeMetricAction() const
371{
372 return Timer::phaseAction(timeStats(),TP_Communication);
373}
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
378void ParallelMngDispatcher::
379broadcastString(String& str,Int32 rank)
380{
381 Int64 len_info[1];
382 Int32 my_rank = commRank();
383 Span<const Byte> bytes = str.bytes();
384 if (rank==my_rank){
385 len_info[0] = bytes.size();
386 broadcast(Int64ArrayView(1,len_info),rank);
387 ByteUniqueArray utf8_array(bytes);
388 broadcast(utf8_array,rank);
389 }
390 else{
391 broadcast(Int64ArrayView(1,len_info),rank);
392 ByteUniqueArray utf8_array(len_info[0]);
393 broadcast(utf8_array,rank);
394 str = String::fromUtf8(utf8_array);
395 }
396}
397
398/*---------------------------------------------------------------------------*/
399/*---------------------------------------------------------------------------*/
400
403{
404 Int64 size = 0;
405 if (commRank()==rank){
406 size = bytes.largeSize();
407 }
408 {
409 Int64ArrayView bs(1,&size);
410 broadcast(bs,rank);
411 }
412 if (commRank()!=rank)
413 bytes.resize(size);
414 if (size!=0)
415 broadcast(bytes,rank);
416}
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
420
422allGather(ISerializer* send_serializer, ISerializer* recv_serializer)
423{
424 Timer::Phase tphase(timeStats(), TP_Communication);
425 mpAllGather(_messagePassingMng(), send_serializer, recv_serializer);
426}
427
428/*---------------------------------------------------------------------------*/
429/*---------------------------------------------------------------------------*/
430
433{
434 TimeMetricSentry tphase(Timer::phaseAction(timeStats(),TP_Communication));
436
437 for (ISerializeMessage* m : messages)
438 message_list->addMessage(m);
439
440 message_list->waitMessages(Parallel::WaitAll);
441}
442
443/*---------------------------------------------------------------------------*/
444/*---------------------------------------------------------------------------*/
445
448{
449 TimeMetricSentry tphase(Timer::phaseAction(timeStats(), TP_Communication));
451
452 for (const Ref<ISerializeMessage>& v : messages)
453 message_list->addMessage(v.get());
454
455 message_list->waitMessages(Parallel::WaitAll);
456}
457
458/*---------------------------------------------------------------------------*/
459/*---------------------------------------------------------------------------*/
460
463{
464 return makeRef(_createSerializeMessageList());
465}
466
467/*---------------------------------------------------------------------------*/
468/*---------------------------------------------------------------------------*/
469
472{
473 return _createSerializeMessageList();
474}
475
476/*---------------------------------------------------------------------------*/
477/*---------------------------------------------------------------------------*/
478
481{
482 return _createSubParallelMng(kept_ranks);
483}
484
485/*---------------------------------------------------------------------------*/
486/*---------------------------------------------------------------------------*/
487
490{
491 return makeRef(_createSubParallelMng(kept_ranks));
492}
493
494/*---------------------------------------------------------------------------*/
495/*---------------------------------------------------------------------------*/
496
497Ref<IParallelMng> ParallelMngDispatcher::
498_createSubParallelMngRef([[maybe_unused]] Int32 color, [[maybe_unused]] Int32 key)
499{
500 ARCANE_THROW(NotImplementedException, "Create sub-parallelmng with split semantic");
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
506Ref<IParallelMng> ParallelMngDispatcher::
507_createSubParallelMngRef(bool is_kept)
508{
509 // Cette méthode est générique mais elle est réimplémentée pour MpiParallelMng
510 // afin d'utiliser MPI_Comm_split sans avoir besoin de faire d'allGather.
511 Int32 nb_rank = commSize();
512 UniqueArray<Int8> all_kept(nb_rank);
513 Int8 kept = (is_kept) ? 1 : 0;
514 ArrayView<Int8> my_value(1, &kept);
515 this->allGather(my_value, all_kept);
516 UniqueArray<Int32> kept_ranks;
517 kept_ranks.reserve(nb_rank);
518 for (Int32 i = 0; i < nb_rank; ++i)
519 if (all_kept[i] != 0)
520 kept_ranks.add(i);
521 return createSubParallelMngRef(kept_ranks);
522}
523
524/*---------------------------------------------------------------------------*/
525/*---------------------------------------------------------------------------*/
526
527UniqueArray<Integer> ParallelMngDispatcher::
528_doWaitRequests(ArrayView<Request> requests,eWaitType wait_type)
529{
530 Timer::Phase tphase(timeStats(),TP_Communication);
531 Ref<IRequestList> request_list(createRequestListRef());
532 Integer nb_request = requests.size();
533 request_list->add(requests);
534 request_list->wait(wait_type);
535 // Ne pas oublier de recopier les requêtes, car elles ont pu être modifiées
536 for (Integer i=0; i<nb_request; ++i )
537 requests[i] = request_list->request(i);
538 return request_list->doneRequestIndexes();
539}
540
541/*---------------------------------------------------------------------------*/
542/*---------------------------------------------------------------------------*/
543
546{
547 return _doWaitRequests(requests,Parallel::WaitSome);
548}
549
550/*---------------------------------------------------------------------------*/
551/*---------------------------------------------------------------------------*/
552
558
559/*---------------------------------------------------------------------------*/
560/*---------------------------------------------------------------------------*/
561
562#define ARCANE_PARALLEL_MANAGER_DISPATCH(field,type)\
563void ParallelMngDispatcher::\
564allGather(ConstArrayView<type> send_buf,ArrayView<type> recv_buf)\
565{ \
566 Timer::Phase tphase(timeStats(), TP_Communication); \
567 (field)->allGather(send_buf, recv_buf); \
568 } \
569 void ParallelMngDispatcher:: \
570 gather(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer rank) \
571 { \
572 Timer::Phase tphase(timeStats(), TP_Communication); \
573 (field)->gather(send_buf, recv_buf, rank); \
574 } \
575 void ParallelMngDispatcher:: \
576 allGatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf) \
577 { \
578 Timer::Phase tphase(timeStats(), TP_Communication); \
579 (field)->allGatherVariable(send_buf, recv_buf); \
580 } \
581 void ParallelMngDispatcher:: \
582 gatherVariable(ConstArrayView<type> send_buf, Array<type>& recv_buf, Integer rank) \
583 { \
584 Timer::Phase tphase(timeStats(), TP_Communication); \
585 (field)->gatherVariable(send_buf, recv_buf, rank); \
586 } \
587 void ParallelMngDispatcher:: \
588 scatterVariable(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer root) \
589 { \
590 Timer::Phase tphase(timeStats(), TP_Communication); \
591 (field)->scatterVariable(send_buf, recv_buf, root); \
592 } \
593 type ParallelMngDispatcher:: \
594 reduce(eReduceType rt, type v) \
595 { \
596 Timer::Phase tphase(timeStats(), TP_Communication); \
597 return (field)->allReduce(rt, v); \
598 } \
599 void ParallelMngDispatcher:: \
600 reduce(eReduceType rt, ArrayView<type> v) \
601 { \
602 Timer::Phase tphase(timeStats(), TP_Communication); \
603 (field)->allReduce(rt, v); \
604 } \
605 void ParallelMngDispatcher:: \
606 broadcast(ArrayView<type> send_buf, Integer id) \
607 { \
608 Timer::Phase tphase(timeStats(), TP_Communication); \
609 (field)->broadcast(send_buf, id); \
610 } \
611 void ParallelMngDispatcher:: \
612 send(ConstArrayView<type> values, Integer id) \
613 { \
614 Timer::Phase tphase(timeStats(), TP_Communication); \
615 (field)->send(values, id); \
616 } \
617 void ParallelMngDispatcher:: \
618 recv(ArrayView<type> values, Integer id) \
619 { \
620 Timer::Phase tphase(timeStats(), TP_Communication); \
621 (field)->recv(values, id); \
622 } \
623 Parallel::Request ParallelMngDispatcher:: \
624 send(ConstArrayView<type> values, Integer id, bool is_blocked) \
625 { \
626 Timer::Phase tphase(timeStats(), TP_Communication); \
627 return (field)->send(values, id, is_blocked); \
628 } \
629 Request ParallelMngDispatcher:: \
630 send(Span<const type> values, const PointToPointMessageInfo& message) \
631 { \
632 Timer::Phase tphase(timeStats(), TP_Communication); \
633 return (field)->send(values, message); \
634 } \
635 Parallel::Request ParallelMngDispatcher:: \
636 recv(ArrayView<type> values, Integer id, bool is_blocked) \
637 { \
638 Timer::Phase tphase(timeStats(), TP_Communication); \
639 return (field)->recv(values, id, is_blocked); \
640 } \
641 Request ParallelMngDispatcher:: \
642 receive(Span<type> values, const PointToPointMessageInfo& message) \
643 { \
644 Timer::Phase tphase(timeStats(), TP_Communication); \
645 return (field)->receive(values, message); \
646 } \
647 void ParallelMngDispatcher:: \
648 sendRecv(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer id) \
649 { \
650 Timer::Phase tphase(timeStats(), TP_Communication); \
651 (field)->sendRecv(send_buf, recv_buf, id); \
652 } \
653 void ParallelMngDispatcher:: \
654 allToAll(ConstArrayView<type> send_buf, ArrayView<type> recv_buf, Integer count) \
655 { \
656 Timer::Phase tphase(timeStats(), TP_Communication); \
657 (field)->allToAll(send_buf, recv_buf, count); \
658 } \
659 void ParallelMngDispatcher:: \
660 allToAllVariable(ConstArrayView<type> send_buf, Int32ConstArrayView send_count, \
661 Int32ConstArrayView send_index, ArrayView<type> recv_buf, \
662 Int32ConstArrayView recv_count, Int32ConstArrayView recv_index) \
663 { \
664 Timer::Phase tphase(timeStats(), TP_Communication); \
665 (field)->allToAllVariable(send_buf, send_count, send_index, recv_buf, recv_count, recv_index); \
666 } \
667 type ParallelMngDispatcher:: \
668 scan(eReduceType rt, type v) \
669 { \
670 Timer::Phase tphase(timeStats(), TP_Communication); \
671 return (field)->scan(rt, v); \
672 } \
673 void ParallelMngDispatcher:: \
674 computeMinMaxSum(type val, type& min_val, type& max_val, type& sum_val, Int32& min_proc, Int32& max_proc) \
675 { \
676 Timer::Phase tphase(timeStats(), TP_Communication); \
677 (field)->computeMinMaxSum(val, min_val, max_val, sum_val, min_proc, max_proc); \
678 } \
679 IParallelDispatchT<type>* ParallelMngDispatcher:: \
680 dispatcher(type*) \
681 { \
682 return (field); \
683 } \
684 void ParallelMngDispatcher:: \
685 computeMinMaxSum(ConstArrayView<type> values, \
686 ArrayView<type> min_values, \
687 ArrayView<type> max_values, \
688 ArrayView<type> sum_values, \
689 ArrayView<Int32> min_ranks, \
690 ArrayView<Int32> max_ranks) \
691 { \
692 Timer::Phase tphase(timeStats(), TP_Communication); \
693 (field)->computeMinMaxSum(values, min_values, max_values, sum_values, min_ranks, max_ranks); \
694 }\
695void ParallelMngDispatcher:: \
696 scan(eReduceType rt, ArrayView<type> v) \
697 { \
698 Timer::Phase tphase(timeStats(), TP_Communication); \
699 (field)->scan(rt, v); \
700 }
701
702ARCANE_PARALLEL_MANAGER_DISPATCH(m_char,char)
703ARCANE_PARALLEL_MANAGER_DISPATCH(m_unsigned_char,unsigned char)
704ARCANE_PARALLEL_MANAGER_DISPATCH(m_signed_char,signed char)
705ARCANE_PARALLEL_MANAGER_DISPATCH(m_short,short)
706ARCANE_PARALLEL_MANAGER_DISPATCH(m_unsigned_short,unsigned short)
707ARCANE_PARALLEL_MANAGER_DISPATCH(m_int,int)
708ARCANE_PARALLEL_MANAGER_DISPATCH(m_unsigned_int,unsigned int)
709ARCANE_PARALLEL_MANAGER_DISPATCH(m_long,long)
710ARCANE_PARALLEL_MANAGER_DISPATCH(m_unsigned_long,unsigned long)
711ARCANE_PARALLEL_MANAGER_DISPATCH(m_long_long,long long)
712ARCANE_PARALLEL_MANAGER_DISPATCH(m_unsigned_long_long,unsigned long long)
713ARCANE_PARALLEL_MANAGER_DISPATCH(m_float,float)
714ARCANE_PARALLEL_MANAGER_DISPATCH(m_double,double)
715ARCANE_PARALLEL_MANAGER_DISPATCH(m_long_double,long double)
716ARCANE_PARALLEL_MANAGER_DISPATCH(m_apreal,APReal)
717ARCANE_PARALLEL_MANAGER_DISPATCH(m_real2,Real2)
718ARCANE_PARALLEL_MANAGER_DISPATCH(m_real3,Real3)
719ARCANE_PARALLEL_MANAGER_DISPATCH(m_real2x2,Real2x2)
720ARCANE_PARALLEL_MANAGER_DISPATCH(m_real3x3,Real3x3)
721ARCANE_PARALLEL_MANAGER_DISPATCH(m_hpreal,HPReal)
722
723/*---------------------------------------------------------------------------*/
724/*---------------------------------------------------------------------------*/
725
726} // End namespace Arcane
727
728/*---------------------------------------------------------------------------*/
729/*---------------------------------------------------------------------------*/
730
731namespace Arccore
732{
735}
736
737/*---------------------------------------------------------------------------*/
738/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Liste des fonctions d'échange de message.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour définir les méthodes et types une classe qui utilise un compteur de référence.
Emulation de réel en précision arbitraire.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Classe implémentant un nombre réel de haute précision.
Interface d'un conteneur de 'IParallelMng'.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Ref< Parallel::IRequestList > createRequestListRef()=0
Créé une liste de requêtes pour ce gestionnaire.
Interface gérant les statistiques sur l'exécution.
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:43
virtual ITimeMetricCollector * metricCollector()=0
Interface de collection associée.
Interface du gestionnaire des échanges de messages.
Interface d'un message de sérialisation entre IMessagePassingMng.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message) override
Message d'envoi.
Request receiveSerializer(ISerializer *s, const PointToPointMessageInfo &message) override
Message de réception.
Ref< ISerializeMessageList > createSerializeMessageListRef() override
Créé une liste de messages de sérialisation.
ISerializeMessageList * createSerializeMessageList() final
Créé une liste pour gérer les 'ISerializeMessage'.
void setTimeStats(ITimeStats *ts) override
Positionne le gestionnaire de statistiques.
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.
Ref< IParallelMng > createSubParallelMngRef(Int32ConstArrayView kept_ranks) override
Créé un nouveau gestionnaire de parallélisme pour un sous-ensemble des rangs.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
void processMessages(ConstArrayView< ISerializeMessage * > messages) override
Exécute les opérations des messages messages.
IMessagePassingMng * messagePassingMng() const override
Gestionnaire de message de Arccore associé
Int32 commRank() const override
Rang de cette instance dans le communicateur.
ITimeMetricCollector * timeMetricCollector() const override
Interface pour collecter les temps d'exécution (peut être nul).
IParallelMng * createSubParallelMng(Int32ConstArrayView kept_ranks) final
Créé un nouveau gestionnaire de parallélisme pour un sous-ensemble des rangs.
UniqueArray< Integer > testSomeRequests(ArrayView< Request > requests) override
Test si une des requêtes rvalues est terminée.
ITimeStats * timeStats() const override
Gestionnaire de statistiques associé (peut être nul).
Ref< ISerializeMessageList > createSerializeMessageListRef() final
Créé une liste pour gérer les 'ISerializeMessage'.
UniqueArray< Integer > waitSomeRequests(ArrayView< Request > requests) override
Bloque en attendant qu'une des requêtes rvalues soit terminée.
void broadcastMemoryBuffer(ByteArray &bytes, Int32 rank) override
Effectue un broadcast d'une zone mémoire.
Partie interne de IParallelMng.
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.
void reset()
Positionne l'instance au pointeur nul.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:292
Sentinelle pour collecter les informations temporelles.
Definition TimeMetric.h:101
Positionne la phase de l'action en cours d'exécution.
Definition Timer.h:128
Vecteur 1D de données avec sémantique par valeur (style STL).
@ WaitSome
Attend que tous les messages de la liste soient traités.
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
Message allGather() pour une sérialisation.
Definition Messages.cc:318
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:449
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
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
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:333
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.
Ref< TrueType > createRef(Args &&... args)
Créé une instance de type TrueType avec les arguments Args et retourne une référence dessus.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Arcane::Int8 Int8
Type représentant un entier sur 8 bits.