Arcane  v4.1.9.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
25#include "arcane/parallel/IStat.h"
26
27#include "arcane/parallel/thread/SharedMemoryParallelDispatch.h"
28#include "arcane/parallel/thread/ISharedMemoryMessageQueue.h"
29#include "arcane/parallel/thread/internal/SharedMemoryMachineShMemWinBaseInternalCreator.h"
30#include "arcane/parallel/thread/internal/SharedMemoryContigMachineShMemWinBaseInternal.h"
31#include "arcane/parallel/thread/internal/SharedMemoryMachineShMemWinBaseInternal.h"
32
33#include "arcane/core/Timer.h"
34#include "arcane/core/IIOMng.h"
35#include "arcane/core/ISerializeMessageList.h"
36#include "arcane/core/IItemFamily.h"
37#include "arcane/core/internal/SerializeMessage.h"
38#include "arcane/core/internal/ParallelMngInternal.h"
39#include "arcane/core/internal/MachineShMemWinMemoryAllocator.h"
40
41#include "arcane/impl/TimerMng.h"
42#include "arcane/impl/ParallelReplication.h"
43#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h"
44
45#include "arccore/message_passing/RequestListBase.h"
46#include "arccore/message_passing/internal/SerializeMessageList.h"
47
48#include <map>
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
53namespace Arcane
54{
55extern "C++" ARCANE_IMPL_EXPORT IIOMng*
56arcaneCreateIOMng(IParallelMng* psm);
57}
58
60{
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
69{
71 public:
72
73 explicit RequestList(SharedMemoryParallelMng* pm)
74 : m_parallel_mng(pm), m_message_queue(pm->m_message_queue),
75 m_local_rank(m_parallel_mng->commRank()){}
76 public:
77 void _wait(Parallel::eWaitType wait_type) override
78 {
79 switch(wait_type){
80 case Parallel::WaitAll:
81 return m_message_queue->waitAll(_requests());
83 return m_message_queue->waitSome(m_local_rank,_requests(),_requestsDone(),false);
85 return m_message_queue->waitSome(m_local_rank,_requests(),_requestsDone(),true);
86 }
87 }
88 private:
89 SharedMemoryParallelMng* m_parallel_mng;
90 ISharedMemoryMessageQueue* m_message_queue;
91 Int32 m_local_rank;
92};
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
98: public ParallelMngInternal
99{
100 public:
101
102 explicit Impl(SharedMemoryParallelMng* pm, SharedMemoryMachineShMemWinBaseInternalCreator* window_creator)
103 : ParallelMngInternal(pm)
104 , m_parallel_mng(pm)
105 , m_window_creator(window_creator)
106 , m_alloc(makeRef(new MachineShMemWinMemoryAllocator(pm)))
107 {}
108
109 ~Impl() override = default;
110
111 public:
112
113 Int32 masterParallelIORank() const override { return 0; }
114 Int32 nbSendersToMasterParallelIO() const override { return m_parallel_mng->commSize(); }
115
116 void initializeWindowCreator() override {}
117
119 {
120 return true;
121 }
122
124 {
125 return makeRef(m_window_creator->createWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
126 }
127
129 {
130 return makeRef(m_window_creator->createDynamicWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
131 }
132
134 {
135 return MemoryAllocationOptions{ m_alloc.get() };
136 }
137
139 {
140 return m_window_creator->machineRanks();
141 }
142
143 void machineBarrier() override
144 {
145 m_window_creator->machineBarrier();
146 }
147
148 private:
149
150 SharedMemoryParallelMng* m_parallel_mng;
153};
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158SharedMemoryParallelMng::
159SharedMemoryParallelMng(const SharedMemoryParallelMngBuildInfo& build_info)
160: ParallelMngDispatcher(ParallelMngDispatcherBuildInfo(build_info.rank,build_info.nb_rank))
161, m_trace(build_info.trace_mng)
162, m_thread_mng(build_info.thread_mng)
163, m_sequential_parallel_mng(build_info.sequential_parallel_mng)
164, m_timer_mng(nullptr)
165, m_replication(new ParallelReplication())
166, m_world_parallel_mng(build_info.world_parallel_mng)
167, m_io_mng(nullptr)
168, m_message_queue(build_info.message_queue)
169, m_is_parallel(build_info.nb_rank!=1)
170, m_rank(build_info.rank)
171, m_nb_rank(build_info.nb_rank)
172, m_is_initialized(false)
173, m_stat(Parallel::createDefaultStat())
174, m_thread_barrier(build_info.thread_barrier)
175, m_all_dispatchers(build_info.all_dispatchers)
176, m_sub_builder_factory(build_info.sub_builder_factory)
177, m_parent_container_ref(build_info.container)
178, m_mpi_communicator(build_info.communicator)
179, m_utils_factory(createRef<ParallelMngUtilsFactoryBase>())
180, m_parallel_mng_internal(new Impl(this, build_info.window_creator))
181{
182 if (!m_world_parallel_mng)
183 m_world_parallel_mng = this;
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189SharedMemoryParallelMng::
190~SharedMemoryParallelMng()
191{
192 delete m_parallel_mng_internal;
193 delete m_replication;
194 m_sequential_parallel_mng.reset();
195 delete m_io_mng;
196 delete m_timer_mng;
197 delete m_stat;
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
203namespace
204{
205// Classe pour créer les différents dispatchers
206class DispatchCreator
207{
208 public:
209 DispatchCreator(ITraceMng* tm,SharedMemoryParallelMng* mpm,
210 ISharedMemoryMessageQueue* message_queue,
211 SharedMemoryAllDispatcher* all_dispatchers)
212 : m_tm(tm), m_mpm(mpm), m_message_queue(message_queue),
213 m_all_dispatchers(all_dispatchers){}
214 public:
215 template<typename DataType> SharedMemoryParallelDispatch<DataType>*
216 create()
217 {
218 ISharedMemoryMessageQueue* tmq = m_message_queue;
219 SharedMemoryAllDispatcher* ad = m_all_dispatchers;
220 auto& field = ad->instance((DataType*)nullptr);
221 return new SharedMemoryParallelDispatch<DataType>(m_tm,m_mpm,tmq,field);
222 }
223
224 ITraceMng* m_tm;
225 SharedMemoryParallelMng* m_mpm;
226 ISharedMemoryMessageQueue* m_message_queue;
227 SharedMemoryAllDispatcher* m_all_dispatchers;
228};
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
235build()
236{
237 m_message_queue->setTraceMng(m_rank,traceMng());
238 m_timer_mng = new TimerMng(traceMng());
239
240 DispatchCreator creator(m_trace.get(),this,m_message_queue,m_all_dispatchers);
241 this->createDispatchers(creator);
242
243 m_io_mng = arcaneCreateIOMng(this);
244}
245
246/*----------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
251{
252 Trace::Setter mci(m_trace.get(),"Thread");
253 if (m_is_initialized){
254 m_trace->warning() << "SharedMemoryParallelMng already initialized";
255 return;
256 }
257
258 m_is_initialized = true;
259}
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
263
266{
267 return m_utils_factory->createGetVariablesValuesOperation(this)._release();
268}
269
272{
273 return m_utils_factory->createTransferValuesOperation(this)._release();
274}
275
278{
279 return m_utils_factory->createExchanger(this)._release();
280}
281
282/*---------------------------------------------------------------------------*/
283/*---------------------------------------------------------------------------*/
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
288void SharedMemoryParallelMng::
289sendSerializer(ISerializer* values,Int32 dest_rank)
290{
291 auto p2p_message = buildMessage(dest_rank,Parallel::Blocking);
292 Request r = m_message_queue->addSend(p2p_message,SendBufferInfo(values));
293 m_message_queue->waitAll(ArrayView<Request>(1,&r));
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299Parallel::Request SharedMemoryParallelMng::
300sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes)
301{
302 ARCANE_UNUSED(bytes);
303 return m_message_queue->addSend(buildMessage(rank,Parallel::Blocking),SendBufferInfo(values));
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
311{
312 return m_utils_factory->createSendSerializeMessage(this, rank)._release();
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318void SharedMemoryParallelMng::
319broadcastSerializer(ISerializer* values,Int32 rank)
320{
321 // Implementation basique pour l'instant.
322 // Le rank qui broadcast envoie le message à tout le monde.
323 if (m_rank==rank){
325 for( Int32 i=0; i<m_nb_rank; ++i ){
326 if (i!=m_rank){
327 requests.add(m_message_queue->addSend(buildMessage(i,Parallel::NonBlocking),SendBufferInfo(values)));
328 }
329 }
330 m_message_queue->waitAll(requests);
331 }
332 else{
333 recvSerializer(values,rank);
334 }
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339
340void SharedMemoryParallelMng::
341recvSerializer(ISerializer* values,Int32 rank)
342{
343 auto p2p_message = buildMessage(rank,Parallel::Blocking);
344 Request r = m_message_queue->addReceive(p2p_message,ReceiveBufferInfo(values));
345 m_message_queue->waitAll(ArrayView<Request>(1,&r));
346}
347
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350
353{
354 return m_utils_factory->createReceiveSerializeMessage(this, rank)._release();
355}
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
362{
363 ARCANE_UNUSED(requests);
364 throw NotImplementedException(A_FUNCINFO);
365}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
372{
373 if (m_stat)
374 m_stat->print(m_trace.get());
375}
376
377/*---------------------------------------------------------------------------*/
378/*---------------------------------------------------------------------------*/
379
381barrier()
382{
383 m_thread_barrier->wait();
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
391{
392 Real begin_time = platform::getRealTime();
393 m_message_queue->waitAll(requests);
394 Real end_time = platform::getRealTime();
395 m_stat->add("WaitAll",(end_time-begin_time),0);
396}
397
398/*---------------------------------------------------------------------------*/
399/*---------------------------------------------------------------------------*/
400
401ISerializeMessageList* SharedMemoryParallelMng::
402_createSerializeMessageList()
403{
404 return new MP::internal::SerializeMessageList(messagePassingMng());
405}
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409
411probe(const PointToPointMessageInfo& message)
412{
413 PointToPointMessageInfo p2p_message(message);
414 p2p_message.setEmiterRank(MessageRank(m_rank));
415 return m_message_queue->probe(p2p_message);
416}
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
420
423{
424 PointToPointMessageInfo p2p_message(message);
425 p2p_message.setEmiterRank(MessageRank(m_rank));
426 return m_message_queue->legacyProbe(p2p_message);
427}
428
429/*---------------------------------------------------------------------------*/
430/*---------------------------------------------------------------------------*/
431
432auto SharedMemoryParallelMng::
433sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) -> Request
434{
435 auto p2p_message = buildMessage(message);
436 return m_message_queue->addSend(p2p_message,SendBufferInfo(values));
437}
438
439/*---------------------------------------------------------------------------*/
440/*---------------------------------------------------------------------------*/
441
442auto SharedMemoryParallelMng::
443receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) -> Request
444{
445 auto p2p_message = buildMessage(message);
446 return m_message_queue->addReceive(p2p_message,ReceiveBufferInfo(values));
447}
448
449/*---------------------------------------------------------------------------*/
450/*---------------------------------------------------------------------------*/
451
454{
455 return m_utils_factory->createSynchronizer(this,family)._release();
456}
457
458/*---------------------------------------------------------------------------*/
459/*---------------------------------------------------------------------------*/
460
462createSynchronizer(const ItemGroup& group)
463{
464 return m_utils_factory->createSynchronizer(this,group)._release();
465}
466
467/*---------------------------------------------------------------------------*/
468/*---------------------------------------------------------------------------*/
469
472{
473 return m_utils_factory->createTopology(this)._release();
474}
475
476/*---------------------------------------------------------------------------*/
477/*---------------------------------------------------------------------------*/
478
480replication() const
481{
482 return m_replication;
483}
484
485/*---------------------------------------------------------------------------*/
486/*---------------------------------------------------------------------------*/
487
490{
491 delete m_replication;
492 m_replication = v;
493}
494
495/*---------------------------------------------------------------------------*/
496/*---------------------------------------------------------------------------*/
497
498IParallelMng* SharedMemoryParallelMng::
499_createSubParallelMng(Int32ConstArrayView kept_ranks)
500{
501 ARCANE_UNUSED(kept_ranks);
502 // On ne peut pas implémenter cette méthode car on passe par
503 // IParallelMngContainer::_createParallelMng() qui créé obligatoirement
504 // un 'Ref<IParallelMng>'.
505 ARCANE_THROW(NotSupportedException,"Use createSubParallelMngRef() instead");
506}
507
508/*---------------------------------------------------------------------------*/
509/*---------------------------------------------------------------------------*/
510
513{
514 if (kept_ranks.empty())
515 ARCANE_FATAL("kept_ranks is empty");
516 ARCANE_CHECK_POINTER(m_sub_builder_factory);
517
519 Int32 nb_rank = kept_ranks.size();
520
521 // Regarde si je suis dans les listes des rangs conservés et si oui
522 // détermine mon rang dans le IParallelMng créé
523 Int32 my_new_rank = (-1);
524 for( Integer i=0; i<nb_rank; ++i )
525 if (kept_ranks[i]==m_rank){
526 my_new_rank = i;
527 break;
528 }
529
530 barrier();
531 // Le rang 0 créé le builder
532 if (m_rank==0){
533 builder = m_sub_builder_factory->_createParallelMngBuilder(nb_rank, m_mpi_communicator, m_mpi_communicator);
534 // Positionne le builder pour tout le monde
535 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder = builder;
536 }
537 barrier();
538
539 builder = m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder;
540 ARCANE_CHECK_POINTER(builder.get());
541
542 Ref<IParallelMng> new_parallel_mng;
543 if (my_new_rank>=0){
544 new_parallel_mng = builder->_createParallelMng(my_new_rank,traceMng());
545 //auto* new_sm = dynamic_cast<SharedMemoryParallelMng*>(new_parallel_mng.get());
546 //if (new_sm)
547 //new_sm->m_mpi_communicator = m_mpi_communicator;
548 }
549 barrier();
550 // Ici, tout le monde a créé son IParallelMng. On peut donc
551 // supprimer la référence au builder.
552 // TODO: il faudra ajouter un compteur de référence sur le builder
553 // sinon il ne sera jamais détruit.
554 if (m_rank==0){
555 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder.reset();
556 }
557 barrier();
558
559 return new_parallel_mng;
560}
561
562/*---------------------------------------------------------------------------*/
563/*---------------------------------------------------------------------------*/
564
571
572/*---------------------------------------------------------------------------*/
573/*---------------------------------------------------------------------------*/
574
575Ref<IParallelMng> SharedMemoryParallelMng::
576sequentialParallelMngRef()
577{
578 return m_sequential_parallel_mng;
579}
580
583{
584 return m_sequential_parallel_mng.get();
585}
586
587/*---------------------------------------------------------------------------*/
588/*---------------------------------------------------------------------------*/
589
591buildMessage(const PointToPointMessageInfo& orig_message)
592{
593 PointToPointMessageInfo p2p_message{orig_message};
594 p2p_message.setEmiterRank(MessageRank(m_rank));
595 return p2p_message;
596}
597
598/*---------------------------------------------------------------------------*/
599/*---------------------------------------------------------------------------*/
600
601PointToPointMessageInfo SharedMemoryParallelMng::
602buildMessage(Int32 dest,Parallel::eBlockingType blocking_mode)
603{
604 return buildMessage({MessageRank(dest),blocking_mode});
605}
606
607/*---------------------------------------------------------------------------*/
608/*---------------------------------------------------------------------------*/
609
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
619} // End namespace Arcane::MessagePassing
620
621/*---------------------------------------------------------------------------*/
622/*---------------------------------------------------------------------------*/
#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:84
É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 traces.
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.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
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.
ARCCORE_BASE_EXPORT 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:121
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:482
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.