Arcane  v4.1.7.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/SharedMemoryContigMachineShMemWinBaseInternalCreator.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, SharedMemoryContigMachineShMemWinBaseInternalCreator* 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 void initializeWindowCreator() override {}
114
116 {
117 return true;
118 }
119
121 {
122 return makeRef(m_window_creator->createWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
123 }
124
126 {
127 return makeRef(m_window_creator->createDynamicWindow(m_parallel_mng->commRank(), sizeof_segment, sizeof_type));
128 }
129
131 {
132 return MemoryAllocationOptions{ m_alloc.get() };
133 }
134
136 {
137 return m_window_creator->machineRanks();
138 }
139
140 void machineBarrier() override
141 {
142 m_window_creator->machineBarrier();
143 }
144
145 private:
146
147 SharedMemoryParallelMng* m_parallel_mng;
150};
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
155SharedMemoryParallelMng::
156SharedMemoryParallelMng(const SharedMemoryParallelMngBuildInfo& build_info)
157: ParallelMngDispatcher(ParallelMngDispatcherBuildInfo(build_info.rank,build_info.nb_rank))
158, m_trace(build_info.trace_mng)
159, m_thread_mng(build_info.thread_mng)
160, m_sequential_parallel_mng(build_info.sequential_parallel_mng)
161, m_timer_mng(nullptr)
162, m_replication(new ParallelReplication())
163, m_world_parallel_mng(build_info.world_parallel_mng)
164, m_io_mng(nullptr)
165, m_message_queue(build_info.message_queue)
166, m_is_parallel(build_info.nb_rank!=1)
167, m_rank(build_info.rank)
168, m_nb_rank(build_info.nb_rank)
169, m_is_initialized(false)
170, m_stat(Parallel::createDefaultStat())
171, m_thread_barrier(build_info.thread_barrier)
172, m_all_dispatchers(build_info.all_dispatchers)
173, m_sub_builder_factory(build_info.sub_builder_factory)
174, m_parent_container_ref(build_info.container)
175, m_mpi_communicator(build_info.communicator)
176, m_utils_factory(createRef<ParallelMngUtilsFactoryBase>())
177, m_parallel_mng_internal(new Impl(this, build_info.window_creator))
178{
179 if (!m_world_parallel_mng)
180 m_world_parallel_mng = this;
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186SharedMemoryParallelMng::
187~SharedMemoryParallelMng()
188{
189 delete m_parallel_mng_internal;
190 delete m_replication;
191 m_sequential_parallel_mng.reset();
192 delete m_io_mng;
193 delete m_timer_mng;
194 delete m_stat;
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200namespace
201{
202// Classe pour créer les différents dispatchers
203class DispatchCreator
204{
205 public:
206 DispatchCreator(ITraceMng* tm,SharedMemoryParallelMng* mpm,
207 ISharedMemoryMessageQueue* message_queue,
208 SharedMemoryAllDispatcher* all_dispatchers)
209 : m_tm(tm), m_mpm(mpm), m_message_queue(message_queue),
210 m_all_dispatchers(all_dispatchers){}
211 public:
212 template<typename DataType> SharedMemoryParallelDispatch<DataType>*
213 create()
214 {
215 ISharedMemoryMessageQueue* tmq = m_message_queue;
216 SharedMemoryAllDispatcher* ad = m_all_dispatchers;
217 auto& field = ad->instance((DataType*)nullptr);
218 return new SharedMemoryParallelDispatch<DataType>(m_tm,m_mpm,tmq,field);
219 }
220
221 ITraceMng* m_tm;
222 SharedMemoryParallelMng* m_mpm;
223 ISharedMemoryMessageQueue* m_message_queue;
224 SharedMemoryAllDispatcher* m_all_dispatchers;
225};
226}
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230
232build()
233{
234 m_message_queue->setTraceMng(m_rank,traceMng());
235 m_timer_mng = new TimerMng(traceMng());
236
237 DispatchCreator creator(m_trace.get(),this,m_message_queue,m_all_dispatchers);
238 this->createDispatchers(creator);
239
240 m_io_mng = arcaneCreateIOMng(this);
241}
242
243/*----------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
248{
249 Trace::Setter mci(m_trace.get(),"Thread");
250 if (m_is_initialized){
251 m_trace->warning() << "SharedMemoryParallelMng already initialized";
252 return;
253 }
254
255 m_is_initialized = true;
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
263{
264 return m_utils_factory->createGetVariablesValuesOperation(this)._release();
265}
266
269{
270 return m_utils_factory->createTransferValuesOperation(this)._release();
271}
272
275{
276 return m_utils_factory->createExchanger(this)._release();
277}
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281
282/*---------------------------------------------------------------------------*/
283/*---------------------------------------------------------------------------*/
284
285void SharedMemoryParallelMng::
286sendSerializer(ISerializer* values,Int32 dest_rank)
287{
288 auto p2p_message = buildMessage(dest_rank,Parallel::Blocking);
289 Request r = m_message_queue->addSend(p2p_message,SendBufferInfo(values));
290 m_message_queue->waitAll(ArrayView<Request>(1,&r));
291}
292
293/*---------------------------------------------------------------------------*/
294/*---------------------------------------------------------------------------*/
295
296Parallel::Request SharedMemoryParallelMng::
297sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes)
298{
299 ARCANE_UNUSED(bytes);
300 return m_message_queue->addSend(buildMessage(rank,Parallel::Blocking),SendBufferInfo(values));
301}
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
308{
309 return m_utils_factory->createSendSerializeMessage(this, rank)._release();
310}
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
315void SharedMemoryParallelMng::
316broadcastSerializer(ISerializer* values,Int32 rank)
317{
318 // Implementation basique pour l'instant.
319 // Le rank qui broadcast envoie le message à tout le monde.
320 if (m_rank==rank){
322 for( Int32 i=0; i<m_nb_rank; ++i ){
323 if (i!=m_rank){
324 requests.add(m_message_queue->addSend(buildMessage(i,Parallel::NonBlocking),SendBufferInfo(values)));
325 }
326 }
327 m_message_queue->waitAll(requests);
328 }
329 else{
330 recvSerializer(values,rank);
331 }
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337void SharedMemoryParallelMng::
338recvSerializer(ISerializer* values,Int32 rank)
339{
340 auto p2p_message = buildMessage(rank,Parallel::Blocking);
341 Request r = m_message_queue->addReceive(p2p_message,ReceiveBufferInfo(values));
342 m_message_queue->waitAll(ArrayView<Request>(1,&r));
343}
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347
350{
351 return m_utils_factory->createReceiveSerializeMessage(this, rank)._release();
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
359{
360 ARCANE_UNUSED(requests);
361 throw NotImplementedException(A_FUNCINFO);
362}
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
369{
370 if (m_stat)
371 m_stat->print(m_trace.get());
372}
373
374/*---------------------------------------------------------------------------*/
375/*---------------------------------------------------------------------------*/
376
378barrier()
379{
380 m_thread_barrier->wait();
381}
382
383/*---------------------------------------------------------------------------*/
384/*---------------------------------------------------------------------------*/
385
388{
389 Real begin_time = platform::getRealTime();
390 m_message_queue->waitAll(requests);
391 Real end_time = platform::getRealTime();
392 m_stat->add("WaitAll",(end_time-begin_time),0);
393}
394
395/*---------------------------------------------------------------------------*/
396/*---------------------------------------------------------------------------*/
397
398ISerializeMessageList* SharedMemoryParallelMng::
399_createSerializeMessageList()
400{
401 return new MP::internal::SerializeMessageList(messagePassingMng());
402}
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
406
408probe(const PointToPointMessageInfo& message)
409{
410 PointToPointMessageInfo p2p_message(message);
411 p2p_message.setEmiterRank(MessageRank(m_rank));
412 return m_message_queue->probe(p2p_message);
413}
414
415/*---------------------------------------------------------------------------*/
416/*---------------------------------------------------------------------------*/
417
420{
421 PointToPointMessageInfo p2p_message(message);
422 p2p_message.setEmiterRank(MessageRank(m_rank));
423 return m_message_queue->legacyProbe(p2p_message);
424}
425
426/*---------------------------------------------------------------------------*/
427/*---------------------------------------------------------------------------*/
428
429auto SharedMemoryParallelMng::
430sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) -> Request
431{
432 auto p2p_message = buildMessage(message);
433 return m_message_queue->addSend(p2p_message,SendBufferInfo(values));
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
439auto SharedMemoryParallelMng::
440receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) -> Request
441{
442 auto p2p_message = buildMessage(message);
443 return m_message_queue->addReceive(p2p_message,ReceiveBufferInfo(values));
444}
445
446/*---------------------------------------------------------------------------*/
447/*---------------------------------------------------------------------------*/
448
451{
452 return m_utils_factory->createSynchronizer(this,family)._release();
453}
454
455/*---------------------------------------------------------------------------*/
456/*---------------------------------------------------------------------------*/
457
459createSynchronizer(const ItemGroup& group)
460{
461 return m_utils_factory->createSynchronizer(this,group)._release();
462}
463
464/*---------------------------------------------------------------------------*/
465/*---------------------------------------------------------------------------*/
466
469{
470 return m_utils_factory->createTopology(this)._release();
471}
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
475
477replication() const
478{
479 return m_replication;
480}
481
482/*---------------------------------------------------------------------------*/
483/*---------------------------------------------------------------------------*/
484
487{
488 delete m_replication;
489 m_replication = v;
490}
491
492/*---------------------------------------------------------------------------*/
493/*---------------------------------------------------------------------------*/
494
495IParallelMng* SharedMemoryParallelMng::
496_createSubParallelMng(Int32ConstArrayView kept_ranks)
497{
498 ARCANE_UNUSED(kept_ranks);
499 // On ne peut pas implémenter cette méthode car on passe par
500 // IParallelMngContainer::_createParallelMng() qui créé obligatoirement
501 // un 'Ref<IParallelMng>'.
502 ARCANE_THROW(NotSupportedException,"Use createSubParallelMngRef() instead");
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
510{
511 if (kept_ranks.empty())
512 ARCANE_FATAL("kept_ranks is empty");
513 ARCANE_CHECK_POINTER(m_sub_builder_factory);
514
516 Int32 nb_rank = kept_ranks.size();
517
518 // Regarde si je suis dans les listes des rangs conservés et si oui
519 // détermine mon rang dans le IParallelMng créé
520 Int32 my_new_rank = (-1);
521 for( Integer i=0; i<nb_rank; ++i )
522 if (kept_ranks[i]==m_rank){
523 my_new_rank = i;
524 break;
525 }
526
527 barrier();
528 // Le rang 0 créé le builder
529 if (m_rank==0){
530 builder = m_sub_builder_factory->_createParallelMngBuilder(nb_rank, m_mpi_communicator, m_mpi_communicator);
531 // Positionne le builder pour tout le monde
532 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder = builder;
533 }
534 barrier();
535
536 builder = m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder;
537 ARCANE_CHECK_POINTER(builder.get());
538
539 Ref<IParallelMng> new_parallel_mng;
540 if (my_new_rank>=0){
541 new_parallel_mng = builder->_createParallelMng(my_new_rank,traceMng());
542 //auto* new_sm = dynamic_cast<SharedMemoryParallelMng*>(new_parallel_mng.get());
543 //if (new_sm)
544 //new_sm->m_mpi_communicator = m_mpi_communicator;
545 }
546 barrier();
547 // Ici, tout le monde a créé son IParallelMng. On peut donc
548 // supprimer la référence au builder.
549 // TODO: il faudra ajouter un compteur de référence sur le builder
550 // sinon il ne sera jamais détruit.
551 if (m_rank==0){
552 m_all_dispatchers->m_create_sub_parallel_mng_info.m_builder.reset();
553 }
554 barrier();
555
556 return new_parallel_mng;
557}
558
559/*---------------------------------------------------------------------------*/
560/*---------------------------------------------------------------------------*/
561
568
569/*---------------------------------------------------------------------------*/
570/*---------------------------------------------------------------------------*/
571
572Ref<IParallelMng> SharedMemoryParallelMng::
573sequentialParallelMngRef()
574{
575 return m_sequential_parallel_mng;
576}
577
580{
581 return m_sequential_parallel_mng.get();
582}
583
584/*---------------------------------------------------------------------------*/
585/*---------------------------------------------------------------------------*/
586
588buildMessage(const PointToPointMessageInfo& orig_message)
589{
590 PointToPointMessageInfo p2p_message{orig_message};
591 p2p_message.setEmiterRank(MessageRank(m_rank));
592 return p2p_message;
593}
594
595/*---------------------------------------------------------------------------*/
596/*---------------------------------------------------------------------------*/
597
598PointToPointMessageInfo SharedMemoryParallelMng::
599buildMessage(Int32 dest,Parallel::eBlockingType blocking_mode)
600{
601 return buildMessage({MessageRank(dest),blocking_mode});
602}
603
604/*---------------------------------------------------------------------------*/
605/*---------------------------------------------------------------------------*/
606
612
613/*---------------------------------------------------------------------------*/
614/*---------------------------------------------------------------------------*/
615
616} // End namespace Arcane::MessagePassing
617
618/*---------------------------------------------------------------------------*/
619/*---------------------------------------------------------------------------*/
#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.