Arcane  v4.1.0.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#include "arccore/message_passing/internal/IDynamicMachineMemoryWindowBaseInternal.h"
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
65namespace Arcane
66{
69using namespace Arcane::MessagePassing;
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73
74extern "C++" IVariableSynchronizer*
75createNullVariableSynchronizer(IParallelMng* pm,const ItemGroup& group);
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
81: public RequestListBase
82{
83 public:
84 void _wait(Parallel::eWaitType wait_mode)
85 {
86 ARCANE_UNUSED(wait_mode);
87 }
88};
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
95template<class Type>
96class SequentialParallelDispatchT
97: public TraceAccessor
98, public IParallelDispatchT<Type>
99, public ITypeDispatcher<Type>
100{
101 public:
102 typedef Parallel::Request Request;
103 typedef Parallel::eReduceType eReduceType;
104 public:
105 SequentialParallelDispatchT(ITraceMng* tm)
106 : TraceAccessor(tm) {}
107 void finalize() override {}
108 public:
109 void broadcast(ArrayView<Type> send_buf,Int32 rank) override
110 {
111 ARCANE_UNUSED(send_buf);
112 ARCANE_UNUSED(rank);
113 }
114 void broadcast(Span<Type> send_buf,Int32 rank) override
115 {
116 ARCANE_UNUSED(send_buf);
117 ARCANE_UNUSED(rank);
118 }
119 void allGather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf) override
120 {
121 recv_buf.copy(send_buf);
122 }
123 void allGather(Span<const Type> send_buf,Span<Type> recv_buf) override
124 {
125 recv_buf.copy(send_buf);
126 }
127 void gather(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 rank) override
128 {
129 ARCANE_UNUSED(rank);
130 recv_buf.copy(send_buf);
131 }
132 void gather(Span<const Type> send_buf,Span<Type> recv_buf,Int32 rank) override
133 {
134 ARCANE_UNUSED(rank);
135 recv_buf.copy(send_buf);
136 }
137 void scatterVariable(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Int32 root) override
138 {
139 ARCANE_UNUSED(root);
140 recv_buf.copy(send_buf);
141 }
142 void scatterVariable(Span<const Type> send_buf,Span<Type> recv_buf,Int32 root) override
143 {
144 ARCANE_UNUSED(root);
145 recv_buf.copy(send_buf);
146 }
147 void allGatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf) override
148 {
149 gatherVariable(send_buf,recv_buf,0);
150 }
151 void allGatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf) override
152 {
153 gatherVariable(send_buf,recv_buf,0);
154 }
155 void gatherVariable(ConstArrayView<Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
156 {
157 ARCANE_UNUSED(rank);
158 recv_buf.resize(send_buf.size());
159 ArrayView<Type> av(recv_buf);
160 av.copy(send_buf);
161 }
162 void gatherVariable(Span<const Type> send_buf,Array<Type>& recv_buf,Int32 rank) override
163 {
164 ARCANE_UNUSED(rank);
165 recv_buf.resize(send_buf.size());
166 Span<Type> av(recv_buf.span());
167 av.copy(send_buf);
168 }
169 void allToAll(ConstArrayView<Type> send_buf,ArrayView<Type> recv_buf,Integer count) override
170 {
171 ARCANE_UNUSED(count);
172 recv_buf.copy(send_buf);
173 }
174 void allToAll(Span<const Type> send_buf,Span<Type> recv_buf,Int32 count) override
175 {
176 ARCANE_UNUSED(count);
177 recv_buf.copy(send_buf);
178 }
179 void allToAllVariable(ConstArrayView<Type> send_buf,
180 Int32ConstArrayView send_count,
181 Int32ConstArrayView send_index,
182 ArrayView<Type> recv_buf,
183 Int32ConstArrayView recv_count,
184 Int32ConstArrayView recv_index) override
185 {
186 ARCANE_UNUSED(send_count);
187 ARCANE_UNUSED(recv_count);
188 ARCANE_UNUSED(send_index);
189 ARCANE_UNUSED(recv_index);
190 recv_buf.copy(send_buf);
191 }
192 void allToAllVariable(Span<const Type> send_buf,
193 ConstArrayView<Int32> send_count,
194 ConstArrayView<Int32> send_index,
195 Span<Type> recv_buf,
196 ConstArrayView<Int32> recv_count,
197 ConstArrayView<Int32> recv_index) override
198 {
199 ARCANE_UNUSED(send_count);
200 ARCANE_UNUSED(recv_count);
201 ARCANE_UNUSED(send_index);
202 ARCANE_UNUSED(recv_index);
203 recv_buf.copy(send_buf);
204 }
205 Request send(ConstArrayView<Type> send_buffer,Int32 rank,bool is_blocked) override
206 {
207 return send(Span<const Type>(send_buffer),rank,is_blocked);
208 }
209 Request send(Span<const Type> send_buffer,Int32 rank,bool is_blocked) override
210 {
211 ARCANE_UNUSED(send_buffer);
212 ARCANE_UNUSED(rank);
213 if (is_blocked)
214 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
215 return Request();
216 }
217 Request send(Span<const Type> send_buffer,const PointToPointMessageInfo& message) override
218 {
219 ARCANE_UNUSED(send_buffer);
220 if (message.isBlocking())
221 throw NotSupportedException(A_FUNCINFO,"blocking send is not allowed in sequential");
222 return Request();
223 }
224 Request recv(ArrayView<Type> recv_buffer,Int32 rank,bool is_blocked) override
225 {
226 return receive(Span<Type>(recv_buffer),rank,is_blocked);
227 }
228 void send(ConstArrayView<Type> send_buffer,Int32 rank) override
229 {
230 ARCANE_UNUSED(send_buffer);
231 ARCANE_UNUSED(rank);
232 throw NotSupportedException(A_FUNCINFO,"send is not allowed in sequential");
233 }
234 void recv(ArrayView<Type> recv_buffer,Int32 rank) override
235 {
236 ARCANE_UNUSED(recv_buffer);
237 ARCANE_UNUSED(rank);
238 throw NotSupportedException(A_FUNCINFO,"recv is not allowed in sequential");
239 }
240 Request receive(Span<Type> recv_buffer,Int32 rank,bool is_blocked) override
241 {
242 ARCANE_UNUSED(recv_buffer);
243 ARCANE_UNUSED(rank);
244 if (is_blocked)
245 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
246 return Request();
247 }
248 Request receive(Span<Type> recv_buffer,const PointToPointMessageInfo& message) override
249 {
250 ARCANE_UNUSED(recv_buffer);
251 if (message.isBlocking())
252 throw NotSupportedException(A_FUNCINFO,"blocking receive is not allowed in sequential");
253 return Request();
254 }
255 void sendRecv(ConstArrayView<Type> send_buffer,ArrayView<Type> recv_buffer,Int32 rank) override
256 {
257 ARCANE_UNUSED(rank);
258 recv_buffer.copy(send_buffer);
259 }
260 Type allReduce(eReduceType op,Type v) override
261 {
262 ARCANE_UNUSED(op);
263 return v;
264 }
265 void allReduce(eReduceType op,ArrayView<Type> send_buf) override
266 {
267 ARCANE_UNUSED(op);
268 ARCANE_UNUSED(send_buf);
269 }
270 void allReduce(eReduceType op,Span<Type> send_buf) override
271 {
272 ARCANE_UNUSED(op);
273 ARCANE_UNUSED(send_buf);
274 }
275 Request nonBlockingAllReduce(eReduceType op,Span<const Type> send_buf,Span<Type> recv_buf) override
276 {
277 ARCANE_UNUSED(op);
278 ARCANE_UNUSED(send_buf);
279 ARCANE_UNUSED(recv_buf);
280 return Request();
281 }
282 Request nonBlockingAllGather(Span<const Type> send_buf, Span<Type> recv_buf) override
283 {
284 recv_buf.copy(send_buf);
285 return Request();
286 }
287 Request nonBlockingBroadcast(Span<Type> send_buf, Int32 rank) override
288 {
289 ARCANE_UNUSED(send_buf);
290 ARCANE_UNUSED(rank);
291 return Request();
292 }
293 Request nonBlockingGather(Span<const Type> send_buf, Span<Type> recv_buf, Int32 rank) override
294 {
295 ARCANE_UNUSED(rank);
296 recv_buf.copy(send_buf);
297 return Request();
298 }
299 Request nonBlockingAllToAll(Span<const Type> send_buf, Span<Type> recv_buf, Int32 count) override
300 {
301 ARCANE_UNUSED(count);
302 recv_buf.copy(send_buf);
303 return Request();
304 }
305 Request nonBlockingAllToAllVariable(Span<const Type> send_buf, ConstArrayView<Int32> send_count,
306 ConstArrayView<Int32> send_index, Span<Type> recv_buf,
307 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) override
308 {
309 ARCANE_UNUSED(send_count);
310 ARCANE_UNUSED(recv_count);
311 ARCANE_UNUSED(send_index);
312 ARCANE_UNUSED(recv_index);
313 recv_buf.copy(send_buf);
314 return Request();
315 }
316 Type scan(eReduceType op,Type v) override
317 {
318 ARCANE_UNUSED(op);
319 return v;
320 }
321 void scan(eReduceType op,ArrayView<Type> send_buf) override
322 {
323 ARCANE_UNUSED(op);
324 ARCANE_UNUSED(send_buf);
325 }
326 void computeMinMaxSum(Type val,Type& min_val,Type& max_val,Type& sum_val,
327 Int32& min_rank,
328 Int32& max_rank) override
329 {
330 min_val = max_val = sum_val = val;
331 min_rank = max_rank = 0;
332 }
333 void computeMinMaxSum(ConstArrayView<Type> values,
334 ArrayView<Type> min_values,
335 ArrayView<Type> max_values,
336 ArrayView<Type> sum_values,
337 ArrayView<Int32> min_ranks,
338 ArrayView<Int32> max_ranks) override
339 {
340 const Integer n = values.size();
341 for(Integer i=0;i<n;++i) {
342 min_values[i] = max_values[i] = sum_values[i] = values[i];
343 min_ranks[i] = max_ranks[i] = 0;
344 }
345 }
346 ITypeDispatcher<Type>* toArccoreDispatcher() override { return this; }
347};
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
352class SequentialMachineMemoryWindowBaseInternal
354{
355 public:
356
357 SequentialMachineMemoryWindowBaseInternal(Int64 sizeof_segment, Int32 sizeof_type)
358 : m_sizeof_segment(sizeof_segment)
359 , m_max_sizeof_segment(sizeof_segment)
360 , m_sizeof_type(sizeof_type)
361 , m_segment(sizeof_segment)
362 {}
363
364 ~SequentialMachineMemoryWindowBaseInternal() override = default;
365
366 public:
367
368 Int32 sizeofOneElem() const override
369 {
370 return m_sizeof_type;
371 }
372
374 {
375 return m_segment.span().subSpan(0, m_sizeof_segment);
376 }
377 Span<std::byte> segmentView(const Int32 rank) override
378 {
379 if (rank != 0) {
380 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
381 }
382 return m_segment.span().subSpan(0, m_sizeof_segment);
383 }
385 {
386 return m_segment.span().subSpan(0, m_sizeof_segment);
387 }
388
390 {
391 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
392 }
394 {
395 if (rank != 0) {
396 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
397 }
398 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
399 }
401 {
402 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
403 }
404
405 void resizeSegment(const Int64 new_sizeof_segment) override
406 {
407 if (new_sizeof_segment > m_max_sizeof_segment) {
408 ARCANE_FATAL("New size of window (sum of size of all segments) is superior than the old size");
409 }
410 m_sizeof_segment = new_sizeof_segment;
411 }
412
414 {
415 return ConstArrayView<Int32>{ 1, &m_my_rank };
416 }
417
418 void barrier() const override {}
419
420 private:
421
422 Int64 m_sizeof_segment = 0;
423 Int64 m_max_sizeof_segment = 0;
424
425 Int32 m_sizeof_type = 0;
426 UniqueArray<std::byte> m_segment;
427 Int32 m_my_rank = 0;
428};
429
430/*---------------------------------------------------------------------------*/
431/*---------------------------------------------------------------------------*/
432
433class SequentialDynamicMachineMemoryWindowBaseInternal
435{
436 public:
437
438 SequentialDynamicMachineMemoryWindowBaseInternal(Int64 sizeof_segment, Int32 sizeof_type)
439 : m_sizeof_type(sizeof_type)
440 , m_segment(sizeof_segment)
441 {}
442 ~SequentialDynamicMachineMemoryWindowBaseInternal() override = default;
443
444 public:
445
446 Int32 sizeofOneElem() const override
447 {
448 return m_sizeof_type;
449 }
451 {
452 return ConstArrayView<Int32>{ 1, &m_my_rank };
453 }
454 void barrier() const override {}
455
457 {
458 return m_segment;
459 }
461 {
462 if (rank != 0) {
463 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
464 }
465 return m_segment;
466 }
468 {
469 return m_segment;
470 }
472 {
473 if (rank != 0) {
474 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
475 }
476 return m_segment;
477 }
478 void add(Span<const std::byte> elem) override
479 {
480 if (elem.size() % m_sizeof_type != 0) {
481 ARCCORE_FATAL("Sizeof elem not valid");
482 }
483 m_segment.addRange(elem);
484 }
485 void add() override {}
487 {
488 if (rank != 0) {
489 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
490 }
491 if (elem.size() % m_sizeof_type != 0) {
492 ARCCORE_FATAL("Sizeof elem not valid");
493 }
494 m_segment.addRange(elem);
495 }
496 void addToAnotherSegment() override {}
497
498 void reserve(Int64 new_capacity) override
499 {
500 m_segment.reserve(new_capacity);
501 }
502 void reserve() override {}
503 void resize(Int64 new_size) override
504 {
505 m_segment.resize(new_size);
506 }
507 void resize() override {}
508 void shrink() override
509 {
510 m_segment.shrink();
511 }
512
513 private:
514
515 Int32 m_sizeof_type;
516 UniqueArray<std::byte> m_segment;
517 Int32 m_my_rank = 0;
518};
519
520/*---------------------------------------------------------------------------*/
521/*---------------------------------------------------------------------------*/
522
525{
526 public:
532 {
533 return makeRef(createNullVariableSynchronizer(pm,family->allItems()));
534 }
536 {
537 return makeRef(createNullVariableSynchronizer(pm,group));
538 }
539};
540
541/*---------------------------------------------------------------------------*/
542/*---------------------------------------------------------------------------*/
549class SequentialParallelMng
550: public ParallelMngDispatcher
551{
552 public:
553
554 class Impl;
555
556 private:
557 // Construit un gestionnaire séquentiel.
558 SequentialParallelMng(const SequentialParallelMngBuildInfo& bi);
559 public:
560 ~SequentialParallelMng();
561
562 bool isParallel() const override { return false; }
563 Int32 commRank() const override { return 0; }
564 Int32 commSize() const override { return 1; }
565 void* getMPICommunicator() override { return m_communicator.communicatorAddress(); }
566 Parallel::Communicator communicator() const override { return m_communicator; }
567 Parallel::Communicator machineCommunicator() const override { return m_communicator; }
568 bool isThreadImplementation() const override { return false; }
569 bool isHybridImplementation() const override { return false; }
570 void setBaseObject(IBase* m);
571 ITraceMng* traceMng() const override { return m_trace.get(); }
572 IThreadMng* threadMng() const override { return m_thread_mng; }
573 ITimerMng* timerMng() const override { return m_timer_mng; }
574 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
575 IIOMng* ioMng() const override { return m_io_mng; }
576
577 void initialize() override ;
578 bool isMasterIO() const override { return true; }
579 Int32 masterIORank() const override { return 0; }
580
581 public:
582
583 void allGather(ISerializer* send_serializer, ISerializer* recv_serializer) override
584 {
585 recv_serializer->copy(send_serializer);
586 }
587 void sendSerializer(ISerializer* values,Int32 rank) override
588 {
589 ARCANE_UNUSED(values);
590 ARCANE_UNUSED(rank);
591 }
592 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override
593 {
594 ARCANE_UNUSED(values);
595 ARCANE_UNUSED(rank);
596 ARCANE_UNUSED(bytes);
597 return Parallel::Request();
598 }
600 {
601 ARCANE_UNUSED(rank);
602 return new SerializeMessage(0,0,ISerializeMessage::MT_Send);
603 }
604 void recvSerializer(ISerializer* values,Int32 rank) override
605 {
606 ARCANE_UNUSED(values);
607 ARCANE_UNUSED(rank);
608 }
610 {
611 ARCANE_UNUSED(rank);
612 return new SerializeMessage(0,0,ISerializeMessage::MT_Recv);
613 }
614
615 void broadcastString(String& str,Int32 rank) override
616 {
617 ARCANE_UNUSED(str);
618 ARCANE_UNUSED(rank);
619 }
620 void broadcastMemoryBuffer(ByteArray& bytes,Int32 rank) override
621 {
622 ARCANE_UNUSED(bytes);
623 ARCANE_UNUSED(rank);
624 }
625 void broadcastSerializer(ISerializer* values,Int32 rank) override
626 {
627 ARCANE_UNUSED(values);
628 ARCANE_UNUSED(rank);
629 }
630 MessageId probe(const PointToPointMessageInfo& message) override
631 {
632 ARCANE_UNUSED(message);
633 return MessageId();
634 }
636 {
637 ARCANE_UNUSED(message);
638 return MessageSourceInfo();
639 }
640 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override
641 {
642 ARCANE_UNUSED(values);
643 ARCANE_UNUSED(message);
644 return Parallel::Request();
645 }
646 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override
647 {
648 ARCANE_UNUSED(values);
649 ARCANE_UNUSED(message);
650 return Parallel::Request();
651 }
652
654 {
655 ARCANE_UNUSED(messages);
656 }
658 {
659 ARCANE_UNUSED(requests);
660 }
661
662 void printStats() override {}
663 void barrier() override {}
664
665 IParallelMng* sequentialParallelMng() override { return this; }
666 Ref<IParallelMng> sequentialParallelMngRef() override { return makeRef<IParallelMng>(this); }
667
668 void waitAllRequests(ArrayView<Request> requests) override
669 {
670 ARCANE_UNUSED(requests);
671 }
672
673 // Les requetes sont forcement deja satisfaites.
675 {
676 ARCANE_UNUSED(requests);
677 return UniqueArray<Integer>();
678 }
680 {
681 return waitSomeRequests(requests);
682 }
683
684 ISerializeMessageList* _createSerializeMessageList() override
685 {
687 }
688 Real reduceRank(eReduceType rt,Real v,Int32* rank)
689 {
690 Real rv = reduce(rt,v);
691 if (rank)
692 *rank = 0;
693 return rv;
694 }
704 {
705 return new ParallelExchanger(this);
706 }
708 {
709 return createNullVariableSynchronizer(this,family->allItems());
710 }
712 {
713 return createNullVariableSynchronizer(this,group);
714 }
716 {
717 ParallelTopology* t = new ParallelTopology(this);
718 t->initialize();
719 return t;
720 }
721
723 {
724 return m_replication;
725 }
726
728 {
729 delete m_replication;
730 m_replication = v;
731 }
732
734 {
736 return makeRef(r);
737 }
738
740 {
741 return m_utils_factory;
742 }
743
745 {
746 return m_stat;
747 }
748
749 void build() override;
750
752
753 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
754
755 public:
756
757 static IParallelMng* create(const SequentialParallelMngBuildInfo& bi)
758 {
759 if (!bi.traceMng())
760 ARCANE_THROW(ArgumentException,"null traceMng()");
761 if (!bi.threadMng())
762 ARCANE_THROW(ArgumentException,"null threadMng()");
763 auto x = new SequentialParallelMng(bi);
764 x->build();
765 return x;
766 }
768 {
769 return makeRef(create(bi));
770 }
771
772 protected:
773
774 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override
775 {
776 ARCANE_UNUSED(kept_ranks);
777 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
778 bi.setThreadMng(m_thread_mng);
779 bi.setTraceMng(m_trace.get());
780 bi.setCommunicator(m_communicator);
781 return create(bi);
782 }
783
784 private:
785
786 ReferenceCounter<ITraceMng> m_trace;
787 IThreadMng* m_thread_mng = nullptr;
788 ITimerMng* m_timer_mng = nullptr;
789 IParallelMng* m_world_parallel_mng = nullptr;
790 IIOMng* m_io_mng;
791 Parallel::IStat* m_stat;
792 IParallelReplication* m_replication;
793 MP::Communicator m_communicator;
794 Ref<IParallelMngUtilsFactory> m_utils_factory;
795 IParallelMngInternal* m_parallel_mng_internal = nullptr;
796};
797
798/*---------------------------------------------------------------------------*/
799/*---------------------------------------------------------------------------*/
800
801extern "C++" IIOMng*
802arcaneCreateIOMng(IParallelMng* psm);
803
804/*---------------------------------------------------------------------------*/
805/*---------------------------------------------------------------------------*/
806
807extern "C++" IParallelMng*
808arcaneCreateSequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
809{
810 return SequentialParallelMng::create(bi);
811}
812extern "C++" Ref<IParallelMng>
813arcaneCreateSequentialParallelMngRef(const SequentialParallelMngBuildInfo& bi)
814{
815 return SequentialParallelMng::createRef(bi);
816}
817
818/*---------------------------------------------------------------------------*/
819/*---------------------------------------------------------------------------*/
820
822: public ParallelMngInternal
823{
824 public:
825
826 explicit Impl(SequentialParallelMng* pm)
827 : ParallelMngInternal(pm)
828 {}
829
830 ~Impl() override = default;
831
832 public:
833
835 {
836 return makeRef(new SequentialMachineMemoryWindowBaseInternal(sizeof_segment, sizeof_type));
837 }
838
840 {
841 return makeRef(new SequentialDynamicMachineMemoryWindowBaseInternal(sizeof_segment, sizeof_type));
842 }
843};
844
845/*---------------------------------------------------------------------------*/
846/*---------------------------------------------------------------------------*/
847
848SequentialParallelMng::
849SequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
851, m_trace(bi.traceMng())
852, m_thread_mng(bi.threadMng())
853, m_timer_mng(bi.m_timer_mng)
854, m_world_parallel_mng(bi.m_world_parallel_mng)
855, m_io_mng(nullptr)
856, m_stat(nullptr)
857, m_replication(new ParallelReplication())
858, m_communicator(bi.communicator())
860, m_parallel_mng_internal(new Impl(this))
861{
862 ARCANE_CHECK_PTR(m_trace);
863 ARCANE_CHECK_PTR(m_thread_mng);
864 if (!m_world_parallel_mng)
865 m_world_parallel_mng = this;
867 _messagePassingMng()->setCommunicator(m_communicator);
868}
869
870/*---------------------------------------------------------------------------*/
871/*---------------------------------------------------------------------------*/
872
873SequentialParallelMng::
874~SequentialParallelMng()
875{
876 delete m_parallel_mng_internal;
877 delete m_stat;
878 delete m_replication;
879 delete m_io_mng;
880}
881
882/*---------------------------------------------------------------------------*/
883/*---------------------------------------------------------------------------*/
884
885void SequentialParallelMng::
886setBaseObject(IBase* sd)
887{
888 ARCANE_UNUSED(sd);
889}
890
891/*---------------------------------------------------------------------------*/
892/*---------------------------------------------------------------------------*/
893
894namespace
895{
896// Classe pour créer les différents dispatchers
897class DispatchCreator
898{
899 public:
900 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
901 public:
902 template<typename DataType> SequentialParallelDispatchT<DataType>*
903 create()
904 {
905 return new SequentialParallelDispatchT<DataType>(m_tm);
906 }
907 ITraceMng* m_tm;
908};
909}
910
912build()
913{
914 m_io_mng = arcaneCreateIOMng(this);
915 DispatchCreator creator(m_trace.get());
916 this->createDispatchers(creator);
917}
918
919/*---------------------------------------------------------------------------*/
920/*---------------------------------------------------------------------------*/
921
924{
925 traceMng()->info() << "** ** MPI Communicator = " << getMPICommunicator();
926}
927
928/*---------------------------------------------------------------------------*/
929/*---------------------------------------------------------------------------*/
930
931/*---------------------------------------------------------------------------*/
932/*---------------------------------------------------------------------------*/
933
934// Construit un superviseur séquentiel lié au superviseur \a sm
935SequentialParallelSuperMng::
936SequentialParallelSuperMng(const ServiceBuildInfo& sbi)
937: AbstractService(sbi)
938, m_application(sbi.application())
939, m_thread_mng(new NullThreadMng())
940, m_timer_mng(nullptr)
941{
942}
943
944/*---------------------------------------------------------------------------*/
945/*---------------------------------------------------------------------------*/
946
947// Construit un superviseur séquentiel lié au superviseur \a sm
948SequentialParallelSuperMng::
949SequentialParallelSuperMng(const ServiceBuildInfo& sbi,Parallel::Communicator comm)
950: AbstractService(sbi)
951, m_application(sbi.application())
952, m_thread_mng(new NullThreadMng())
953, m_timer_mng(nullptr)
954, m_communicator(comm)
955{
956}
957
958/*---------------------------------------------------------------------------*/
959/*---------------------------------------------------------------------------*/
960
961// Construit un superviseur séquentiel lié au superviseur \a sm
962SequentialParallelSuperMng::
963~SequentialParallelSuperMng()
964{
965 delete m_thread_mng;
966}
967
968/*---------------------------------------------------------------------------*/
969/*---------------------------------------------------------------------------*/
970
982
983/*---------------------------------------------------------------------------*/
984/*---------------------------------------------------------------------------*/
985
987build()
988{
989 if (!m_timer_mng){
990 m_owned_timer_mng = new TimerMng(traceMng());
991 m_timer_mng = m_owned_timer_mng.get();
992 }
993}
994
995/*---------------------------------------------------------------------------*/
996/*---------------------------------------------------------------------------*/
997
1000{
1001 if (local_rank!=0)
1002 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
1003
1004 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
1005 bi.setThreadMng(threadMng());
1006 bi.setTraceMng(traceMng());
1007 bi.setCommunicator(communicator());
1008 return SequentialParallelMng::createRef(bi);
1009}
1010
1011/*---------------------------------------------------------------------------*/
1012/*---------------------------------------------------------------------------*/
1013
1018
1019/*---------------------------------------------------------------------------*/
1020/*---------------------------------------------------------------------------*/
1021
1024
1025/*---------------------------------------------------------------------------*/
1026/*---------------------------------------------------------------------------*/
1027
1028class SequentialParallelMngBuilder
1030{
1031 public:
1032 SequentialParallelMngBuilder(IApplication* app,Parallel::Communicator comm)
1033 : m_application(app), m_thread_mng(new NullThreadMng()),
1034 m_timer_mng(new TimerMng(app->traceMng())), m_communicator(comm){}
1035 ~SequentialParallelMngBuilder() override
1036 {
1037 delete m_timer_mng;
1038 delete m_thread_mng;
1039 }
1040
1041 public:
1042
1043 void build() {}
1044 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
1045
1046 public:
1047 IApplication* m_application;
1048 IThreadMng* m_thread_mng;
1049 ITimerMng* m_timer_mng;
1050 Parallel::Communicator m_communicator;
1051};
1052
1053/*---------------------------------------------------------------------------*/
1054/*---------------------------------------------------------------------------*/
1055
1057_createParallelMng(Int32 local_rank,ITraceMng* tm)
1058{
1059 if (local_rank!=0)
1060 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
1061
1062 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
1063 bi.setTraceMng(tm);
1064 bi.setThreadMng(m_thread_mng);
1065 bi.setCommunicator(m_communicator);
1066 return arcaneCreateSequentialParallelMngRef(bi);
1067}
1068
1069/*---------------------------------------------------------------------------*/
1070/*---------------------------------------------------------------------------*/
1071
1072class SequentialParallelMngContainerFactory
1073: public AbstractService
1075{
1076 public:
1077 SequentialParallelMngContainerFactory(const ServiceBuildInfo& sbi)
1078 : AbstractService(sbi), m_application(sbi.application()){}
1079 public:
1082 {
1083 ARCANE_UNUSED(nb_rank);
1084 ARCANE_UNUSED(machine_comm);
1085 auto x = new SequentialParallelMngBuilder(m_application,comm);
1086 x->build();
1088 }
1089 private:
1090 IApplication* m_application;
1091};
1092
1093/*---------------------------------------------------------------------------*/
1094/*---------------------------------------------------------------------------*/
1095
1097 ServiceProperty("SequentialParallelMngContainerFactory",ST_Application),
1099
1100/*---------------------------------------------------------------------------*/
1101/*---------------------------------------------------------------------------*/
1102
1103} // End namespace Arcane
1104
1105/*---------------------------------------------------------------------------*/
1106/*---------------------------------------------------------------------------*/
1107
#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 des fenêtres mémoires pour un noeud de calcul.
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.
Span< std::byte > segmentView(Int32 rank) override
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
void resize(Int64 new_size) override
Méthode permettant de redimensionner notre segment.
void barrier() const override
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
Int32 sizeofOneElem() const override
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
void addToAnotherSegment(Int32 rank, Span< const std::byte > elem) override
Méthode permettant d'ajouter des éléments dans le segment d'un autre sous-domaine.
ConstArrayView< Int32 > machineRanks() const override
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
Span< const std::byte > segmentConstView() const override
Méthode permettant d'obtenir une vue sur notre segment.
void add(Span< const std::byte > elem) override
Méthode permettant d'ajouter des élements dans notre segment.
Span< const std::byte > segmentConstView(Int32 rank) const override
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
Span< std::byte > segmentView() override
Méthode permettant d'obtenir une vue sur notre segment.
void reserve(Int64 new_capacity) override
Méthode permettant de réserver de l'espace mémoire dans notre segment.
void shrink() override
Méthode permettant de réduire l'espace mémoire réservé pour les segments au minimum nécessaire.
Span< std::byte > segmentView() override
Méthode permettant d'obtenir une vue sur son segment.
Span< std::byte > segmentView(const Int32 rank) override
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
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 > windowView() override
Méthode permettant d'obtenir une vue sur toute la fenêtre.
Int32 sizeofOneElem() const override
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
Span< const std::byte > segmentConstView(const Int32 rank) const override
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
Span< const std::byte > segmentConstView() const override
Méthode permettant d'obtenir une vue sur son segment.
Span< const std::byte > windowConstView() const override
Méthode permettant d'obtenir une vue sur toute la fenêtre.
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, Parallel::Communicator machine_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.
Ref< IDynamicMachineMemoryWindowBaseInternal > createDynamicMachineMemoryWindowBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire dynamique 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.
Parallel::Communicator machineCommunicator() const override
Communicateur MPI issus du communicateur communicator() réunissant tous les processus du noeud de cal...
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:475
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:325
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:733
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:137
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:498
@ 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:730
Infos pour construire un SequentialParallelMng.