Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SharedMemoryParallelMng.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/* SharedMemoryParallelMng.cc (C) 2000-2026 */
9/* */
10/* Implémentation des messages en mode mémoire partagé. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/parallel/thread/SharedMemoryParallelMng.h"
15
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/NumericTypes.h"
21#include "arcane/utils/ArgumentException.h"
22#include "arcane/utils/FatalErrorException.h"
23#include "arcane/utils/ITraceMng.h"
24#include "arcane/utils/SmallArray.h"
25
26#include "arcane/parallel/IStat.h"
27
28#include "arcane/parallel/thread/SharedMemoryParallelDispatch.h"
29#include "arcane/parallel/thread/ISharedMemoryMessageQueue.h"
30#include "arcane/parallel/thread/internal/SharedMemoryMachineShMemWinBaseInternalCreator.h"
31#include "arcane/parallel/thread/internal/SharedMemoryContigMachineShMemWinBaseInternal.h"
32#include "arcane/parallel/thread/internal/SharedMemoryMachineShMemWinBaseInternal.h"
33
34#include "arcane/core/Timer.h"
35#include "arcane/core/IIOMng.h"
36#include "arcane/core/ISerializeMessageList.h"
37#include "arcane/core/IItemFamily.h"
38#include "arcane/core/internal/SerializeMessage.h"
39#include "arcane/core/internal/ParallelMngInternal.h"
40#include "arcane/core/internal/MachineShMemWinMemoryAllocator.h"
41
42#include "arcane/impl/TimerMng.h"
43#include "arcane/impl/ParallelReplication.h"
44#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h"
45
46#include "arccore/message_passing/RequestListBase.h"
47#include "arccore/message_passing/internal/SerializeMessageList.h"
48
49#include "arcane/parallel/thread/SharedMemoryMessageQueue.h"
50
51#include <map>
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
56namespace Arcane
57{
58extern "C++" ARCANE_IMPL_EXPORT IIOMng*
59arcaneCreateIOMng(IParallelMng* psm);
60}
61
63{
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
72{
74 public:
75
76 explicit RequestList(SharedMemoryParallelMng* pm)
77 : m_parallel_mng(pm), m_message_queue(pm->m_message_queue),
78 m_local_rank(m_parallel_mng->commRank()){}
79 public:
80 void _wait(Parallel::eWaitType wait_type) override
81 {
82 switch(wait_type){
83 case Parallel::WaitAll:
84 m_message_queue->waitAll(m_local_rank, _requests());
85 break;
87 m_message_queue->waitSome(m_local_rank, _requests(), _requestsDone(), false);
88 break;
90 m_message_queue->waitSome(m_local_rank, _requests(), _requestsDone(), true);
91 break;
92 }
93 }
94
95 private:
96
97 SharedMemoryParallelMng* m_parallel_mng;
98 ISharedMemoryMessageQueue* m_message_queue;
99 Int32 m_local_rank;
100 };
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
106: public ParallelMngInternal
107{
108 public:
109
110 explicit Impl(SharedMemoryParallelMng* pm, SharedMemoryMachineShMemWinBaseInternalCreator* window_creator)
111 : ParallelMngInternal(pm)
112 , m_parallel_mng(pm)
113 , m_window_creator(window_creator)
114 , m_alloc(makeRef(new MachineShMemWinMemoryAllocator(pm)))
115 {}
116
117 ~Impl() override = default;
118
119 public:
120
121 Int32 masterParallelIORank() const override { return 0; }
122 Int32 nbSendersToMasterParallelIO() const override { return m_parallel_mng->commSize(); }
123
124 void initializeWindowCreator() override {}
125
127 {
128 return true;
129 }
130
132 {
133 return makeRef(m_window_creator->createWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
134 }
135
137 {
138 return makeRef(m_window_creator->createDynamicWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
139 }
140
142 {
143 return MemoryAllocationOptions{ m_alloc.get() };
144 }
145
147 {
148 return m_window_creator->machineRanks();
149 }
150
151 void machineBarrier() override
152 {
153 m_window_creator->machineBarrier();
154 }
155
156 private:
157
158 SharedMemoryParallelMng* m_parallel_mng;
161};
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166SharedMemoryParallelMng::
167SharedMemoryParallelMng(const SharedMemoryParallelMngBuildInfo& build_info)
168: ParallelMngDispatcher(ParallelMngDispatcherBuildInfo(build_info.rank,build_info.nb_rank))
169, m_trace(build_info.trace_mng)
170, m_thread_mng(build_info.thread_mng)
171, m_sequential_parallel_mng(build_info.sequential_parallel_mng)
172, m_timer_mng(nullptr)
173, m_replication(new ParallelReplication())
174, m_world_parallel_mng(build_info.world_parallel_mng)
175, m_io_mng(nullptr)
176, m_message_queue(build_info.message_queue)
177, m_is_parallel(build_info.nb_rank!=1)
178, m_rank(build_info.rank)
179, m_nb_rank(build_info.nb_rank)
180, m_is_initialized(false)
181, m_stat(Parallel::createDefaultStat())
182, m_thread_barrier(build_info.thread_barrier)
183, m_all_dispatchers(build_info.all_dispatchers)
184, m_sub_builder_factory(build_info.sub_builder_factory)
185, m_parent_container_ref(build_info.container)
186, m_mpi_communicator(build_info.communicator)
187, m_utils_factory(createRef<ParallelMngUtilsFactoryBase>())
188, m_parallel_mng_internal(new Impl(this, build_info.window_creator))
189{
190 if (!m_world_parallel_mng)
191 m_world_parallel_mng = this;
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197SharedMemoryParallelMng::
198~SharedMemoryParallelMng()
199{
200 delete m_parallel_mng_internal;
201 delete m_replication;
202 m_sequential_parallel_mng.reset();
203 delete m_io_mng;
204 delete m_timer_mng;
205 delete m_stat;
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211namespace
212{
213// Classe pour créer les différents dispatchers
214class DispatchCreator
215{
216 public:
217 DispatchCreator(ITraceMng* tm,SharedMemoryParallelMng* mpm,
218 ISharedMemoryMessageQueue* message_queue,
219 SharedMemoryAllDispatcher* all_dispatchers)
220 : m_tm(tm), m_mpm(mpm), m_message_queue(message_queue),
221 m_all_dispatchers(all_dispatchers){}
222 public:
223 template<typename DataType> SharedMemoryParallelDispatch<DataType>*
224 create()
225 {
226 ISharedMemoryMessageQueue* tmq = m_message_queue;
227 SharedMemoryAllDispatcher* ad = m_all_dispatchers;
228 auto& field = ad->instance((DataType*)nullptr);
229 return new SharedMemoryParallelDispatch<DataType>(m_tm,m_mpm,tmq,field);
230 }
231
232 ITraceMng* m_tm;
233 SharedMemoryParallelMng* m_mpm;
234 ISharedMemoryMessageQueue* m_message_queue;
235 SharedMemoryAllDispatcher* m_all_dispatchers;
236};
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
243build()
244{
245 m_message_queue->setTraceMng(m_rank,traceMng());
246 m_timer_mng = new TimerMng(traceMng());
247
248 DispatchCreator creator(m_trace.get(),this,m_message_queue,m_all_dispatchers);
249 this->createDispatchers(creator);
250
251 m_io_mng = arcaneCreateIOMng(this);
252}
253
254/*----------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
259{
260 Trace::Setter mci(m_trace.get(),"Thread");
261 if (m_is_initialized){
262 m_trace->warning() << "SharedMemoryParallelMng already initialized";
263 return;
264 }
265
266 m_is_initialized = true;
267}
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
274{
275 return m_utils_factory->createGetVariablesValuesOperation(this)._release();
276}
277
280{
281 return m_utils_factory->createTransferValuesOperation(this)._release();
282}
283
286{
287 return m_utils_factory->createExchanger(this)._release();
288}
289
290/*---------------------------------------------------------------------------*/
291/*---------------------------------------------------------------------------*/
292
293/*---------------------------------------------------------------------------*/
294/*---------------------------------------------------------------------------*/
295
296void SharedMemoryParallelMng::
297sendSerializer(ISerializer* values,Int32 dest_rank)
298{
299 auto p2p_message = buildMessage(dest_rank, Parallel::Blocking);
300 Request r = m_message_queue->addSend(p2p_message, SendBufferInfo(values));
301 m_message_queue->waitAll(m_rank, ArrayView<Request>(1, &r));
302}
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
306
307Parallel::Request SharedMemoryParallelMng::
308sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes)
309{
310 ARCANE_UNUSED(bytes);
311 return m_message_queue->addSend(buildMessage(rank,Parallel::Blocking),SendBufferInfo(values));
312}
313
314/*---------------------------------------------------------------------------*/
315/*---------------------------------------------------------------------------*/
316
319{
320 return m_utils_factory->createSendSerializeMessage(this, rank)._release();
321}
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
325
326void SharedMemoryParallelMng::
327broadcastSerializer(ISerializer* values,Int32 rank)
328{
329 // Implementation basique pour l'instant.
330 // Le rank qui broadcast envoie le message à tout le monde.
331 if (m_rank==rank){
333 for( Int32 i=0; i<m_nb_rank; ++i ){
334 if (i!=m_rank){
335 requests.add(m_message_queue->addSend(buildMessage(i,Parallel::NonBlocking),SendBufferInfo(values)));
336 }
337 }
338 m_message_queue->waitAll(m_rank, requests);
339 }
340 else{
341 recvSerializer(values,rank);
342 }
343}
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347
348void SharedMemoryParallelMng::
349recvSerializer(ISerializer* values,Int32 rank)
350{
351 auto p2p_message = buildMessage(rank, Parallel::Blocking);
352 Request r = m_message_queue->addReceive(p2p_message, ReceiveBufferInfo(values));
353 m_message_queue->waitAll(m_rank, ArrayView<Request>(1, &r));
354}
355
356/*---------------------------------------------------------------------------*/
357/*---------------------------------------------------------------------------*/
358
361{
362 return m_utils_factory->createReceiveSerializeMessage(this, rank)._release();
363}
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
367
370{
371 ARCANE_UNUSED(requests);
372 throw NotImplementedException(A_FUNCINFO);
373}
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
380{
381 if (m_stat)
382 m_stat->print(m_trace.get());
383}
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387
389barrier()
390{
391 m_thread_barrier->wait();
392}
393
394/*---------------------------------------------------------------------------*/
395/*---------------------------------------------------------------------------*/
396
399{
400 Real begin_time = platform::getRealTime();
401 m_message_queue->waitAll(m_rank, requests);
402 Real end_time = platform::getRealTime();
403 m_stat->add("WaitAll",(end_time-begin_time),0);
404}
405
406/*---------------------------------------------------------------------------*/
407/*---------------------------------------------------------------------------*/
408
409ISerializeMessageList* SharedMemoryParallelMng::
410_createSerializeMessageList()
411{
412 return new MP::internal::SerializeMessageList(messagePassingMng());
413}
414
415/*---------------------------------------------------------------------------*/
416/*---------------------------------------------------------------------------*/
417
419probe(const PointToPointMessageInfo& message)
420{
421 PointToPointMessageInfo p2p_message(message);
422 p2p_message.setEmiterRank(MessageRank(m_rank));
423 return m_message_queue->probe(p2p_message);
424}
425
426/*---------------------------------------------------------------------------*/
427/*---------------------------------------------------------------------------*/
428
431{
432 PointToPointMessageInfo p2p_message(message);
433 p2p_message.setEmiterRank(MessageRank(m_rank));
434 return m_message_queue->legacyProbe(p2p_message);
435}
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
440auto SharedMemoryParallelMng::
441sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) -> Request
442{
443 auto p2p_message = buildMessage(message);
444 return m_message_queue->addSend(p2p_message,SendBufferInfo(values));
445}
446
447/*---------------------------------------------------------------------------*/
448/*---------------------------------------------------------------------------*/
449
450auto SharedMemoryParallelMng::
451receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) -> Request
452{
453 auto p2p_message = buildMessage(message);
454 return m_message_queue->addReceive(p2p_message,ReceiveBufferInfo(values));
455}
456
457/*---------------------------------------------------------------------------*/
458/*---------------------------------------------------------------------------*/
459
462{
463 return m_utils_factory->createSynchronizer(this,family)._release();
464}
465
466/*---------------------------------------------------------------------------*/
467/*---------------------------------------------------------------------------*/
468
470createSynchronizer(const ItemGroup& group)
471{
472 return m_utils_factory->createSynchronizer(this,group)._release();
473}
474
475/*---------------------------------------------------------------------------*/
476/*---------------------------------------------------------------------------*/
477
480{
481 return m_utils_factory->createTopology(this)._release();
482}
483
484/*---------------------------------------------------------------------------*/
485/*---------------------------------------------------------------------------*/
486
488replication() const
489{
490 return m_replication;
491}
492
493/*---------------------------------------------------------------------------*/
494/*---------------------------------------------------------------------------*/
495
498{
499 delete m_replication;
500 m_replication = v;
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
506IParallelMng* SharedMemoryParallelMng::
507_createSubParallelMng(Int32ConstArrayView kept_ranks)
508{
509 ARCANE_UNUSED(kept_ranks);
510 // On ne peut pas implémenter cette méthode car on passe par
511 // IParallelMngContainer::_createParallelMng() qui créé obligatoirement
512 // un 'Ref<IParallelMng>'.
513 ARCANE_THROW(NotSupportedException, "Use createSubParallelMngRef() instead");
514}
515
516/*---------------------------------------------------------------------------*/
517/*---------------------------------------------------------------------------*/
518
521{
522 if (kept_ranks.empty())
523 ARCANE_FATAL("kept_ranks is empty");
524 ARCANE_CHECK_POINTER(m_sub_builder_factory);
525
527 Int32 nb_rank = kept_ranks.size();
528
529 // Regarde si je suis dans les listes des rangs conservés et si oui
530 // détermine mon rang dans le IParallelMng créé
531 Int32 my_new_rank = (-1);
532 for( Integer i=0; i<nb_rank; ++i )
533 if (kept_ranks[i]==m_rank){
534 my_new_rank = i;
535 break;
536 }
537
538 barrier();
539 // Le rang 0 créé le builder
540 if (m_rank==0){
541 builder = m_sub_builder_factory->_createParallelMngBuilder(nb_rank, m_mpi_communicator, m_mpi_communicator);
542 // Positionne le builder pour tout le monde
543 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder = builder;
544 }
545 barrier();
546
547 builder = m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder;
548 ARCANE_CHECK_POINTER(builder.get());
549
550 Ref<IParallelMng> new_parallel_mng;
551 if (my_new_rank>=0){
552 new_parallel_mng = builder->_createParallelMng(my_new_rank,traceMng());
553 //auto* new_sm = dynamic_cast<SharedMemoryParallelMng*>(new_parallel_mng.get());
554 //if (new_sm)
555 //new_sm->m_mpi_communicator = m_mpi_communicator;
556 }
557 barrier();
558 // Ici, tout le monde a créé son IParallelMng. On peut donc
559 // supprimer la référence au builder.
560 // TODO: il faudra ajouter un compteur de référence sur le builder
561 // sinon il ne sera jamais détruit.
562 if (m_rank==0){
563 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder.reset();
564 }
565 barrier();
566
567 return new_parallel_mng;
568}
569
570/*---------------------------------------------------------------------------*/
571/*---------------------------------------------------------------------------*/
572
579
580/*---------------------------------------------------------------------------*/
581/*---------------------------------------------------------------------------*/
582
583Ref<IParallelMng> SharedMemoryParallelMng::
584sequentialParallelMngRef()
585{
586 return m_sequential_parallel_mng;
587}
588
591{
592 return m_sequential_parallel_mng.get();
593}
594
595/*---------------------------------------------------------------------------*/
596/*---------------------------------------------------------------------------*/
597
599buildMessage(const PointToPointMessageInfo& orig_message)
600{
601 PointToPointMessageInfo p2p_message{orig_message};
602 p2p_message.setEmiterRank(MessageRank(m_rank));
603 return p2p_message;
604}
605
606/*---------------------------------------------------------------------------*/
607/*---------------------------------------------------------------------------*/
608
609PointToPointMessageInfo SharedMemoryParallelMng::
610buildMessage(Int32 dest,Parallel::eBlockingType blocking_mode)
611{
612 return buildMessage({MessageRank(dest),blocking_mode});
613}
614
615/*---------------------------------------------------------------------------*/
616/*---------------------------------------------------------------------------*/
617
623
624/*---------------------------------------------------------------------------*/
625/*---------------------------------------------------------------------------*/
626
627} // End namespace Arcane::MessagePassing
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue modifiable d'un tableau d'un type T.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
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
Échange d'informations entre processeurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Informations sur la réplication des sous-domaines en parallèle.
Informations sur la topologie d'allocation des coeurs de calcul.
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
Interface d'un message de sérialisation entre IMessagePassingMng.
Interface d'une file de messages avec les threads.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
void setEmiterRank(MessageRank rank)
Positionne le rang de l'émetteur du message.
Informations des buffers de réception.
Requête d'un message.
Definition Request.h:77
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.
void initializeWindowCreator() override
Méthode permettant d'initialiser le windowCreator spécifique à l'implémentation.
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.
ConstArrayView< Int32 > machineRanks() override
Méthode permettant de récupérer les rangs des sous-domaines du noeud de calcul.
Ref< IContigMachineShMemWinBaseInternal > createContigMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire sur le noeud.
void machineBarrier() override
Méthode permettant de faire une barrière pour les sous-domaines du noeud de calcul.
Implémentation de IRequestList pour SharedMemoryParallelMng.
void _wait(Parallel::eWaitType wait_type) override
Effectue l'attente ou le test.
IParallelTopology * createTopology() override
Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire.
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...
Ref< Parallel::IRequestList > createRequestListRef() override
Créé une liste de requêtes pour ce gestionnaire.
void printStats() override
Affiche des statistiques liées à ce gestionnaire du parallélisme.
void initialize() override
Initialise le gestionnaire du parallélisme.
void setReplication(IParallelReplication *v) override
Positionne les Informations sur la réplication.
PointToPointMessageInfo buildMessage(Int32 dest, MP::eBlockingType is_blocking)
Construit un message avec pour destinataire dest.
void waitAllRequests(ArrayView< Request > requests) override
Bloque en attendant que les requêtes rvalues soient terminées.
Ref< IParallelMngUtilsFactory > _internalUtilsFactory() const override
Fabrique des fonctions utilitaires.
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
MessageId probe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
ISerializeMessage * createSendSerializer(Int32 rank) override
Créé un message non bloquant pour envoyer des données sérialisées au rang rank.
ITraceMng * traceMng() const override
Gestionnaire de trace associé à cette instance.
IParallelMng * sequentialParallelMng() override
Retourne un gestionnaire de parallélisme séquentiel.
IParallelExchanger * createExchanger() override
Retourne une interface pour transférer des messages entre processeurs.
void freeRequests(ArrayView< Parallel::Request > requests) override
Libère les requêtes.
ISerializeMessage * createReceiveSerializer(Int32 rank) override
Créé un message non bloquant pour recevoir des données sérialisées du rang rank.
Ref< IParallelMng > createSubParallelMngRef(Int32ConstArrayView kept_ranks) override
Créé un nouveau gestionnaire de parallélisme pour un sous-ensemble des rangs.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Retourne une opération pour transférer des valeurs entre sous-domaine.
MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
IParallelReplication * replication() const override
Informations sur la réplication.
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.
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.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Référence à une instance.
Gestionnaire de timer.
Definition TimerMng.h:39
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
@ WaitSome
Attend que tous les messages de la liste soient traités.
eBlockingType
Type indiquant si un message est bloquant ou non.
Implémentation de la concurrence.
Real getRealTime()
Temps Real utilisé en secondes.
-- 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
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un SharedMemoryParallelMng.