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