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