Arcane  v3.16.7.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/ISerializer.h"
42#include "arcane/core/internal/SerializeMessage.h"
43#include "arcane/core/internal/ParallelMngInternal.h"
44
45#include "arcane/parallel/IStat.h"
46
47#include "arcane/impl/TimerMng.h"
48#include "arcane/impl/GetVariablesValuesParallelOperation.h"
49#include "arcane/impl/ParallelExchanger.h"
50#include "arcane/impl/ParallelTopology.h"
51#include "arcane/impl/ParallelReplication.h"
52#include "arcane/impl/SequentialParallelSuperMng.h"
53#include "arcane/impl/SequentialParallelMng.h"
54#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h"
55#include "arcane/impl/internal/VariableSynchronizer.h"
56
57#include "arccore/message_passing/RequestListBase.h"
58#include "arccore/message_passing/SerializeMessageList.h"
59#include "arccore/message_passing/internal/IMachineMemoryWindowBaseInternal.h"
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
64namespace Arcane
65{
68using namespace Arcane::MessagePassing;
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72
73extern "C++" IVariableSynchronizer*
74createNullVariableSynchronizer(IParallelMng* pm,const ItemGroup& group);
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
80: public RequestListBase
81{
82 public:
83 void _wait(Parallel::eWaitType wait_mode)
84 {
85 ARCANE_UNUSED(wait_mode);
86 }
87};
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
94template<class Type>
95class SequentialParallelDispatchT
96: public TraceAccessor
97, public IParallelDispatchT<Type>
98, public ITypeDispatcher<Type>
99{
100 public:
101 typedef Parallel::Request Request;
102 typedef Parallel::eReduceType eReduceType;
103 public:
104 SequentialParallelDispatchT(ITraceMng* tm)
105 : TraceAccessor(tm) {}
106 void finalize() override {}
107 public:
108 void broadcast(ArrayView<Type> send_buf,Int32 rank) override
109 {
110 ARCANE_UNUSED(send_buf);
111 ARCANE_UNUSED(rank);
112 }
113 void broadcast(Span<Type> send_buf,Int32 rank) override
114 {
115 ARCANE_UNUSED(send_buf);
116 ARCANE_UNUSED(rank);
117 }
118 void allGather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf) override
119 {
120 recv_buf.copy(send_buf);
121 }
122 void allGather(Span<const Type> send_buf,Span<Type> recv_buf) override
123 {
124 recv_buf.copy(send_buf);
125 }
126 void gather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 rank) override
127 {
128 ARCANE_UNUSED(rank);
129 recv_buf.copy(send_buf);
130 }
131 void gather(Span<const Type> send_buf,Span<Type> recv_buf,Int32 rank) override
132 {
133 ARCANE_UNUSED(rank);
134 recv_buf.copy(send_buf);
135 }
136 void scatterVariable(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 root) override
137 {
138 ARCANE_UNUSED(root);
139 recv_buf.copy(send_buf);
140 }
141 void scatterVariable(Span<const Type> send_buf,Span<Type> recv_buf,Int32 root) override
142 {
143 ARCANE_UNUSED(root);
144 recv_buf.copy(send_buf);
145 }
146 void allGatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf) override
147 {
148 gatherVariable(send_buf,recv_buf,0);
149 }
150 void allGatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf) override
151 {
152 gatherVariable(send_buf,recv_buf,0);
153 }
154 void gatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
155 {
156 ARCANE_UNUSED(rank);
157 recv_buf.resize(send_buf.size());
158 ArrayView<Type> av(recv_buf);
159 av.copy(send_buf);
160 }
161 void gatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
162 {
163 ARCANE_UNUSED(rank);
164 recv_buf.resize(send_buf.size());
165 Span<Type> av(recv_buf.span());
166 av.copy(send_buf);
167 }
168 void allToAll(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Integer count) override
169 {
170 ARCANE_UNUSED(count);
171 recv_buf.copy(send_buf);
172 }
173 void allToAll(Span<const Type> send_buf,Span<Type> recv_buf,Int32 count) override
174 {
175 ARCANE_UNUSED(count);
176 recv_buf.copy(send_buf);
177 }
178 void allToAllVariable(ConstArrayView<Type> send_buf,
179 Int32ConstArrayView send_count,
180 Int32ConstArrayView send_index,
181 ArrayView<Type> recv_buf,
182 Int32ConstArrayView recv_count,
183 Int32ConstArrayView recv_index) override
184 {
185 ARCANE_UNUSED(send_count);
186 ARCANE_UNUSED(recv_count);
187 ARCANE_UNUSED(send_index);
188 ARCANE_UNUSED(recv_index);
189 recv_buf.copy(send_buf);
190 }
191 void allToAllVariable(Span<const Type> send_buf,
192 ConstArrayView<Int32> send_count,
193 ConstArrayView<Int32> send_index,
194 Span<Type> recv_buf,
195 ConstArrayView<Int32> recv_count,
196 ConstArrayView<Int32> recv_index) override
197 {
198 ARCANE_UNUSED(send_count);
199 ARCANE_UNUSED(recv_count);
200 ARCANE_UNUSED(send_index);
201 ARCANE_UNUSED(recv_index);
202 recv_buf.copy(send_buf);
203 }
204 Request send(ConstArrayView<Type> send_buffer,Int32 rank,bool is_blocked) override
205 {
206 return send(Span<const Type>(send_buffer),rank,is_blocked);
207 }
208 Request send(Span<const Type> send_buffer,Int32 rank,bool is_blocked) override
209 {
210 ARCANE_UNUSED(send_buffer);
211 ARCANE_UNUSED(rank);
212 if (is_blocked)
213 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
214 return Request();
215 }
216 Request send(Span<const Type> send_buffer,const PointToPointMessageInfo& message) override
217 {
218 ARCANE_UNUSED(send_buffer);
219 if (message.isBlocking())
220 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
221 return Request();
222 }
223 Request recv(ArrayView<Type> recv_buffer,Int32 rank,bool is_blocked) override
224 {
225 return receive(Span<Type>(recv_buffer),rank,is_blocked);
226 }
227 void send(ConstArrayView<Type> send_buffer,Int32 rank) override
228 {
229 ARCANE_UNUSED(send_buffer);
230 ARCANE_UNUSED(rank);
231 throw NotSupportedException(A_FUNCINFO,"send is not allowed in sequential");
232 }
233 void recv(ArrayView<Type> recv_buffer,Int32 rank) override
234 {
235 ARCANE_UNUSED(recv_buffer);
236 ARCANE_UNUSED(rank);
237 throw NotSupportedException(A_FUNCINFO,"recv is not allowed in sequential");
238 }
239 Request receive(Span<Type> recv_buffer,Int32 rank,bool is_blocked) override
240 {
241 ARCANE_UNUSED(recv_buffer);
242 ARCANE_UNUSED(rank);
243 if (is_blocked)
244 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
245 return Request();
246 }
247 Request receive(Span<Type> recv_buffer,const PointToPointMessageInfo& message) override
248 {
249 ARCANE_UNUSED(recv_buffer);
250 if (message.isBlocking())
251 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
252 return Request();
253 }
254 void sendRecv(ConstArrayView<Type> send_buffer,ArrayView<Type> recv_buffer,Int32 rank) override
255 {
256 ARCANE_UNUSED(rank);
257 recv_buffer.copy(send_buffer);
258 }
259 Type allReduce(eReduceType op,Type v) override
260 {
261 ARCANE_UNUSED(op);
262 return v;
263 }
264 void allReduce(eReduceType op,ArrayView<Type> send_buf) override
265 {
266 ARCANE_UNUSED(op);
267 ARCANE_UNUSED(send_buf);
268 }
269 void allReduce(eReduceType op,Span<Type> send_buf) override
270 {
271 ARCANE_UNUSED(op);
272 ARCANE_UNUSED(send_buf);
273 }
274 Request nonBlockingAllReduce(eReduceType op,Span<const Type> send_buf,Span<Type> recv_buf) override
275 {
276 ARCANE_UNUSED(op);
277 ARCANE_UNUSED(send_buf);
278 ARCANE_UNUSED(recv_buf);
279 return Request();
280 }
281 Request nonBlockingAllGather(Span<const Type> send_buf, Span<Type> recv_buf) override
282 {
283 recv_buf.copy(send_buf);
284 return Request();
285 }
286 Request nonBlockingBroadcast(Span<Type> send_buf, Int32 rank) override
287 {
288 ARCANE_UNUSED(send_buf);
289 ARCANE_UNUSED(rank);
290 return Request();
291 }
292 Request nonBlockingGather(Span<const Type> send_buf, Span<Type> recv_buf, Int32 rank) override
293 {
294 ARCANE_UNUSED(rank);
295 recv_buf.copy(send_buf);
296 return Request();
297 }
298 Request nonBlockingAllToAll(Span<const Type> send_buf, Span<Type> recv_buf, Int32 count) override
299 {
300 ARCANE_UNUSED(count);
301 recv_buf.copy(send_buf);
302 return Request();
303 }
304 Request nonBlockingAllToAllVariable(Span<const Type> send_buf, ConstArrayView<Int32> send_count,
305 ConstArrayView<Int32> send_index, Span<Type> recv_buf,
306 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) override
307 {
308 ARCANE_UNUSED(send_count);
309 ARCANE_UNUSED(recv_count);
310 ARCANE_UNUSED(send_index);
311 ARCANE_UNUSED(recv_index);
312 recv_buf.copy(send_buf);
313 return Request();
314 }
315 Type scan(eReduceType op,Type v) override
316 {
317 ARCANE_UNUSED(op);
318 return v;
319 }
320 void scan(eReduceType op,ArrayView<Type> send_buf) override
321 {
322 ARCANE_UNUSED(op);
323 ARCANE_UNUSED(send_buf);
324 }
325 void computeMinMaxSum(Type val,Type& min_val,Type& max_val,Type& sum_val,
326 Int32& min_rank,
327 Int32& max_rank) override
328 {
329 min_val = max_val = sum_val = val;
330 min_rank = max_rank = 0;
331 }
332 void computeMinMaxSum(ConstArrayView<Type> values,
333 ArrayView<Type> min_values,
334 ArrayView<Type> max_values,
335 ArrayView<Type> sum_values,
336 ArrayView<Int32> min_ranks,
337 ArrayView<Int32> max_ranks) override
338 {
339 const Integer n = values.size();
340 for(Integer i=0;i<n;++i) {
341 min_values[i] = max_values[i] = sum_values[i] = values[i];
342 min_ranks[i] = max_ranks[i] = 0;
343 }
344 }
345 ITypeDispatcher<Type>* toArccoreDispatcher() override { return this; }
346};
347
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350
351class SequentialMachineMemoryWindowBaseInternal
353{
354 public:
355
356 SequentialMachineMemoryWindowBaseInternal(Int64 sizeof_segment, Int32 sizeof_type)
357 : m_sizeof_segment(sizeof_segment)
358 , m_max_sizeof_segment(sizeof_segment)
359 , m_sizeof_type(sizeof_type)
360 {
361 m_segment = new std::byte[m_sizeof_segment];
362 }
363
364 ~SequentialMachineMemoryWindowBaseInternal() override
365 {
366 delete[] m_segment;
367 }
368
369 public:
370
371 Int32 sizeofOneElem() const override
372 {
373 return m_sizeof_type;
374 }
375
376 Span<std::byte> segment() const override
377 {
378 return Span<std::byte>{ m_segment, m_sizeof_segment };
379 }
380 Span<std::byte> segment(const Int32 rank) const override
381 {
382 if (rank != 0) {
383 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
384 }
385 return Span<std::byte>{ m_segment, m_sizeof_segment };
386 }
387 Span<std::byte> window() const override
388 {
389 return Span<std::byte>{ m_segment, m_sizeof_segment };
390 }
391
392 void resizeSegment(const Int64 new_sizeof_segment) override
393 {
394 if (new_sizeof_segment > m_max_sizeof_segment) {
395 ARCANE_FATAL("New size of window (sum of size of all segments) is superior than the old size");
396 }
397 m_sizeof_segment = new_sizeof_segment;
398 }
399
401 {
402 return ConstArrayView<Int32>{ 1, &m_my_rank };
403 }
404
405 void barrier() const override {}
406
407 private:
408
409 Int64 m_sizeof_segment;
410 Int64 m_max_sizeof_segment;
411
412 Int32 m_sizeof_type;
413 std::byte* m_segment;
414 Int32 m_my_rank = 0;
415};
416
417/*---------------------------------------------------------------------------*/
418/*---------------------------------------------------------------------------*/
419
422{
423 public:
429 {
430 return makeRef(createNullVariableSynchronizer(pm,family->allItems()));
431 }
433 {
434 return makeRef(createNullVariableSynchronizer(pm,group));
435 }
436};
437
438/*---------------------------------------------------------------------------*/
439/*---------------------------------------------------------------------------*/
446class SequentialParallelMng
447: public ParallelMngDispatcher
448{
449 public:
450
451 class Impl;
452
453 private:
454 // Construit un gestionnaire séquentiel.
455 SequentialParallelMng(const SequentialParallelMngBuildInfo& bi);
456 public:
457 ~SequentialParallelMng();
458
459 bool isParallel() const override { return false; }
460 Int32 commRank() const override { return 0; }
461 Int32 commSize() const override { return 1; }
462 void* getMPICommunicator() override { return m_communicator.communicatorAddress(); }
463 Parallel::Communicator communicator() const override { return m_communicator; }
464 bool isThreadImplementation() const override { return false; }
465 bool isHybridImplementation() const override { return false; }
466 void setBaseObject(IBase* m);
467 ITraceMng* traceMng() const override { return m_trace.get(); }
468 IThreadMng* threadMng() const override { return m_thread_mng; }
469 ITimerMng* timerMng() const override { return m_timer_mng; }
470 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
471 IIOMng* ioMng() const override { return m_io_mng; }
472
473 void initialize() override ;
474 bool isMasterIO() const override { return true; }
475 Int32 masterIORank() const override { return 0; }
476
477 public:
478
479 void allGather(ISerializer* send_serializer, ISerializer* recv_serializer) override
480 {
481 recv_serializer->copy(send_serializer);
482 }
483 void sendSerializer(ISerializer* values,Int32 rank) override
484 {
485 ARCANE_UNUSED(values);
486 ARCANE_UNUSED(rank);
487 }
488 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override
489 {
490 ARCANE_UNUSED(values);
491 ARCANE_UNUSED(rank);
492 ARCANE_UNUSED(bytes);
493 return Parallel::Request();
494 }
496 {
497 ARCANE_UNUSED(rank);
498 return new SerializeMessage(0,0,ISerializeMessage::MT_Send);
499 }
500 void recvSerializer(ISerializer* values,Int32 rank) override
501 {
502 ARCANE_UNUSED(values);
503 ARCANE_UNUSED(rank);
504 }
506 {
507 ARCANE_UNUSED(rank);
508 return new SerializeMessage(0,0,ISerializeMessage::MT_Recv);
509 }
510
511 void broadcastString(String& str,Int32 rank) override
512 {
513 ARCANE_UNUSED(str);
514 ARCANE_UNUSED(rank);
515 }
516 void broadcastMemoryBuffer(ByteArray& bytes,Int32 rank) override
517 {
518 ARCANE_UNUSED(bytes);
519 ARCANE_UNUSED(rank);
520 }
521 void broadcastSerializer(ISerializer* values,Int32 rank) override
522 {
523 ARCANE_UNUSED(values);
524 ARCANE_UNUSED(rank);
525 }
526 MessageId probe(const PointToPointMessageInfo& message) override
527 {
528 ARCANE_UNUSED(message);
529 return MessageId();
530 }
532 {
533 ARCANE_UNUSED(message);
534 return MessageSourceInfo();
535 }
536 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override
537 {
538 ARCANE_UNUSED(values);
539 ARCANE_UNUSED(message);
540 return Parallel::Request();
541 }
542 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override
543 {
544 ARCANE_UNUSED(values);
545 ARCANE_UNUSED(message);
546 return Parallel::Request();
547 }
548
550 {
551 ARCANE_UNUSED(messages);
552 }
554 {
555 ARCANE_UNUSED(requests);
556 }
557
558 void printStats() override {}
559 void barrier() override {}
560
561 IParallelMng* sequentialParallelMng() override { return this; }
562 Ref<IParallelMng> sequentialParallelMngRef() override { return makeRef<IParallelMng>(this); }
563
564 void waitAllRequests(ArrayView<Request> requests) override
565 {
566 ARCANE_UNUSED(requests);
567 }
568
569 // Les requetes sont forcement deja satisfaites.
571 {
572 ARCANE_UNUSED(requests);
573 return UniqueArray<Integer>();
574 }
576 {
577 return waitSomeRequests(requests);
578 }
579
580 ISerializeMessageList* _createSerializeMessageList() override
581 {
583 }
584 Real reduceRank(eReduceType rt,Real v,Int32* rank)
585 {
586 Real rv = reduce(rt,v);
587 if (rank)
588 *rank = 0;
589 return rv;
590 }
600 {
601 return new ParallelExchanger(this);
602 }
604 {
605 return createNullVariableSynchronizer(this,family->allItems());
606 }
608 {
609 return createNullVariableSynchronizer(this,group);
610 }
612 {
613 ParallelTopology* t = new ParallelTopology(this);
614 t->initialize();
615 return t;
616 }
617
619 {
620 return m_replication;
621 }
622
624 {
625 delete m_replication;
626 m_replication = v;
627 }
628
630 {
632 return makeRef(r);
633 }
634
636 {
637 return m_utils_factory;
638 }
639
641 {
642 return m_stat;
643 }
644
645 void build() override;
646
648
649 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
650
651 public:
652
653 static IParallelMng* create(const SequentialParallelMngBuildInfo& bi)
654 {
655 if (!bi.traceMng())
656 ARCANE_THROW(ArgumentException,"null traceMng()");
657 if (!bi.threadMng())
658 ARCANE_THROW(ArgumentException,"null threadMng()");
659 auto x = new SequentialParallelMng(bi);
660 x->build();
661 return x;
662 }
664 {
665 return makeRef(create(bi));
666 }
667
668 protected:
669
670 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override
671 {
672 ARCANE_UNUSED(kept_ranks);
673 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
674 bi.setThreadMng(m_thread_mng);
675 bi.setTraceMng(m_trace.get());
676 bi.setCommunicator(m_communicator);
677 return create(bi);
678 }
679
680 private:
681
682 ReferenceCounter<ITraceMng> m_trace;
683 IThreadMng* m_thread_mng = nullptr;
684 ITimerMng* m_timer_mng = nullptr;
685 IParallelMng* m_world_parallel_mng = nullptr;
686 IIOMng* m_io_mng;
687 Parallel::IStat* m_stat;
688 IParallelReplication* m_replication;
689 MP::Communicator m_communicator;
690 Ref<IParallelMngUtilsFactory> m_utils_factory;
691 IParallelMngInternal* m_parallel_mng_internal = nullptr;
692};
693
694/*---------------------------------------------------------------------------*/
695/*---------------------------------------------------------------------------*/
696
697extern "C++" IIOMng*
698arcaneCreateIOMng(IParallelMng* psm);
699
700/*---------------------------------------------------------------------------*/
701/*---------------------------------------------------------------------------*/
702
703extern "C++" IParallelMng*
704arcaneCreateSequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
705{
706 return SequentialParallelMng::create(bi);
707}
708extern "C++" Ref<IParallelMng>
709arcaneCreateSequentialParallelMngRef(const SequentialParallelMngBuildInfo& bi)
710{
711 return SequentialParallelMng::createRef(bi);
712}
713
714/*---------------------------------------------------------------------------*/
715/*---------------------------------------------------------------------------*/
716
718: public ParallelMngInternal
719{
720 public:
721
722 explicit Impl(SequentialParallelMng* pm)
723 : ParallelMngInternal(pm)
724 {}
725
726 ~Impl() override = default;
727
728 public:
729
731 {
732 return makeRef(new SequentialMachineMemoryWindowBaseInternal(sizeof_segment, sizeof_type));
733 }
734};
735
736/*---------------------------------------------------------------------------*/
737/*---------------------------------------------------------------------------*/
738
739SequentialParallelMng::
740SequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
742, m_trace(bi.traceMng())
743, m_thread_mng(bi.threadMng())
744, m_timer_mng(bi.m_timer_mng)
745, m_world_parallel_mng(bi.m_world_parallel_mng)
746, m_io_mng(nullptr)
747, m_stat(nullptr)
748, m_replication(new ParallelReplication())
749, m_communicator(bi.communicator())
751, m_parallel_mng_internal(new Impl(this))
752{
753 ARCANE_CHECK_PTR(m_trace);
754 ARCANE_CHECK_PTR(m_thread_mng);
755 if (!m_world_parallel_mng)
756 m_world_parallel_mng = this;
758 _messagePassingMng()->setCommunicator(m_communicator);
759}
760
761/*---------------------------------------------------------------------------*/
762/*---------------------------------------------------------------------------*/
763
764SequentialParallelMng::
765~SequentialParallelMng()
766{
767 delete m_parallel_mng_internal;
768 delete m_stat;
769 delete m_replication;
770 delete m_io_mng;
771}
772
773/*---------------------------------------------------------------------------*/
774/*---------------------------------------------------------------------------*/
775
776void SequentialParallelMng::
777setBaseObject(IBase* sd)
778{
779 ARCANE_UNUSED(sd);
780}
781
782/*---------------------------------------------------------------------------*/
783/*---------------------------------------------------------------------------*/
784
785namespace
786{
787// Classe pour créer les différents dispatchers
788class DispatchCreator
789{
790 public:
791 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
792 public:
793 template<typename DataType> SequentialParallelDispatchT<DataType>*
794 create()
795 {
796 return new SequentialParallelDispatchT<DataType>(m_tm);
797 }
798 ITraceMng* m_tm;
799};
800}
801
803build()
804{
805 m_io_mng = arcaneCreateIOMng(this);
806 DispatchCreator creator(m_trace.get());
807 this->createDispatchers(creator);
808}
809
810/*---------------------------------------------------------------------------*/
811/*---------------------------------------------------------------------------*/
812
815{
816 traceMng()->info() << "** ** MPI Communicator = " << getMPICommunicator();
817}
818
819/*---------------------------------------------------------------------------*/
820/*---------------------------------------------------------------------------*/
821
822/*---------------------------------------------------------------------------*/
823/*---------------------------------------------------------------------------*/
824
825// Construit un superviseur séquentiel lié au superviseur \a sm
826SequentialParallelSuperMng::
827SequentialParallelSuperMng(const ServiceBuildInfo& sbi)
828: AbstractService(sbi)
829, m_application(sbi.application())
830, m_thread_mng(new NullThreadMng())
831, m_timer_mng(nullptr)
832{
833}
834
835/*---------------------------------------------------------------------------*/
836/*---------------------------------------------------------------------------*/
837
838// Construit un superviseur séquentiel lié au superviseur \a sm
839SequentialParallelSuperMng::
840SequentialParallelSuperMng(const ServiceBuildInfo& sbi,Parallel::Communicator comm)
841: AbstractService(sbi)
842, m_application(sbi.application())
843, m_thread_mng(new NullThreadMng())
844, m_timer_mng(nullptr)
845, m_communicator(comm)
846{
847}
848
849/*---------------------------------------------------------------------------*/
850/*---------------------------------------------------------------------------*/
851
852// Construit un superviseur séquentiel lié au superviseur \a sm
853SequentialParallelSuperMng::
854~SequentialParallelSuperMng()
855{
856 delete m_thread_mng;
857}
858
859/*---------------------------------------------------------------------------*/
860/*---------------------------------------------------------------------------*/
861
873
874/*---------------------------------------------------------------------------*/
875/*---------------------------------------------------------------------------*/
876
878build()
879{
880 if (!m_timer_mng){
881 m_owned_timer_mng = new TimerMng(traceMng());
882 m_timer_mng = m_owned_timer_mng.get();
883 }
884}
885
886/*---------------------------------------------------------------------------*/
887/*---------------------------------------------------------------------------*/
888
891{
892 if (local_rank!=0)
893 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
894
895 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
896 bi.setThreadMng(threadMng());
897 bi.setTraceMng(traceMng());
898 bi.setCommunicator(communicator());
899 return SequentialParallelMng::createRef(bi);
900}
901
902/*---------------------------------------------------------------------------*/
903/*---------------------------------------------------------------------------*/
904
909
910/*---------------------------------------------------------------------------*/
911/*---------------------------------------------------------------------------*/
912
915
916/*---------------------------------------------------------------------------*/
917/*---------------------------------------------------------------------------*/
918
919class SequentialParallelMngBuilder
921{
922 public:
923 SequentialParallelMngBuilder(IApplication* app,Parallel::Communicator comm)
924 : m_application(app), m_thread_mng(new NullThreadMng()),
925 m_timer_mng(new TimerMng(app->traceMng())), m_communicator(comm){}
926 ~SequentialParallelMngBuilder() override
927 {
928 delete m_timer_mng;
929 delete m_thread_mng;
930 }
931
932 public:
933
934 void build() {}
935 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
936
937 public:
938 IApplication* m_application;
939 IThreadMng* m_thread_mng;
940 ITimerMng* m_timer_mng;
941 Parallel::Communicator m_communicator;
942};
943
944/*---------------------------------------------------------------------------*/
945/*---------------------------------------------------------------------------*/
946
948_createParallelMng(Int32 local_rank,ITraceMng* tm)
949{
950 if (local_rank!=0)
951 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
952
953 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
954 bi.setTraceMng(tm);
955 bi.setThreadMng(m_thread_mng);
956 bi.setCommunicator(m_communicator);
957 return arcaneCreateSequentialParallelMngRef(bi);
958}
959
960/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
962
963class SequentialParallelMngContainerFactory
964: public AbstractService
966{
967 public:
968 SequentialParallelMngContainerFactory(const ServiceBuildInfo& sbi)
969 : AbstractService(sbi), m_application(sbi.application()){}
970 public:
973 {
974 ARCANE_UNUSED(nb_rank);
975 auto x = new SequentialParallelMngBuilder(m_application,comm);
976 x->build();
978 }
979 private:
980 IApplication* m_application;
981};
982
983/*---------------------------------------------------------------------------*/
984/*---------------------------------------------------------------------------*/
985
987 ServiceProperty("SequentialParallelMngContainerFactory",ST_Application),
989
990/*---------------------------------------------------------------------------*/
991/*---------------------------------------------------------------------------*/
992
993} // End namespace Arcane
994
995/*---------------------------------------------------------------------------*/
996/*---------------------------------------------------------------------------*/
997
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#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.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Tableau d'items de types quelconques.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
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:31
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:36
Interface d'une famille d'entités.
Definition IItemFamily.h:84
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
Gestion des messages parallèles pour le type Type.
Échange d'informations entre processeurs.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Partie interne 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.
virtual void copy(const ISerializer *from)=0
Copie les données de from dans cette instance.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:49
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
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
Communicateur pour l'échange de message.
Classe permettant de créer une fenêtre mémoire pour un noeud de calcul.
Interface d'un message de sérialisation entre IMessagePassingMng.
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.
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.
virtual void initialize()
Initialise l'instance. Cette opération est collective.
Statistiques sur le parallélisme.
Référence à une instance.
void barrier() const override
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
void resizeSegment(const Int64 new_sizeof_segment) override
Méthode permettant de redimensionner les segments de la fenêtre.
ConstArrayView< Int32 > machineRanks() const override
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
Span< std::byte > segment(const Int32 rank) const override
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
Int32 sizeofOneElem() const override
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
Span< std::byte > window() const override
Méthode permettant d'obtenir une vue sur toute la fenêtre.
Span< std::byte > segment() const override
Méthode permettant d'obtenir une vue sur son segment.
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.
Ref< IMachineMemoryWindowBaseInternal > createMachineMemoryWindowBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire sur le noeud.
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.
IParallelMngInternal * _internalApi() override
API interne à Arcane.
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.
IApplication * application() const
Accès à l'application IApplication associé.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
__host__ __device__ void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:360
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
Chaîne de caractères unicode.
Gestionnaire de timer.
Definition TimerMng.h:39
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
#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.
eReduceType
Types des réductions supportées.
IStat * createDefaultStat()
Créé une instance par défaut.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Ref< TrueType > createRef(Args &&... args)
Créé une instance de type TrueType avec les arguments Args et retourne une référence dessus.
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:208
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
@ ST_Application
Le service s'utilise au niveau de l'application.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.
Type
Type of JSON value.
Definition rapidjson.h:665
Infos pour construire un SequentialParallelMng.