Arcane  v3.15.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SequentialParallelMng.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/* SequentialParallelMng.cc (C) 2000-2025 */
9/* */
10/* Gestion du parallélisme dans le cas séquentiel. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/base/ReferenceCounter.h"
15
16#include "arccore/message_passing/PointToPointMessageInfo.h"
17
18#include "arcane/utils/Collection.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/Real2.h"
22#include "arcane/utils/Real2x2.h"
23#include "arcane/utils/Real3.h"
24#include "arcane/utils/Real3x3.h"
25#include "arcane/utils/HPReal.h"
26#include "arcane/utils/NullThreadMng.h"
27#include "arcane/utils/ArgumentException.h"
28
29#include "arcane/core/IIOMng.h"
30#include "arcane/core/ISubDomain.h"
31#include "arcane/core/IApplication.h"
32#include "arcane/core/IParallelDispatch.h"
33#include "arcane/core/ParallelMngDispatcher.h"
34#include "arcane/core/ItemGroup.h"
35#include "arcane/core/IMesh.h"
36#include "arcane/core/IItemFamily.h"
37#include "arcane/core/MeshVariable.h"
38#include "arcane/core/Timer.h"
39#include "arcane/core/FactoryService.h"
40#include "arcane/core/AbstractService.h"
41#include "arcane/core/SerializeMessage.h"
42
43#include "arcane/parallel/IStat.h"
44
45#include "arcane/impl/TimerMng.h"
46#include "arcane/impl/GetVariablesValuesParallelOperation.h"
47#include "arcane/impl/ParallelExchanger.h"
48#include "arcane/impl/ParallelTopology.h"
49#include "arcane/impl/ParallelReplication.h"
50#include "arcane/impl/SequentialParallelSuperMng.h"
51#include "arcane/impl/SequentialParallelMng.h"
52#include "arcane/impl/ParallelMngUtilsFactoryBase.h"
53#include "arcane/impl/internal/VariableSynchronizer.h"
54
55#include "arccore/message_passing/RequestListBase.h"
56#include "arccore/message_passing/SerializeMessageList.h"
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
61namespace Arcane
62{
64using IRequestList = Parallel::IRequestList;
65using namespace Arcane::MessagePassing;
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
70extern "C++" IVariableSynchronizer*
71createNullVariableSynchronizer(IParallelMng* pm,const ItemGroup& group);
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
77: public RequestListBase
78{
79 public:
81 {
82 ARCANE_UNUSED(wait_mode);
83 }
84};
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
91template<class Type>
93: public TraceAccessor
94, public IParallelDispatchT<Type>
95, public ITypeDispatcher<Type>
96{
97 public:
100 public:
102 : TraceAccessor(tm) {}
103 void finalize() override {}
104 public:
105 void broadcast(ArrayView<Type> send_buf,Int32 rank) override
106 {
107 ARCANE_UNUSED(send_buf);
108 ARCANE_UNUSED(rank);
109 }
110 void broadcast(Span<Type> send_buf,Int32 rank) override
111 {
112 ARCANE_UNUSED(send_buf);
113 ARCANE_UNUSED(rank);
114 }
115 void allGather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf) override
116 {
117 recv_buf.copy(send_buf);
118 }
119 void allGather(Span<const Type> send_buf,Span<Type> recv_buf) override
120 {
121 recv_buf.copy(send_buf);
122 }
123 void gather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 rank) override
124 {
125 ARCANE_UNUSED(rank);
126 recv_buf.copy(send_buf);
127 }
128 void gather(Span<const Type> send_buf,Span<Type> recv_buf,Int32 rank) override
129 {
130 ARCANE_UNUSED(rank);
131 recv_buf.copy(send_buf);
132 }
133 void scatterVariable(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 root) override
134 {
135 ARCANE_UNUSED(root);
136 recv_buf.copy(send_buf);
137 }
138 void scatterVariable(Span<const Type> send_buf,Span<Type> recv_buf,Int32 root) override
139 {
140 ARCANE_UNUSED(root);
141 recv_buf.copy(send_buf);
142 }
143 void allGatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf) override
144 {
145 gatherVariable(send_buf,recv_buf,0);
146 }
147 void allGatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf) override
148 {
149 gatherVariable(send_buf,recv_buf,0);
150 }
151 void gatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
152 {
153 ARCANE_UNUSED(rank);
154 recv_buf.resize(send_buf.size());
155 ArrayView<Type> av(recv_buf);
156 av.copy(send_buf);
157 }
158 void gatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
159 {
160 ARCANE_UNUSED(rank);
161 recv_buf.resize(send_buf.size());
162 Span<Type> av(recv_buf.span());
163 av.copy(send_buf);
164 }
165 void allToAll(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Integer count) override
166 {
167 ARCANE_UNUSED(count);
168 recv_buf.copy(send_buf);
169 }
170 void allToAll(Span<const Type> send_buf,Span<Type> recv_buf,Int32 count) override
171 {
172 ARCANE_UNUSED(count);
173 recv_buf.copy(send_buf);
174 }
175 void allToAllVariable(ConstArrayView<Type> send_buf,
176 Int32ConstArrayView send_count,
177 Int32ConstArrayView send_index,
178 ArrayView<Type> recv_buf,
179 Int32ConstArrayView recv_count,
180 Int32ConstArrayView recv_index) override
181 {
182 ARCANE_UNUSED(send_count);
183 ARCANE_UNUSED(recv_count);
184 ARCANE_UNUSED(send_index);
185 ARCANE_UNUSED(recv_index);
186 recv_buf.copy(send_buf);
187 }
188 void allToAllVariable(Span<const Type> send_buf,
189 ConstArrayView<Int32> send_count,
190 ConstArrayView<Int32> send_index,
191 Span<Type> recv_buf,
192 ConstArrayView<Int32> recv_count,
193 ConstArrayView<Int32> recv_index) override
194 {
195 ARCANE_UNUSED(send_count);
196 ARCANE_UNUSED(recv_count);
197 ARCANE_UNUSED(send_index);
198 ARCANE_UNUSED(recv_index);
199 recv_buf.copy(send_buf);
200 }
201 Request send(ConstArrayView<Type> send_buffer,Int32 rank,bool is_blocked) override
202 {
203 return send(Span<const Type>(send_buffer),rank,is_blocked);
204 }
205 Request send(Span<const Type> send_buffer,Int32 rank,bool is_blocked) override
206 {
207 ARCANE_UNUSED(send_buffer);
208 ARCANE_UNUSED(rank);
209 if (is_blocked)
210 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
211 return Request();
212 }
213 Request send(Span<const Type> send_buffer,const PointToPointMessageInfo& message) override
214 {
215 ARCANE_UNUSED(send_buffer);
216 if (message.isBlocking())
217 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
218 return Request();
219 }
220 Request recv(ArrayView<Type> recv_buffer,Int32 rank,bool is_blocked) override
221 {
222 return receive(Span<Type>(recv_buffer),rank,is_blocked);
223 }
224 void send(ConstArrayView<Type> send_buffer,Int32 rank) override
225 {
226 ARCANE_UNUSED(send_buffer);
227 ARCANE_UNUSED(rank);
228 throw NotSupportedException(A_FUNCINFO,"send is not allowed in sequential");
229 }
230 void recv(ArrayView<Type> recv_buffer,Int32 rank) override
231 {
232 ARCANE_UNUSED(recv_buffer);
233 ARCANE_UNUSED(rank);
234 throw NotSupportedException(A_FUNCINFO,"recv is not allowed in sequential");
235 }
236 Request receive(Span<Type> recv_buffer,Int32 rank,bool is_blocked) override
237 {
238 ARCANE_UNUSED(recv_buffer);
239 ARCANE_UNUSED(rank);
240 if (is_blocked)
241 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
242 return Request();
243 }
244 Request receive(Span<Type> recv_buffer,const PointToPointMessageInfo& message) override
245 {
246 ARCANE_UNUSED(recv_buffer);
247 if (message.isBlocking())
248 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
249 return Request();
250 }
251 void sendRecv(ConstArrayView<Type> send_buffer,ArrayView<Type> recv_buffer,Int32 rank) override
252 {
253 ARCANE_UNUSED(rank);
255 }
256 Type allReduce(eReduceType op,Type v) override
257 {
258 ARCANE_UNUSED(op);
259 return v;
260 }
261 void allReduce(eReduceType op,ArrayView<Type> send_buf) override
262 {
263 ARCANE_UNUSED(op);
264 ARCANE_UNUSED(send_buf);
265 }
266 void allReduce(eReduceType op,Span<Type> send_buf) override
267 {
268 ARCANE_UNUSED(op);
269 ARCANE_UNUSED(send_buf);
270 }
271 Request nonBlockingAllReduce(eReduceType op,Span<const Type> send_buf,Span<Type> recv_buf) override
272 {
273 ARCANE_UNUSED(op);
274 ARCANE_UNUSED(send_buf);
275 ARCANE_UNUSED(recv_buf);
276 return Request();
277 }
278 Request nonBlockingAllGather(Span<const Type> send_buf, Span<Type> recv_buf) override
279 {
280 recv_buf.copy(send_buf);
281 return Request();
282 }
283 Request nonBlockingBroadcast(Span<Type> send_buf, Int32 rank) override
284 {
285 ARCANE_UNUSED(send_buf);
286 ARCANE_UNUSED(rank);
287 return Request();
288 }
289 Request nonBlockingGather(Span<const Type> send_buf, Span<Type> recv_buf, Int32 rank) override
290 {
291 ARCANE_UNUSED(rank);
292 recv_buf.copy(send_buf);
293 return Request();
294 }
295 Request nonBlockingAllToAll(Span<const Type> send_buf, Span<Type> recv_buf, Int32 count) override
296 {
297 ARCANE_UNUSED(count);
298 recv_buf.copy(send_buf);
299 return Request();
300 }
301 Request nonBlockingAllToAllVariable(Span<const Type> send_buf, ConstArrayView<Int32> send_count,
302 ConstArrayView<Int32> send_index, Span<Type> recv_buf,
303 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) override
304 {
305 ARCANE_UNUSED(send_count);
306 ARCANE_UNUSED(recv_count);
307 ARCANE_UNUSED(send_index);
308 ARCANE_UNUSED(recv_index);
309 recv_buf.copy(send_buf);
310 return Request();
311 }
312 Type scan(eReduceType op,Type v) override
313 {
314 ARCANE_UNUSED(op);
315 return v;
316 }
317 void scan(eReduceType op,ArrayView<Type> send_buf) override
318 {
319 ARCANE_UNUSED(op);
320 ARCANE_UNUSED(send_buf);
321 }
322 void computeMinMaxSum(Type val,Type& min_val,Type& max_val,Type& sum_val,
323 Int32& min_rank,
324 Int32& max_rank) override
325 {
327 min_rank = max_rank = 0;
328 }
329 void computeMinMaxSum(ConstArrayView<Type> values,
335 {
336 const Integer n = values.size();
337 for(Integer i=0;i<n;++i) {
338 min_values[i] = max_values[i] = sum_values[i] = values[i];
339 min_ranks[i] = max_ranks[i] = 0;
340 }
341 }
342 ITypeDispatcher<Type>* toArccoreDispatcher() override { return this; }
343};
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347
350{
351 public:
357 {
358 return makeRef(createNullVariableSynchronizer(pm,family->allItems()));
359 }
361 {
362 return makeRef(createNullVariableSynchronizer(pm,group));
363 }
364};
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
376{
377 private:
378 // Construit un gestionnaire séquentiel.
380 public:
382
383 bool isParallel() const override { return false; }
384 Int32 commRank() const override { return 0; }
385 Int32 commSize() const override { return 1; }
386 void* getMPICommunicator() override { return m_communicator.communicatorAddress(); }
387 Parallel::Communicator communicator() const override { return m_communicator; }
388 bool isThreadImplementation() const override { return false; }
389 bool isHybridImplementation() const override { return false; }
390 void setBaseObject(IBase* m);
391 ITraceMng* traceMng() const override { return m_trace.get(); }
392 IThreadMng* threadMng() const override { return m_thread_mng; }
393 ITimerMng* timerMng() const override { return m_timer_mng; }
394 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
395 IIOMng* ioMng() const override { return m_io_mng; }
396
397 void initialize() override ;
398 bool isMasterIO() const override { return true; }
399 Int32 masterIORank() const override { return 0; }
400
401 public:
402
407 void sendSerializer(ISerializer* values,Int32 rank) override
408 {
409 ARCANE_UNUSED(values);
410 ARCANE_UNUSED(rank);
411 }
412 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override
413 {
414 ARCANE_UNUSED(values);
415 ARCANE_UNUSED(rank);
416 ARCANE_UNUSED(bytes);
417 return Parallel::Request();
418 }
420 {
421 ARCANE_UNUSED(rank);
422 return new SerializeMessage(0,0,ISerializeMessage::MT_Send);
423 }
424 void recvSerializer(ISerializer* values,Int32 rank) override
425 {
426 ARCANE_UNUSED(values);
427 ARCANE_UNUSED(rank);
428 }
430 {
431 ARCANE_UNUSED(rank);
432 return new SerializeMessage(0,0,ISerializeMessage::MT_Recv);
433 }
434
435 void broadcastString(String& str,Int32 rank) override
436 {
437 ARCANE_UNUSED(str);
438 ARCANE_UNUSED(rank);
439 }
440 void broadcastMemoryBuffer(ByteArray& bytes,Int32 rank) override
441 {
442 ARCANE_UNUSED(bytes);
443 ARCANE_UNUSED(rank);
444 }
445 void broadcastSerializer(ISerializer* values,Int32 rank) override
446 {
447 ARCANE_UNUSED(values);
448 ARCANE_UNUSED(rank);
449 }
450 MessageId probe(const PointToPointMessageInfo& message) override
451 {
452 ARCANE_UNUSED(message);
453 return MessageId();
454 }
456 {
457 ARCANE_UNUSED(message);
458 return MessageSourceInfo();
459 }
460 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override
461 {
462 ARCANE_UNUSED(values);
463 ARCANE_UNUSED(message);
464 return Parallel::Request();
465 }
466 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override
467 {
468 ARCANE_UNUSED(values);
469 ARCANE_UNUSED(message);
470 return Parallel::Request();
471 }
472
474 {
475 ARCANE_UNUSED(messages);
476 }
478 {
479 ARCANE_UNUSED(requests);
480 }
481
482 void printStats() override {}
483 void barrier() override {}
484
485 IParallelMng* sequentialParallelMng() override { return this; }
486 Ref<IParallelMng> sequentialParallelMngRef() override { return makeRef<IParallelMng>(this); }
487
488 void waitAllRequests(ArrayView<Request> requests) override
489 {
490 ARCANE_UNUSED(requests);
491 }
492
493 // Les requetes sont forcement deja satisfaites.
495 {
496 ARCANE_UNUSED(requests);
497 return UniqueArray<Integer>();
498 }
500 {
501 return waitSomeRequests(requests);
502 }
503
504 ISerializeMessageList* _createSerializeMessageList() override
505 {
507 }
508 Real reduceRank(eReduceType rt,Real v,Int32* rank)
509 {
510 Real rv = reduce(rt,v);
511 if (rank)
512 *rank = 0;
513 return rv;
514 }
524 {
525 return new ParallelExchanger(this);
526 }
528 {
529 return createNullVariableSynchronizer(this,family->allItems());
530 }
532 {
533 return createNullVariableSynchronizer(this,group);
534 }
536 {
538 t->initialize();
539 return t;
540 }
541
543 {
544 return m_replication;
545 }
546
548 {
549 delete m_replication;
550 m_replication = v;
551 }
552
554 {
556 return makeRef(r);
557 }
558
560 {
561 return m_utils_factory;
562 }
563
565 {
566 return m_stat;
567 }
568
569 void build() override;
570
572
573 public:
574
575 static IParallelMng* create(const SequentialParallelMngBuildInfo& bi)
576 {
577 if (!bi.traceMng())
578 ARCANE_THROW(ArgumentException,"null traceMng()");
579 if (!bi.threadMng())
580 ARCANE_THROW(ArgumentException,"null threadMng()");
581 auto x = new SequentialParallelMng(bi);
582 x->build();
583 return x;
584 }
586 {
587 return makeRef(create(bi));
588 }
589
590 protected:
591
592 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override
593 {
594 ARCANE_UNUSED(kept_ranks);
595 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
596 bi.setThreadMng(m_thread_mng);
597 bi.setTraceMng(m_trace.get());
598 bi.setCommunicator(m_communicator);
599 return create(bi);
600 }
601
602 private:
603
605 IThreadMng* m_thread_mng = nullptr;
606 ITimerMng* m_timer_mng = nullptr;
607 IParallelMng* m_world_parallel_mng = nullptr;
608 IIOMng* m_io_mng;
609 Parallel::IStat* m_stat;
610 IParallelReplication* m_replication;
611 MP::Communicator m_communicator;
612 Ref<IParallelMngUtilsFactory> m_utils_factory;
613
614 private:
615
616};
617
618/*---------------------------------------------------------------------------*/
619/*---------------------------------------------------------------------------*/
620
621extern "C++" IIOMng*
622arcaneCreateIOMng(IParallelMng* psm);
623
624/*---------------------------------------------------------------------------*/
625/*---------------------------------------------------------------------------*/
626
627extern "C++" IParallelMng*
628arcaneCreateSequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
629{
630 return SequentialParallelMng::create(bi);
631}
632extern "C++" Ref<IParallelMng>
633arcaneCreateSequentialParallelMngRef(const SequentialParallelMngBuildInfo& bi)
634{
635 return SequentialParallelMng::createRef(bi);
636}
637
638/*---------------------------------------------------------------------------*/
639/*---------------------------------------------------------------------------*/
640
641SequentialParallelMng::
642SequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
644, m_trace(bi.traceMng())
645, m_thread_mng(bi.threadMng())
646, m_timer_mng(bi.m_timer_mng)
647, m_world_parallel_mng(bi.m_world_parallel_mng)
648, m_io_mng(nullptr)
649, m_stat(nullptr)
650, m_replication(new ParallelReplication())
651, m_communicator(bi.communicator())
653{
654 ARCANE_CHECK_PTR(m_trace);
655 ARCANE_CHECK_PTR(m_thread_mng);
656 if (!m_world_parallel_mng)
657 m_world_parallel_mng = this;
659 _messagePassingMng()->setCommunicator(m_communicator);
660}
661
662/*---------------------------------------------------------------------------*/
663/*---------------------------------------------------------------------------*/
664
665SequentialParallelMng::
666~SequentialParallelMng()
667{
668 delete m_stat;
669 delete m_replication;
670 delete m_io_mng;
671}
672
673/*---------------------------------------------------------------------------*/
674/*---------------------------------------------------------------------------*/
675
676void SequentialParallelMng::
677setBaseObject(IBase* sd)
678{
679 ARCANE_UNUSED(sd);
680}
681
682/*---------------------------------------------------------------------------*/
683/*---------------------------------------------------------------------------*/
684
685namespace
686{
687// Classe pour créer les différents dispatchers
688class DispatchCreator
689{
690 public:
691 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
692 public:
693 template<typename DataType> SequentialParallelDispatchT<DataType>*
694 create()
695 {
697 }
698 ITraceMng* m_tm;
699};
700}
701
703build()
704{
705 m_io_mng = arcaneCreateIOMng(this);
706 DispatchCreator creator(m_trace.get());
707 this->createDispatchers(creator);
708}
709
710/*---------------------------------------------------------------------------*/
711/*---------------------------------------------------------------------------*/
712
715{
716 traceMng()->info() << "** ** MPI Communicator = " << getMPICommunicator();
717}
718
719/*---------------------------------------------------------------------------*/
720/*---------------------------------------------------------------------------*/
721
722/*---------------------------------------------------------------------------*/
723/*---------------------------------------------------------------------------*/
724
725// Construit un superviseur séquentiel lié au superviseur \a sm
726SequentialParallelSuperMng::
727SequentialParallelSuperMng(const ServiceBuildInfo& sbi)
729, m_application(sbi.application())
730, m_thread_mng(new NullThreadMng())
731, m_timer_mng(nullptr)
732{
733}
734
735/*---------------------------------------------------------------------------*/
736/*---------------------------------------------------------------------------*/
737
738// Construit un superviseur séquentiel lié au superviseur \a sm
739SequentialParallelSuperMng::
740SequentialParallelSuperMng(const ServiceBuildInfo& sbi,Parallel::Communicator comm)
742, m_application(sbi.application())
743, m_thread_mng(new NullThreadMng())
744, m_timer_mng(nullptr)
745, m_communicator(comm)
746{
747}
748
749/*---------------------------------------------------------------------------*/
750/*---------------------------------------------------------------------------*/
751
752// Construit un superviseur séquentiel lié au superviseur \a sm
753SequentialParallelSuperMng::
754~SequentialParallelSuperMng()
755{
756 delete m_thread_mng;
757}
758
759/*---------------------------------------------------------------------------*/
760/*---------------------------------------------------------------------------*/
761
773
774/*---------------------------------------------------------------------------*/
775/*---------------------------------------------------------------------------*/
776
778build()
779{
780 if (!m_timer_mng){
781 m_owned_timer_mng = new TimerMng(traceMng());
782 m_timer_mng = m_owned_timer_mng.get();
783 }
784}
785
786/*---------------------------------------------------------------------------*/
787/*---------------------------------------------------------------------------*/
788
790internalCreateWorldParallelMng(Int32 local_rank)
791{
792 if (local_rank!=0)
793 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
794
795 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
796 bi.setThreadMng(threadMng());
797 bi.setTraceMng(traceMng());
798 bi.setCommunicator(communicator());
799 return SequentialParallelMng::createRef(bi);
800}
801
802/*---------------------------------------------------------------------------*/
803/*---------------------------------------------------------------------------*/
804
809
810/*---------------------------------------------------------------------------*/
811/*---------------------------------------------------------------------------*/
812
815
816/*---------------------------------------------------------------------------*/
817/*---------------------------------------------------------------------------*/
818
821{
822 public:
824 : m_application(app), m_thread_mng(new NullThreadMng()),
825 m_timer_mng(new TimerMng(app->traceMng())), m_communicator(comm){}
827 {
828 delete m_timer_mng;
829 delete m_thread_mng;
830 }
831
832 public:
833
834 void build() {}
835 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
836
837 public:
838 IApplication* m_application;
839 IThreadMng* m_thread_mng;
840 ITimerMng* m_timer_mng;
841 Parallel::Communicator m_communicator;
842};
843
844/*---------------------------------------------------------------------------*/
845/*---------------------------------------------------------------------------*/
846
848_createParallelMng(Int32 local_rank,ITraceMng* tm)
849{
850 if (local_rank!=0)
851 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
852
853 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
854 bi.setTraceMng(tm);
855 bi.setThreadMng(m_thread_mng);
856 bi.setCommunicator(m_communicator);
857 return arcaneCreateSequentialParallelMngRef(bi);
858}
859
860/*---------------------------------------------------------------------------*/
861/*---------------------------------------------------------------------------*/
862
864: public AbstractService
866{
867 public:
869 : AbstractService(sbi), m_application(sbi.application()){}
870 public:
873 {
874 ARCANE_UNUSED(nb_rank);
875 auto x = new SequentialParallelMngBuilder(m_application,comm);
876 x->build();
878 }
879 private:
880 IApplication* m_application;
881};
882
883/*---------------------------------------------------------------------------*/
884/*---------------------------------------------------------------------------*/
885
887 ServiceProperty("SequentialParallelMngContainerFactory",ST_Application),
889
890/*---------------------------------------------------------------------------*/
891/*---------------------------------------------------------------------------*/
892
893} // End namespace Arcane
894
895/*---------------------------------------------------------------------------*/
896/*---------------------------------------------------------------------------*/
897
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
#define ARCANE_REGISTER_APPLICATION_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Classe de base d'un service.
Tableau d'items de types quelconques.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface de l'application.
Interface de la classe de base des objets principaux arcane.
Definition IBase.h:38
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
Gestion des messages parallèles pour le type Type.
Echange d'informations entre processeurs.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Interface d'une fabrique pour les fonctions utilitaires de IParallelMng.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface des opérations parallèles collectives non bloquantes.
Informations sur la réplication des sous-domaines en parallèle.
Classe abstraite du superviseur de parallélisme.
Informations sur la topologie d'allocation des coeurs de calcul.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:53
Envoie de valeurs sur différents processeurs.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Gestionnaire de thread en mode mono-thread.
Echange d'informations entre processeurs.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
IMessagePassingMng * messagePassingMng() const override
Gestionnaire de message de Arccore associé
Classe de base d'une fabrique pour les fonctions utilitaires de IParallelMng.
Informations sur la réplication des sous-domaines en parallèle.
Informations sur la topologie d'allocation des coeurs de calcul.
Statistiques sur le parallélisme.
Interface des messages pour le type Type.
Ref< IParallelMng > _createParallelMng(Int32 local_rank, ITraceMng *tm) override
Créé le IParallelMng pour le rang local local_rank.
Ref< IParallelMngContainer > _createParallelMngBuilder(Int32 nb_rank, Parallel::Communicator comm) override
Créé un conteneur pour nb_local_rank rangs locaux et avec comme communicateur communicator.
Ref< ITransferValuesParallelOperation > createTransferValuesOperation(IParallelMng *) override
Retourne une opération pour transférer des valeurs entre rangs.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, const ItemGroup &group) override
Retourne une interface pour synchroniser des variables sur le groupe group.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
Gestionnaire du parallélisme en mode séquentiel.
Parallel::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
ISerializeMessage * createReceiveSerializer(Int32 rank) override
Créé un message non bloquant pour recevoir des données sérialisées du rang rank.
IParallelNonBlockingCollective * nonBlockingCollective() const override
Interface des opérations collectives non blocantes.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Retourne une opération pour transférer des valeurs entre sous-domaine.
IThreadMng * threadMng() const override
Gestionnaire de threads.
UniqueArray< Integer > testSomeRequests(ArrayView< Request > requests) override
Test si une des requêtes rvalues est terminée.
Int32 commRank() const override
Rang de cette instance dans le communicateur.
ISerializeMessage * createSendSerializer(Int32 rank) override
Créé un message non bloquant pour envoyer des données sérialisées au rang rank.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
IParallelMng * sequentialParallelMng() override
Retourne un gestionnaire de parallélisme séquentiel.
void build() override
Construit l'instance.
void barrier() override
Effectue une barière.
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.
IGetVariablesValuesParallelOperation * createGetVariablesValuesOperation() override
Retourne une opération pour récupérer les valeurs d'une variable sur les entités d'un autre sous-doma...
IParallelReplication * replication() const override
Informations sur la réplication.
ITimerMng * timerMng() const override
Gestionnaire de timers.
MessageId probe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
Ref< IParallelMngUtilsFactory > _internalUtilsFactory() const override
Fabrique des fonctions utilitaires.
MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
void processMessages(ConstArrayView< ISerializeMessage * > messages) override
Exécute les opérations des messages messages.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
bool isThreadImplementation() const override
Indique si l'implémentation utilise les threads.
Ref< IRequestList > createRequestListRef() override
Créé une liste de requêtes pour ce gestionnaire.
Parallel::IStat * stat() override
Gestionnaire des statistiques.
void printStats() override
Affiche des statistiques liées à ce gestionnaire du parallélisme.
ITraceMng * traceMng() const override
Gestionnaire de traces.
void initialize() override
Initialise le gestionnaire du parallélisme.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
bool isHybridImplementation() const override
Indique si l'implémentation utilise le mode hybride.
IParallelTopology * createTopology() override
Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
void setReplication(IParallelReplication *v) override
Positionne les Informations sur la réplication.
void freeRequests(ArrayView< Parallel::Request > requests) override
Libère les requêtes.
void waitAllRequests(ArrayView< Request > requests) override
Bloque en attendant que les requêtes rvalues soient terminées.
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.
IVariableSynchronizer * createSynchronizer(const ItemGroup &group) override
Retourne une interface pour synchroniser des variables sur le groupe group.
IIOMng * ioMng() const override
Gestionnaire des entrées/sorties.
Int32 masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
IParallelExchanger * createExchanger() override
Retourne une interface pour transférer des messages entre processeurs.
Request sendSerializer(ISerializer *values, Int32 rank, ByteArray &bytes) override
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
Superviseur du parallélisme en mode séquentiel.
void initialize() override
Initialise l'instance.
Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank) override
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
MP::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
void tryAbort() override
Tente de faire un abort.
void build() override
Construction de niveau build du service.
IApplication * m_application
Superviseur associé
IThreadMng * threadMng() const override
Gestionnaire de thread.
void _wait(Parallel::eWaitType wait_mode)
Effectue l'attente ou le test.
Message utilisant un SerializeBuffer.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Gestionnaire de timer.
Definition TimerMng.h:39
Exception lorsqu'un argument est invalide.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Communicateur pour l'échange de message.
Gestion des messages parallèles pour le type Type.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
bool isBlocking() const
Indique si le message est bloquant.
Requête d'un message.
Definition Request.h:77
Classe de base d'une liste de requêtes.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
Definition Parallel.h:50
IStat * createDefaultStat()
Créé une instance par défaut.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ ST_Application
Le service s'utilise au niveau de l'application.
eReduceType
Types des réductions supportées.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Type
Type of JSON value.
Definition rapidjson.h:665
Infos pour construire un SequentialParallelMng.