Arcane  v3.14.10.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-2024 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-2024 */
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;
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69extern "C++" IVariableSynchronizer*
70createNullVariableSynchronizer(IParallelMng* pm,const ItemGroup& group);
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
76: public RequestListBase
77{
78 public:
80 {
81 ARCANE_UNUSED(wait_mode);
82 }
83};
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
90template<class Type>
92: public TraceAccessor
93, public IParallelDispatchT<Type>
94, public ITypeDispatcher<Type>
95{
96 public:
99 public:
101 : TraceAccessor(tm) {}
102 void finalize() override {}
103 public:
104 void broadcast(ArrayView<Type> send_buf,Int32 rank) override
105 {
106 ARCANE_UNUSED(send_buf);
107 ARCANE_UNUSED(rank);
108 }
109 void broadcast(Span<Type> send_buf,Int32 rank) override
110 {
111 ARCANE_UNUSED(send_buf);
112 ARCANE_UNUSED(rank);
113 }
114 void allGather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf) override
115 {
116 recv_buf.copy(send_buf);
117 }
118 void allGather(Span<const Type> send_buf,Span<Type> recv_buf) override
119 {
120 recv_buf.copy(send_buf);
121 }
122 void gather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 rank) override
123 {
124 ARCANE_UNUSED(rank);
125 recv_buf.copy(send_buf);
126 }
127 void gather(Span<const Type> send_buf,Span<Type> recv_buf,Int32 rank) override
128 {
129 ARCANE_UNUSED(rank);
130 recv_buf.copy(send_buf);
131 }
132 void scatterVariable(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 root) override
133 {
134 ARCANE_UNUSED(root);
135 recv_buf.copy(send_buf);
136 }
137 void scatterVariable(Span<const Type> send_buf,Span<Type> recv_buf,Int32 root) override
138 {
139 ARCANE_UNUSED(root);
140 recv_buf.copy(send_buf);
141 }
142 void allGatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf) override
143 {
144 gatherVariable(send_buf,recv_buf,0);
145 }
146 void allGatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf) override
147 {
148 gatherVariable(send_buf,recv_buf,0);
149 }
150 void gatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
151 {
152 ARCANE_UNUSED(rank);
153 recv_buf.resize(send_buf.size());
154 ArrayView<Type> av(recv_buf);
155 av.copy(send_buf);
156 }
157 void gatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
158 {
159 ARCANE_UNUSED(rank);
160 recv_buf.resize(send_buf.size());
161 Span<Type> av(recv_buf.span());
162 av.copy(send_buf);
163 }
164 void allToAll(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Integer count) override
165 {
166 ARCANE_UNUSED(count);
167 recv_buf.copy(send_buf);
168 }
169 void allToAll(Span<const Type> send_buf,Span<Type> recv_buf,Int32 count) override
170 {
171 ARCANE_UNUSED(count);
172 recv_buf.copy(send_buf);
173 }
174 void allToAllVariable(ConstArrayView<Type> send_buf,
175 Int32ConstArrayView send_count,
176 Int32ConstArrayView send_index,
177 ArrayView<Type> recv_buf,
178 Int32ConstArrayView recv_count,
179 Int32ConstArrayView recv_index) override
180 {
181 ARCANE_UNUSED(send_count);
182 ARCANE_UNUSED(recv_count);
183 ARCANE_UNUSED(send_index);
184 ARCANE_UNUSED(recv_index);
185 recv_buf.copy(send_buf);
186 }
187 void allToAllVariable(Span<const Type> send_buf,
188 ConstArrayView<Int32> send_count,
189 ConstArrayView<Int32> send_index,
190 Span<Type> recv_buf,
191 ConstArrayView<Int32> recv_count,
192 ConstArrayView<Int32> recv_index) override
193 {
194 ARCANE_UNUSED(send_count);
195 ARCANE_UNUSED(recv_count);
196 ARCANE_UNUSED(send_index);
197 ARCANE_UNUSED(recv_index);
198 recv_buf.copy(send_buf);
199 }
200 Request send(ConstArrayView<Type> send_buffer,Int32 rank,bool is_blocked) override
201 {
202 return send(Span<const Type>(send_buffer),rank,is_blocked);
203 }
204 Request send(Span<const Type> send_buffer,Int32 rank,bool is_blocked) override
205 {
206 ARCANE_UNUSED(send_buffer);
207 ARCANE_UNUSED(rank);
208 if (is_blocked)
209 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
210 return Request();
211 }
212 Request send(Span<const Type> send_buffer,const PointToPointMessageInfo& message) override
213 {
214 ARCANE_UNUSED(send_buffer);
215 if (message.isBlocking())
216 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
217 return Request();
218 }
219 Request recv(ArrayView<Type> recv_buffer,Int32 rank,bool is_blocked) override
220 {
221 return receive(Span<Type>(recv_buffer),rank,is_blocked);
222 }
223 void send(ConstArrayView<Type> send_buffer,Int32 rank) override
224 {
225 ARCANE_UNUSED(send_buffer);
226 ARCANE_UNUSED(rank);
227 throw NotSupportedException(A_FUNCINFO,"send is not allowed in sequential");
228 }
229 void recv(ArrayView<Type> recv_buffer,Int32 rank) override
230 {
231 ARCANE_UNUSED(recv_buffer);
232 ARCANE_UNUSED(rank);
233 throw NotSupportedException(A_FUNCINFO,"recv is not allowed in sequential");
234 }
235 Request receive(Span<Type> recv_buffer,Int32 rank,bool is_blocked) override
236 {
237 ARCANE_UNUSED(recv_buffer);
238 ARCANE_UNUSED(rank);
239 if (is_blocked)
240 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
241 return Request();
242 }
243 Request receive(Span<Type> recv_buffer,const PointToPointMessageInfo& message) override
244 {
245 ARCANE_UNUSED(recv_buffer);
246 if (message.isBlocking())
247 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
248 return Request();
249 }
250 void sendRecv(ConstArrayView<Type> send_buffer,ArrayView<Type> recv_buffer,Int32 rank) override
251 {
252 ARCANE_UNUSED(rank);
254 }
255 Type allReduce(eReduceType op,Type v) override
256 {
257 ARCANE_UNUSED(op);
258 return v;
259 }
260 void allReduce(eReduceType op,ArrayView<Type> send_buf) override
261 {
262 ARCANE_UNUSED(op);
263 ARCANE_UNUSED(send_buf);
264 }
265 void allReduce(eReduceType op,Span<Type> send_buf) override
266 {
267 ARCANE_UNUSED(op);
268 ARCANE_UNUSED(send_buf);
269 }
270 Request nonBlockingAllReduce(eReduceType op,Span<const Type> send_buf,Span<Type> recv_buf) override
271 {
272 ARCANE_UNUSED(op);
273 ARCANE_UNUSED(send_buf);
274 ARCANE_UNUSED(recv_buf);
275 return Request();
276 }
277 Request nonBlockingAllGather(Span<const Type> send_buf, Span<Type> recv_buf) override
278 {
279 recv_buf.copy(send_buf);
280 return Request();
281 }
282 Request nonBlockingBroadcast(Span<Type> send_buf, Int32 rank) override
283 {
284 ARCANE_UNUSED(send_buf);
285 ARCANE_UNUSED(rank);
286 return Request();
287 }
288 Request nonBlockingGather(Span<const Type> send_buf, Span<Type> recv_buf, Int32 rank) override
289 {
290 ARCANE_UNUSED(rank);
291 recv_buf.copy(send_buf);
292 return Request();
293 }
294 Request nonBlockingAllToAll(Span<const Type> send_buf, Span<Type> recv_buf, Int32 count) override
295 {
296 ARCANE_UNUSED(count);
297 recv_buf.copy(send_buf);
298 return Request();
299 }
300 Request nonBlockingAllToAllVariable(Span<const Type> send_buf, ConstArrayView<Int32> send_count,
301 ConstArrayView<Int32> send_index, Span<Type> recv_buf,
302 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) override
303 {
304 ARCANE_UNUSED(send_count);
305 ARCANE_UNUSED(recv_count);
306 ARCANE_UNUSED(send_index);
307 ARCANE_UNUSED(recv_index);
308 recv_buf.copy(send_buf);
309 return Request();
310 }
311 Type scan(eReduceType op,Type v) override
312 {
313 ARCANE_UNUSED(op);
314 return v;
315 }
316 void scan(eReduceType op,ArrayView<Type> send_buf) override
317 {
318 ARCANE_UNUSED(op);
319 ARCANE_UNUSED(send_buf);
320 }
321 void computeMinMaxSum(Type val,Type& min_val,Type& max_val,Type& sum_val,
322 Int32& min_rank,
323 Int32& max_rank) override
324 {
326 min_rank = max_rank = 0;
327 }
328 void computeMinMaxSum(ConstArrayView<Type> values,
334 {
335 const Integer n = values.size();
336 for(Integer i=0;i<n;++i) {
337 min_values[i] = max_values[i] = sum_values[i] = values[i];
338 min_ranks[i] = max_ranks[i] = 0;
339 }
340 }
341 ITypeDispatcher<Type>* toArccoreDispatcher() override { return this; }
342};
343
344/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
349{
350 public:
356 {
357 return makeRef(createNullVariableSynchronizer(pm,family->allItems()));
358 }
360 {
361 return makeRef(createNullVariableSynchronizer(pm,group));
362 }
363};
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
375{
376 private:
377 // Construit un gestionnaire séquentiel.
379 public:
381
382 bool isParallel() const override { return false; }
383 Int32 commRank() const override { return 0; }
384 Int32 commSize() const override { return 1; }
385 void* getMPICommunicator() override { return m_communicator.communicatorAddress(); }
386 Parallel::Communicator communicator() const override { return m_communicator; }
387 bool isThreadImplementation() const override { return false; }
388 bool isHybridImplementation() const override { return false; }
389 void setBaseObject(IBase* m);
390 ITraceMng* traceMng() const override { return m_trace.get(); }
391 IThreadMng* threadMng() const override { return m_thread_mng; }
392 ITimerMng* timerMng() const override { return m_timer_mng; }
393 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
394 IIOMng* ioMng() const override { return m_io_mng; }
395
396 void initialize() override ;
397 bool isMasterIO() const override { return true; }
398 Int32 masterIORank() const override { return 0; }
399
400 public:
401
406 void sendSerializer(ISerializer* values,Int32 rank) override
407 {
408 ARCANE_UNUSED(values);
409 ARCANE_UNUSED(rank);
410 }
411 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override
412 {
413 ARCANE_UNUSED(values);
414 ARCANE_UNUSED(rank);
415 ARCANE_UNUSED(bytes);
416 return Parallel::Request();
417 }
419 {
420 ARCANE_UNUSED(rank);
421 return new SerializeMessage(0,0,ISerializeMessage::MT_Send);
422 }
423 void recvSerializer(ISerializer* values,Int32 rank) override
424 {
425 ARCANE_UNUSED(values);
426 ARCANE_UNUSED(rank);
427 }
429 {
430 ARCANE_UNUSED(rank);
431 return new SerializeMessage(0,0,ISerializeMessage::MT_Recv);
432 }
433
434 void broadcastString(String& str,Int32 rank) override
435 {
436 ARCANE_UNUSED(str);
437 ARCANE_UNUSED(rank);
438 }
439 void broadcastMemoryBuffer(ByteArray& bytes,Int32 rank) override
440 {
441 ARCANE_UNUSED(bytes);
442 ARCANE_UNUSED(rank);
443 }
444 void broadcastSerializer(ISerializer* values,Int32 rank) override
445 {
446 ARCANE_UNUSED(values);
447 ARCANE_UNUSED(rank);
448 }
449 MessageId probe(const PointToPointMessageInfo& message) override
450 {
451 ARCANE_UNUSED(message);
452 return MessageId();
453 }
455 {
456 ARCANE_UNUSED(message);
457 return MessageSourceInfo();
458 }
459 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override
460 {
461 ARCANE_UNUSED(values);
462 ARCANE_UNUSED(message);
463 return Parallel::Request();
464 }
465 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override
466 {
467 ARCANE_UNUSED(values);
468 ARCANE_UNUSED(message);
469 return Parallel::Request();
470 }
471
473 {
474 ARCANE_UNUSED(messages);
475 }
477 {
478 ARCANE_UNUSED(requests);
479 }
480
481 void printStats() override {}
482 void barrier() override {}
483
484 IParallelMng* sequentialParallelMng() override { return this; }
485 Ref<IParallelMng> sequentialParallelMngRef() override { return makeRef<IParallelMng>(this); }
486
487 void waitAllRequests(ArrayView<Request> requests) override
488 {
489 ARCANE_UNUSED(requests);
490 }
491
492 // Les requetes sont forcement deja satisfaites.
494 {
495 ARCANE_UNUSED(requests);
496 return UniqueArray<Integer>();
497 }
499 {
500 return waitSomeRequests(requests);
501 }
502
503 ISerializeMessageList* _createSerializeMessageList() override
504 {
506 }
507 Real reduceRank(eReduceType rt,Real v,Int32* rank)
508 {
509 Real rv = reduce(rt,v);
510 if (rank)
511 *rank = 0;
512 return rv;
513 }
523 {
524 return new ParallelExchanger(this);
525 }
527 {
528 return createNullVariableSynchronizer(this,family->allItems());
529 }
531 {
532 return createNullVariableSynchronizer(this,group);
533 }
535 {
537 t->initialize();
538 return t;
539 }
540
542 {
543 return m_replication;
544 }
545
547 {
548 delete m_replication;
549 m_replication = v;
550 }
551
553 {
555 return makeRef(r);
556 }
557
559 {
560 return m_utils_factory;
561 }
562
564 {
565 return m_stat;
566 }
567
568 void build() override;
569
571
572 public:
573
574 static IParallelMng* create(const SequentialParallelMngBuildInfo& bi)
575 {
576 if (!bi.traceMng())
577 ARCANE_THROW(ArgumentException,"null traceMng()");
578 if (!bi.threadMng())
579 ARCANE_THROW(ArgumentException,"null threadMng()");
580 auto x = new SequentialParallelMng(bi);
581 x->build();
582 return x;
583 }
584 static Ref<IParallelMng> createRef(const SequentialParallelMngBuildInfo& bi)
585 {
586 return makeRef(create(bi));
587 }
588
589 protected:
590
591 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override
592 {
593 ARCANE_UNUSED(kept_ranks);
594 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
595 bi.setThreadMng(m_thread_mng);
596 bi.setTraceMng(m_trace.get());
597 bi.setCommunicator(m_communicator);
598 return create(bi);
599 }
600
601 private:
602
603 ReferenceCounter<ITraceMng> m_trace;
604 IThreadMng* m_thread_mng = nullptr;
605 ITimerMng* m_timer_mng = nullptr;
606 IParallelMng* m_world_parallel_mng = nullptr;
607 IIOMng* m_io_mng;
608 Parallel::IStat* m_stat;
609 IParallelReplication* m_replication;
610 MP::Communicator m_communicator;
611 Ref<IParallelMngUtilsFactory> m_utils_factory;
612
613 private:
614
615};
616
617/*---------------------------------------------------------------------------*/
618/*---------------------------------------------------------------------------*/
619
620extern "C++" IIOMng*
621arcaneCreateIOMng(IParallelMng* psm);
622
623/*---------------------------------------------------------------------------*/
624/*---------------------------------------------------------------------------*/
625
626extern "C++" IParallelMng*
627arcaneCreateSequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
628{
629 return SequentialParallelMng::create(bi);
630}
631extern "C++" Ref<IParallelMng>
632arcaneCreateSequentialParallelMngRef(const SequentialParallelMngBuildInfo& bi)
633{
634 return SequentialParallelMng::createRef(bi);
635}
636
637/*---------------------------------------------------------------------------*/
638/*---------------------------------------------------------------------------*/
639
640SequentialParallelMng::
641SequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
642: ParallelMngDispatcher(ParallelMngDispatcherBuildInfo(0,1))
643, m_trace(bi.traceMng())
644, m_thread_mng(bi.threadMng())
645, m_timer_mng(bi.m_timer_mng)
646, m_world_parallel_mng(bi.m_world_parallel_mng)
647, m_io_mng(nullptr)
648, m_stat(nullptr)
649, m_replication(new ParallelReplication())
650, m_communicator(bi.communicator())
651, m_utils_factory(makeRef<IParallelMngUtilsFactory>(new SequentialParallelMngUtilsFactory()))
652{
653 ARCANE_CHECK_PTR(m_trace);
654 ARCANE_CHECK_PTR(m_thread_mng);
655 if (!m_world_parallel_mng)
656 m_world_parallel_mng = this;
658 _messagePassingMng()->setCommunicator(m_communicator);
659}
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
664SequentialParallelMng::
665~SequentialParallelMng()
666{
667 delete m_stat;
668 delete m_replication;
669 delete m_io_mng;
670}
671
672/*---------------------------------------------------------------------------*/
673/*---------------------------------------------------------------------------*/
674
675void SequentialParallelMng::
676setBaseObject(IBase* sd)
677{
678 ARCANE_UNUSED(sd);
679}
680
681/*---------------------------------------------------------------------------*/
682/*---------------------------------------------------------------------------*/
683
684namespace
685{
686// Classe pour créer les différents dispatchers
687class DispatchCreator
688{
689 public:
690 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
691 public:
692 template<typename DataType> SequentialParallelDispatchT<DataType>*
693 create()
694 {
695 return new SequentialParallelDispatchT<DataType>(m_tm);
696 }
697 ITraceMng* m_tm;
698};
699}
700
702build()
703{
704 m_io_mng = arcaneCreateIOMng(this);
705 DispatchCreator creator(m_trace.get());
706 this->createDispatchers(creator);
707}
708
709/*---------------------------------------------------------------------------*/
710/*---------------------------------------------------------------------------*/
711
714{
715 traceMng()->info() << "** ** MPI Communicator = " << getMPICommunicator();
716}
717
718/*---------------------------------------------------------------------------*/
719/*---------------------------------------------------------------------------*/
720
721/*---------------------------------------------------------------------------*/
722/*---------------------------------------------------------------------------*/
723
724// Construit un superviseur séquentiel lié au superviseur \a sm
725SequentialParallelSuperMng::
726SequentialParallelSuperMng(const ServiceBuildInfo& sbi)
728, m_application(sbi.application())
729, m_thread_mng(new NullThreadMng())
730, m_timer_mng(nullptr)
731{
732}
733
734/*---------------------------------------------------------------------------*/
735/*---------------------------------------------------------------------------*/
736
737// Construit un superviseur séquentiel lié au superviseur \a sm
738SequentialParallelSuperMng::
739SequentialParallelSuperMng(const ServiceBuildInfo& sbi,Parallel::Communicator comm)
740: AbstractService(sbi)
741, m_application(sbi.application())
742, m_thread_mng(new NullThreadMng())
743, m_timer_mng(nullptr)
744, m_communicator(comm)
745{
746}
747
748/*---------------------------------------------------------------------------*/
749/*---------------------------------------------------------------------------*/
750
751// Construit un superviseur séquentiel lié au superviseur \a sm
752SequentialParallelSuperMng::
753~SequentialParallelSuperMng()
754{
755 delete m_thread_mng;
756}
757
758/*---------------------------------------------------------------------------*/
759/*---------------------------------------------------------------------------*/
760
772
773/*---------------------------------------------------------------------------*/
774/*---------------------------------------------------------------------------*/
775
777build()
778{
779 if (!m_timer_mng){
780 m_owned_timer_mng = new TimerMng(traceMng());
781 m_timer_mng = m_owned_timer_mng.get();
782 }
783}
784
785/*---------------------------------------------------------------------------*/
786/*---------------------------------------------------------------------------*/
787
789internalCreateWorldParallelMng(Int32 local_rank)
790{
791 if (local_rank!=0)
792 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
793
794 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
795 bi.setThreadMng(threadMng());
796 bi.setTraceMng(traceMng());
797 bi.setCommunicator(communicator());
798 return SequentialParallelMng::createRef(bi);
799}
800
801/*---------------------------------------------------------------------------*/
802/*---------------------------------------------------------------------------*/
803
808
809/*---------------------------------------------------------------------------*/
810/*---------------------------------------------------------------------------*/
811
814
815/*---------------------------------------------------------------------------*/
816/*---------------------------------------------------------------------------*/
817
820{
821 public:
823 : m_application(app), m_thread_mng(new NullThreadMng()),
824 m_timer_mng(new TimerMng(app->traceMng())), m_communicator(comm){}
826 {
827 delete m_timer_mng;
828 delete m_thread_mng;
829 }
830
831 public:
832
833 void build() {}
834 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
835
836 public:
837 IApplication* m_application;
838 IThreadMng* m_thread_mng;
839 ITimerMng* m_timer_mng;
840 Parallel::Communicator m_communicator;
841};
842
843/*---------------------------------------------------------------------------*/
844/*---------------------------------------------------------------------------*/
845
847_createParallelMng(Int32 local_rank,ITraceMng* tm)
848{
849 if (local_rank!=0)
850 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
851
852 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
853 bi.setTraceMng(tm);
854 bi.setThreadMng(m_thread_mng);
855 bi.setCommunicator(m_communicator);
856 return arcaneCreateSequentialParallelMngRef(bi);
857}
858
859/*---------------------------------------------------------------------------*/
860/*---------------------------------------------------------------------------*/
861
863: public AbstractService
865{
866 public:
868 : AbstractService(sbi), m_application(sbi.application()){}
869 public:
872 {
873 ARCANE_UNUSED(nb_rank);
874 auto x = new SequentialParallelMngBuilder(m_application,comm);
875 x->build();
877 }
878 private:
879 IApplication* m_application;
880};
881
882/*---------------------------------------------------------------------------*/
883/*---------------------------------------------------------------------------*/
884
885ARCANE_REGISTER_SERVICE(SequentialParallelMngContainerFactory,
886 ServiceProperty("SequentialParallelMngContainerFactory",ST_Application),
887 ARCANE_SERVICE_INTERFACE(IParallelMngContainerFactory));
888
889/*---------------------------------------------------------------------------*/
890/*---------------------------------------------------------------------------*/
891
892} // End namespace Arcane
893
894/*---------------------------------------------------------------------------*/
895/*---------------------------------------------------------------------------*/
896
#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 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:120
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 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.
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.
IStat * createDefaultStat()
Créé une instance par défaut.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:640
@ 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.