Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SequentialParallelMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-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/MachineShMemWinMemoryAllocator.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/IContigMachineShMemWinBaseInternal.h"
61#include "arccore/message_passing/internal/IMachineShMemWinBaseInternal.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, ConstArrayView<Type> send_buf, ArrayView<Type> receive_buf) override
272 {
273 ARCANE_UNUSED(op);
274 receive_buf.copy(send_buf);
275 }
276 void allReduce(eReduceType op, Span<Type> send_buf) override
277 {
278 ARCANE_UNUSED(op);
279 ARCANE_UNUSED(send_buf);
280 }
281 void allReduce(eReduceType op, Span<const Type> send_buf, Span<Type> receive_buf) override
282 {
283 ARCANE_UNUSED(op);
284 receive_buf.copy(send_buf);
285 }
286 Request nonBlockingAllReduce(eReduceType op, Span<const Type> send_buf, Span<Type> recv_buf) override
287 {
288 ARCANE_UNUSED(op);
289 ARCANE_UNUSED(send_buf);
290 ARCANE_UNUSED(recv_buf);
291 return Request();
292 }
293 Request nonBlockingAllGather(Span<const Type> send_buf, Span<Type> recv_buf) override
294 {
295 recv_buf.copy(send_buf);
296 return Request();
297 }
298 Request nonBlockingBroadcast(Span<Type> send_buf, Int32 rank) override
299 {
300 ARCANE_UNUSED(send_buf);
301 ARCANE_UNUSED(rank);
302 return Request();
303 }
304 Request nonBlockingGather(Span<const Type> send_buf, Span<Type> recv_buf, Int32 rank) override
305 {
306 ARCANE_UNUSED(rank);
307 recv_buf.copy(send_buf);
308 return Request();
309 }
310 Request nonBlockingAllToAll(Span<const Type> send_buf, Span<Type> recv_buf, Int32 count) override
311 {
312 ARCANE_UNUSED(count);
313 recv_buf.copy(send_buf);
314 return Request();
315 }
316 Request nonBlockingAllToAllVariable(Span<const Type> send_buf, ConstArrayView<Int32> send_count,
317 ConstArrayView<Int32> send_index, Span<Type> recv_buf,
318 ConstArrayView<Int32> recv_count, ConstArrayView<Int32> recv_index) override
319 {
320 ARCANE_UNUSED(send_count);
321 ARCANE_UNUSED(recv_count);
322 ARCANE_UNUSED(send_index);
323 ARCANE_UNUSED(recv_index);
324 recv_buf.copy(send_buf);
325 return Request();
326 }
327 Type scan(eReduceType op,Type v) override
328 {
329 ARCANE_UNUSED(op);
330 return v;
331 }
332 void scan(eReduceType op,ArrayView<Type> send_buf) override
333 {
334 ARCANE_UNUSED(op);
335 ARCANE_UNUSED(send_buf);
336 }
337 void computeMinMaxSum(Type val,Type& min_val,Type& max_val,Type& sum_val,
338 Int32& min_rank,
339 Int32& max_rank) override
340 {
341 min_val = max_val = sum_val = val;
342 min_rank = max_rank = 0;
343 }
344 void computeMinMaxSum(ConstArrayView<Type> values,
345 ArrayView<Type> min_values,
346 ArrayView<Type> max_values,
347 ArrayView<Type> sum_values,
348 ArrayView<Int32> min_ranks,
349 ArrayView<Int32> max_ranks) override
350 {
351 const Integer n = values.size();
352 for(Integer i=0;i<n;++i) {
353 min_values[i] = max_values[i] = sum_values[i] = values[i];
354 min_ranks[i] = max_ranks[i] = 0;
355 }
356 }
357 ITypeDispatcher<Type>* toArccoreDispatcher() override { return this; }
358};
359
360/*---------------------------------------------------------------------------*/
361/*---------------------------------------------------------------------------*/
362
363class SequentialContigMachineShMemWinBaseInternal
365{
366 public:
367
368 SequentialContigMachineShMemWinBaseInternal(Int64 sizeof_segment, Int32 sizeof_type)
369 : m_sizeof_segment(sizeof_segment)
370 , m_max_sizeof_segment(sizeof_segment)
371 , m_sizeof_type(sizeof_type)
372 , m_segment(sizeof_segment)
373 {}
374
375 ~SequentialContigMachineShMemWinBaseInternal() override = default;
376
377 public:
378
379 Int32 sizeofOneElem() const override
380 {
381 return m_sizeof_type;
382 }
383
385 {
386 return m_segment.span().subSpan(0, m_sizeof_segment);
387 }
388 Span<std::byte> segmentView(const Int32 rank) override
389 {
390 if (rank != 0) {
391 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
392 }
393 return m_segment.span().subSpan(0, m_sizeof_segment);
394 }
396 {
397 return m_segment.span().subSpan(0, m_sizeof_segment);
398 }
399
401 {
402 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
403 }
405 {
406 if (rank != 0) {
407 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
408 }
409 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
410 }
412 {
413 return m_segment.constSpan().subSpan(0, m_sizeof_segment);
414 }
415
416 void resizeSegment(const Int64 new_sizeof_segment) override
417 {
418 if (new_sizeof_segment > m_max_sizeof_segment) {
419 ARCANE_FATAL("New size of window (sum of size of all segments) is superior than the old size");
420 }
421 m_sizeof_segment = new_sizeof_segment;
422 }
423
425 {
426 return ConstArrayView<Int32>{ 1, &m_my_rank };
427 }
428
429 void barrier() const override {}
430
431 private:
432
433 Int64 m_sizeof_segment = 0;
434 Int64 m_max_sizeof_segment = 0;
435
436 Int32 m_sizeof_type = 0;
437 UniqueArray<std::byte> m_segment;
438 Int32 m_my_rank = 0;
439};
440
441/*---------------------------------------------------------------------------*/
442/*---------------------------------------------------------------------------*/
443
444class SequentialMachineShMemWinBaseInternal
446{
447 public:
448
449 SequentialMachineShMemWinBaseInternal(Int64 sizeof_segment, Int32 sizeof_type)
450 : m_sizeof_type(sizeof_type)
451 , m_segment(sizeof_segment)
452 {}
453 ~SequentialMachineShMemWinBaseInternal() override = default;
454
455 public:
456
457 Int32 sizeofOneElem() const override
458 {
459 return m_sizeof_type;
460 }
462 {
463 return ConstArrayView<Int32>{ 1, &m_my_rank };
464 }
465 void barrier() const override {}
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 }
479 {
480 return m_segment;
481 }
483 {
484 if (rank != 0) {
485 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
486 }
487 return m_segment;
488 }
489 void add(Span<const std::byte> elem) override
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 add() override {}
498 {
499 if (rank != 0) {
500 ARCANE_FATAL("Rank {0} is unavailable (Sequential)", rank);
501 }
502 if (elem.size() % m_sizeof_type != 0) {
503 ARCCORE_FATAL("Sizeof elem not valid");
504 }
505 m_segment.addRange(elem);
506 }
507 void addToAnotherSegment() override {}
508
509 void reserve(Int64 new_capacity) override
510 {
511 m_segment.reserve(new_capacity);
512 }
513 void reserve() override {}
514 void resize(Int64 new_size) override
515 {
516 m_segment.resize(new_size);
517 }
518 void resize() override {}
519 void shrink() override
520 {
521 m_segment.shrink();
522 }
523
524 private:
525
526 Int32 m_sizeof_type;
527 UniqueArray<std::byte> m_segment;
528 Int32 m_my_rank = 0;
529};
530
531/*---------------------------------------------------------------------------*/
532/*---------------------------------------------------------------------------*/
533
536{
537 public:
543 {
544 return makeRef(createNullVariableSynchronizer(pm,family->allItems()));
545 }
547 {
548 return makeRef(createNullVariableSynchronizer(pm,group));
549 }
550};
551
552/*---------------------------------------------------------------------------*/
553/*---------------------------------------------------------------------------*/
560class SequentialParallelMng
561: public ParallelMngDispatcher
562{
563 public:
564
565 class Impl;
566
567 private:
568 // Construit un gestionnaire séquentiel.
569 SequentialParallelMng(const SequentialParallelMngBuildInfo& bi);
570 public:
571 ~SequentialParallelMng();
572
573 bool isParallel() const override { return false; }
574 Int32 commRank() const override { return 0; }
575 Int32 commSize() const override { return 1; }
576 void* getMPICommunicator() override { return m_communicator.communicatorAddress(); }
577 Parallel::Communicator communicator() const override { return m_communicator; }
578 Parallel::Communicator machineCommunicator() const override { return m_communicator; }
579 bool isThreadImplementation() const override { return false; }
580 bool isHybridImplementation() const override { return false; }
581 void setBaseObject(IBase* m);
582 ITraceMng* traceMng() const override { return m_trace.get(); }
583 IThreadMng* threadMng() const override { return m_thread_mng; }
584 ITimerMng* timerMng() const override { return m_timer_mng; }
585 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
586 IIOMng* ioMng() const override { return m_io_mng; }
587
588 void initialize() override ;
589 bool isMasterIO() const override { return true; }
590 Int32 masterIORank() const override { return 0; }
591
592 public:
593
594 void allGather(ISerializer* send_serializer, ISerializer* recv_serializer) override
595 {
596 recv_serializer->copy(send_serializer);
597 }
598 void sendSerializer(ISerializer* values,Int32 rank) override
599 {
600 ARCANE_UNUSED(values);
601 ARCANE_UNUSED(rank);
602 }
603 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override
604 {
605 ARCANE_UNUSED(values);
606 ARCANE_UNUSED(rank);
607 ARCANE_UNUSED(bytes);
608 return Parallel::Request();
609 }
611 {
612 ARCANE_UNUSED(rank);
613 return new SerializeMessage(0,0,ISerializeMessage::MT_Send);
614 }
615 void recvSerializer(ISerializer* values,Int32 rank) override
616 {
617 ARCANE_UNUSED(values);
618 ARCANE_UNUSED(rank);
619 }
621 {
622 ARCANE_UNUSED(rank);
623 return new SerializeMessage(0,0,ISerializeMessage::MT_Recv);
624 }
625
626 void broadcastString(String& str,Int32 rank) override
627 {
628 ARCANE_UNUSED(str);
629 ARCANE_UNUSED(rank);
630 }
631 void broadcastMemoryBuffer(ByteArray& bytes,Int32 rank) override
632 {
633 ARCANE_UNUSED(bytes);
634 ARCANE_UNUSED(rank);
635 }
636 void broadcastSerializer(ISerializer* values,Int32 rank) override
637 {
638 ARCANE_UNUSED(values);
639 ARCANE_UNUSED(rank);
640 }
641 MessageId probe(const PointToPointMessageInfo& message) override
642 {
643 ARCANE_UNUSED(message);
644 return MessageId();
645 }
647 {
648 ARCANE_UNUSED(message);
649 return MessageSourceInfo();
650 }
651 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override
652 {
653 ARCANE_UNUSED(values);
654 ARCANE_UNUSED(message);
655 return Parallel::Request();
656 }
657 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override
658 {
659 ARCANE_UNUSED(values);
660 ARCANE_UNUSED(message);
661 return Parallel::Request();
662 }
663
665 {
666 ARCANE_UNUSED(messages);
667 }
669 {
670 ARCANE_UNUSED(requests);
671 }
672
673 void printStats() override {}
674 void barrier() override {}
675
676 IParallelMng* sequentialParallelMng() override { return this; }
677 Ref<IParallelMng> sequentialParallelMngRef() override { return makeRef<IParallelMng>(this); }
678
679 void waitAllRequests(ArrayView<Request> requests) override
680 {
681 ARCANE_UNUSED(requests);
682 }
683
684 // Les requetes sont forcement deja satisfaites.
686 {
687 ARCANE_UNUSED(requests);
688 return UniqueArray<Integer>();
689 }
691 {
692 return waitSomeRequests(requests);
693 }
694
695 ISerializeMessageList* _createSerializeMessageList() override
696 {
698 }
699 Real reduceRank(eReduceType rt,Real v,Int32* rank)
700 {
701 Real rv = reduce(rt,v);
702 if (rank)
703 *rank = 0;
704 return rv;
705 }
715 {
716 return new ParallelExchanger(this);
717 }
719 {
720 return createNullVariableSynchronizer(this,family->allItems());
721 }
723 {
724 return createNullVariableSynchronizer(this,group);
725 }
727 {
728 ParallelTopology* t = new ParallelTopology(this);
729 t->initialize();
730 return t;
731 }
732
734 {
735 return m_replication;
736 }
737
739 {
740 delete m_replication;
741 m_replication = v;
742 }
743
745 {
747 return makeRef(r);
748 }
749
751 {
752 return m_utils_factory;
753 }
754
756 {
757 return m_stat;
758 }
759
760 void build() override;
761
763
764 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
765
766 public:
767
768 static IParallelMng* create(const SequentialParallelMngBuildInfo& bi)
769 {
770 if (!bi.traceMng())
771 ARCANE_THROW(ArgumentException,"null traceMng()");
772 if (!bi.threadMng())
773 ARCANE_THROW(ArgumentException,"null threadMng()");
774 auto x = new SequentialParallelMng(bi);
775 x->build();
776 return x;
777 }
779 {
780 return makeRef(create(bi));
781 }
782
783 protected:
784
785 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override
786 {
787 ARCANE_UNUSED(kept_ranks);
788 SequentialParallelMngBuildInfo bi(m_timer_mng,m_world_parallel_mng);
789 bi.setThreadMng(m_thread_mng);
790 bi.setTraceMng(m_trace.get());
791 bi.setCommunicator(m_communicator);
792 return create(bi);
793 }
794
795 private:
796
797 ReferenceCounter<ITraceMng> m_trace;
798 IThreadMng* m_thread_mng = nullptr;
799 ITimerMng* m_timer_mng = nullptr;
800 IParallelMng* m_world_parallel_mng = nullptr;
801 IIOMng* m_io_mng;
802 Parallel::IStat* m_stat;
803 IParallelReplication* m_replication;
804 MP::Communicator m_communicator;
805 Ref<IParallelMngUtilsFactory> m_utils_factory;
806 IParallelMngInternal* m_parallel_mng_internal = nullptr;
807};
808
809/*---------------------------------------------------------------------------*/
810/*---------------------------------------------------------------------------*/
811
812extern "C++" IIOMng*
813arcaneCreateIOMng(IParallelMng* psm);
814
815/*---------------------------------------------------------------------------*/
816/*---------------------------------------------------------------------------*/
817
818extern "C++" IParallelMng*
819arcaneCreateSequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
820{
821 return SequentialParallelMng::create(bi);
822}
823extern "C++" Ref<IParallelMng>
824arcaneCreateSequentialParallelMngRef(const SequentialParallelMngBuildInfo& bi)
825{
826 return SequentialParallelMng::createRef(bi);
827}
828
829/*---------------------------------------------------------------------------*/
830/*---------------------------------------------------------------------------*/
831
833: public ParallelMngInternal
834{
835 public:
836
837 explicit Impl(SequentialParallelMng* pm)
838 : ParallelMngInternal(pm)
839 , m_alloc(makeRef(new MachineShMemWinMemoryAllocator(pm)))
840 {}
841
842 ~Impl() override = default;
843
844 public:
845
846 Int32 masterParallelIORank() const override { return 0; }
847 Int32 nbSendersToMasterParallelIO() const override { return 1; }
848
849 void initializeWindowCreator() override {}
850
852 {
853 return true;
854 }
855
857 {
858 return makeRef(new SequentialContigMachineShMemWinBaseInternal(sizeof_segment, sizeof_type));
859 }
860
862 {
863 return makeRef(new SequentialMachineShMemWinBaseInternal(sizeof_segment, sizeof_type));
864 }
865
867 {
868 return MemoryAllocationOptions{ m_alloc.get() };
869 }
871 {
872 return { 1, &m_rank };
873 }
874 void machineBarrier() override {}
875
876 private:
877
879 const Int32 m_rank = 0;
880};
881
882/*---------------------------------------------------------------------------*/
883/*---------------------------------------------------------------------------*/
884
885SequentialParallelMng::
886SequentialParallelMng(const SequentialParallelMngBuildInfo& bi)
888, m_trace(bi.traceMng())
889, m_thread_mng(bi.threadMng())
890, m_timer_mng(bi.m_timer_mng)
891, m_world_parallel_mng(bi.m_world_parallel_mng)
892, m_io_mng(nullptr)
893, m_stat(nullptr)
894, m_replication(new ParallelReplication())
895, m_communicator(bi.communicator())
897, m_parallel_mng_internal(new Impl(this))
898{
899 ARCANE_CHECK_PTR(m_trace);
900 ARCANE_CHECK_PTR(m_thread_mng);
901 if (!m_world_parallel_mng)
902 m_world_parallel_mng = this;
904 _setCommunicator(m_communicator);
905}
906
907/*---------------------------------------------------------------------------*/
908/*---------------------------------------------------------------------------*/
909
910SequentialParallelMng::
911~SequentialParallelMng()
912{
913 delete m_parallel_mng_internal;
914 delete m_stat;
915 delete m_replication;
916 delete m_io_mng;
917}
918
919/*---------------------------------------------------------------------------*/
920/*---------------------------------------------------------------------------*/
921
922void SequentialParallelMng::
923setBaseObject(IBase* sd)
924{
925 ARCANE_UNUSED(sd);
926}
927
928/*---------------------------------------------------------------------------*/
929/*---------------------------------------------------------------------------*/
930
931namespace
932{
933// Classe pour créer les différents dispatchers
934class DispatchCreator
935{
936 public:
937 DispatchCreator(ITraceMng* tm) : m_tm(tm){}
938 public:
939 template<typename DataType> SequentialParallelDispatchT<DataType>*
940 create()
941 {
942 return new SequentialParallelDispatchT<DataType>(m_tm);
943 }
944 ITraceMng* m_tm;
945};
946}
947
949build()
950{
951 m_io_mng = arcaneCreateIOMng(this);
952 DispatchCreator creator(m_trace.get());
953 this->createDispatchers(creator);
954}
955
956/*---------------------------------------------------------------------------*/
957/*---------------------------------------------------------------------------*/
958
961{
962 traceMng()->info() << "** ** MPI Communicator = " << getMPICommunicator();
963}
964
965/*---------------------------------------------------------------------------*/
966/*---------------------------------------------------------------------------*/
967
968/*---------------------------------------------------------------------------*/
969/*---------------------------------------------------------------------------*/
970
971// Construit un superviseur séquentiel lié au superviseur \a sm
972SequentialParallelSuperMng::
973SequentialParallelSuperMng(const ServiceBuildInfo& sbi)
974: AbstractService(sbi)
975, m_application(sbi.application())
976, m_thread_mng(new NullThreadMng())
977, m_timer_mng(nullptr)
978{
979}
980
981/*---------------------------------------------------------------------------*/
982/*---------------------------------------------------------------------------*/
983
984// Construit un superviseur séquentiel lié au superviseur \a sm
985SequentialParallelSuperMng::
986SequentialParallelSuperMng(const ServiceBuildInfo& sbi,Parallel::Communicator comm)
987: AbstractService(sbi)
988, m_application(sbi.application())
989, m_thread_mng(new NullThreadMng())
990, m_timer_mng(nullptr)
991, m_communicator(comm)
992{
993}
994
995/*---------------------------------------------------------------------------*/
996/*---------------------------------------------------------------------------*/
997
998// Construit un superviseur séquentiel lié au superviseur \a sm
999SequentialParallelSuperMng::
1000~SequentialParallelSuperMng()
1001{
1002 delete m_thread_mng;
1003}
1004
1005/*---------------------------------------------------------------------------*/
1006/*---------------------------------------------------------------------------*/
1007
1019
1020/*---------------------------------------------------------------------------*/
1021/*---------------------------------------------------------------------------*/
1022
1024build()
1025{
1026 if (!m_timer_mng){
1027 m_owned_timer_mng = new TimerMng(traceMng());
1028 m_timer_mng = m_owned_timer_mng.get();
1029 }
1030}
1031
1032/*---------------------------------------------------------------------------*/
1033/*---------------------------------------------------------------------------*/
1034
1037{
1038 if (local_rank!=0)
1039 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
1040
1041 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
1042 bi.setThreadMng(threadMng());
1043 bi.setTraceMng(traceMng());
1044 bi.setCommunicator(communicator());
1045 return SequentialParallelMng::createRef(bi);
1046}
1047
1048/*---------------------------------------------------------------------------*/
1049/*---------------------------------------------------------------------------*/
1050
1055
1056/*---------------------------------------------------------------------------*/
1057/*---------------------------------------------------------------------------*/
1058
1061
1062/*---------------------------------------------------------------------------*/
1063/*---------------------------------------------------------------------------*/
1064
1065class SequentialParallelMngBuilder
1067{
1068 public:
1069 SequentialParallelMngBuilder(IApplication* app,Parallel::Communicator comm)
1070 : m_application(app), m_thread_mng(new NullThreadMng()),
1071 m_timer_mng(new TimerMng(app->traceMng())), m_communicator(comm){}
1072 ~SequentialParallelMngBuilder() override
1073 {
1074 delete m_timer_mng;
1075 delete m_thread_mng;
1076 }
1077
1078 public:
1079
1080 void build() {}
1081 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
1082
1083 public:
1084 IApplication* m_application;
1085 IThreadMng* m_thread_mng;
1086 ITimerMng* m_timer_mng;
1087 Parallel::Communicator m_communicator;
1088};
1089
1090/*---------------------------------------------------------------------------*/
1091/*---------------------------------------------------------------------------*/
1092
1094_createParallelMng(Int32 local_rank,ITraceMng* tm)
1095{
1096 if (local_rank!=0)
1097 ARCANE_THROW(ArgumentException,"Bad local_rank '{0}' (should be 0)",local_rank);
1098
1099 SequentialParallelMngBuildInfo bi(m_timer_mng,nullptr);
1100 bi.setTraceMng(tm);
1101 bi.setThreadMng(m_thread_mng);
1102 bi.setCommunicator(m_communicator);
1103 return arcaneCreateSequentialParallelMngRef(bi);
1104}
1105
1106/*---------------------------------------------------------------------------*/
1107/*---------------------------------------------------------------------------*/
1108
1109class SequentialParallelMngContainerFactory
1110: public AbstractService
1112{
1113 public:
1114 SequentialParallelMngContainerFactory(const ServiceBuildInfo& sbi)
1115 : AbstractService(sbi), m_application(sbi.application()){}
1116 public:
1119 {
1120 ARCANE_UNUSED(nb_rank);
1121 ARCANE_UNUSED(machine_comm);
1122 auto x = new SequentialParallelMngBuilder(m_application,comm);
1123 x->build();
1125 }
1126 private:
1127 IApplication* m_application;
1128};
1129
1130/*---------------------------------------------------------------------------*/
1131/*---------------------------------------------------------------------------*/
1132
1134 ServiceProperty("SequentialParallelMngContainerFactory",ST_Application),
1136
1137/*---------------------------------------------------------------------------*/
1138/*---------------------------------------------------------------------------*/
1139
1140} // End namespace Arcane
1141
1142/*---------------------------------------------------------------------------*/
1143/*---------------------------------------------------------------------------*/
1144
#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:86
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
Gestion des messages parallèles pour le type Type.
Échange d'informations entre processeurs.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Partie interne de IParallelMng.
Interface d'une fabrique pour les fonctions utilitaires de IParallelMng.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface des opérations parallèles collectives non bloquantes.
Informations sur la réplication des sous-domaines en parallèle.
Classe abstraite du superviseur de parallélisme.
Informations sur la topologie d'allocation des coeurs de calcul.
virtual void copy(const ISerializer *from)=0
Copie les données de from dans cette instance.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:49
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Envoie de valeurs sur différents processeurs.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Communicateur pour l'échange de message.
Classe permettant de créer une fenêtre mémoire pour un noeud de calcul.
Classe permettant de créer des fenêtres mémoires 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() override
Méthode permettant d'obtenir une vue sur son segment.
Int32 sizeofOneElem() const override
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
void resizeSegment(const Int64 new_sizeof_segment) override
Méthode permettant de redimensionner les segments de la fenêtre.
Span< const std::byte > windowConstView() const override
Méthode permettant d'obtenir une vue sur toute la fenêtre.
Span< const std::byte > segmentConstView() const override
Méthode permettant d'obtenir une vue sur son segment.
ConstArrayView< Int32 > machineRanks() const override
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
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...
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< std::byte > windowView() override
Méthode permettant d'obtenir une vue sur toute la fenêtre.
Span< const std::byte > segmentConstView() const override
Méthode permettant d'obtenir une vue sur 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.
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.
void barrier() const override
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
ConstArrayView< Int32 > machineRanks() const override
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
void shrink() override
Méthode permettant de réduire l'espace mémoire réservé pour les segments au minimum nécessaire.
void add(Span< const std::byte > elem) override
Méthode permettant d'ajouter des élements dans notre segment.
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.
Int32 sizeofOneElem() const override
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
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.
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< IMachineShMemWinBaseInternal > createMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire dynamique sur le noeud.
Ref< IContigMachineShMemWinBaseInternal > createContigMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire sur le noeud.
ConstArrayView< Int32 > machineRanks() override
Méthode permettant de récupérer les rangs des sous-domaines du noeud de calcul.
void machineBarrier() override
Méthode permettant de faire une barrière pour les sous-domaines du noeud de calcul.
void initializeWindowCreator() override
Méthode permettant d'initialiser le windowCreator spécifique à l'implémentation.
bool isMachineShMemWinAvailable() override
Méthode permettant de savoir si le mode mémoire partagée est supporté.
MemoryAllocationOptions machineShMemWinMemoryAllocator() override
Méthode permettant de récupérer un allocateur en mémoire partagée.
Gestionnaire du parallélisme en mode séquentiel.
Parallel::Communicator communicator() const override
Communicateur MPI associé à cette instance.
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 trace associé à cette instance.
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:115
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:480
@ 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.