Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
HybridParallelSuperMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* HybridParallelSuperMng.cc (C) 2000-2025 */
9/* */
10/* Gestionnaire de parallélisme utilisant MPI et mémoire partagée. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ApplicationInfo.h"
15#include "arcane/utils/NullThreadMng.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/ValueConvert.h"
20#include "arcane/utils/TraceClassConfig.h"
21#include "arcane/utils/ArgumentException.h"
22#include "arcane/utils/CommandLineArguments.h"
23
24#include "arcane/parallel/IStat.h"
25
26#include "arcane/parallel/mpi/MpiParallelMng.h"
27#include "arcane/parallel/mpi/MpiParallelDispatch.h"
28#include "arcane/parallel/mpi/MpiErrorHandler.h"
29
30#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
31#include "arccore/message_passing_mpi/internal/MpiLock.h"
32
33#include "arcane/parallel/thread/SharedMemoryMessageQueue.h"
34#include "arcane/parallel/thread/SharedMemoryParallelMng.h"
35#include "arcane/parallel/thread/SharedMemoryParallelSuperMng.h"
36#include "arcane/parallel/thread/internal/SharedMemoryThreadMng.h"
37
38#include "arcane/parallel/mpithread/HybridParallelMng.h"
39#include "arcane/parallel/mpithread/HybridParallelDispatch.h"
40
41#include "arcane/core/FactoryService.h"
42#include "arcane/core/AbstractService.h"
43#include "arcane/core/IApplication.h"
44#include "arcane/core/ParallelSuperMngDispatcher.h"
45#include "arcane/core/ApplicationBuildInfo.h"
46#include "arcane/core/ServiceBuilder.h"
47
48#include "arcane/core/IMainFactory.h"
49
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
56{
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
63class HybridParallelMngContainer
65{
66 public:
67 HybridParallelMngContainer(IApplication* app,Int32 nb_local_rank,
68 MP::Communicator mpi_comm, IParallelMngContainerFactory* factory,
69 Parallel::IStat* stat,MpiLock* mpi_lock);
70 ~HybridParallelMngContainer() override;
71
72
73 public:
74
75 void build();
76 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
77
78 public:
79
81 Parallel::IStat* m_stat = nullptr;
83 MpiLock* m_mpi_lock = nullptr;
84 ISharedMemoryMessageQueue* m_message_queue = nullptr;
85 IThreadBarrier* m_thread_barrier = nullptr;
86 Int32 m_local_nb_rank = -1;
87 MpiThreadAllDispatcher* m_all_dispatchers = nullptr;
88 // Cet objet est partagé par tous les HybridParallelMng.
89 UniqueArray<HybridParallelMng*>* m_parallel_mng_list = nullptr;
90 Mutex* m_internal_create_mutex = nullptr;
91 IParallelMngContainerFactory* m_sub_builder_factory = nullptr;
92 private:
96 private:
97 void _setMPICommunicator();
98};
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103HybridParallelMngContainer::
104HybridParallelMngContainer(IApplication* app,Int32 nb_local_rank,
105 MP::Communicator mpi_comm, IParallelMngContainerFactory* factory,
106 Parallel::IStat* stat,MpiLock* mpi_lock)
107: m_application(app)
108, m_stat(stat)
109, m_thread_mng(new SharedMemoryThreadMng())
110, m_mpi_lock(mpi_lock)
111, m_local_nb_rank(nb_local_rank)
112, m_parallel_mng_list(new UniqueArray<HybridParallelMng*>())
113, m_sub_builder_factory(factory)
114, m_mpi_communicator(mpi_comm)
115{
116 _setMPICommunicator();
117}
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121
122HybridParallelMngContainer::
123~HybridParallelMngContainer()
124{
125 // TODO: regarder s'il faut détruire le communicateur
126 m_thread_barrier->destroy();
127 delete m_message_queue;
128 delete m_thread_mng;
129 delete m_all_dispatchers;
130 delete m_parallel_mng_list;
131 delete m_internal_create_mutex;
132}
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
137void HybridParallelMngContainer::
138build()
139{
140 m_internal_create_mutex = new Mutex();
141
142 m_all_dispatchers = new MpiThreadAllDispatcher();
143 m_all_dispatchers->resize(m_local_nb_rank);
144
145 m_parallel_mng_list->resize(m_local_nb_rank);
146 m_parallel_mng_list->fill(nullptr);
147
148 m_message_queue = new SharedMemoryMessageQueue();
149 m_message_queue->init(m_local_nb_rank);
150
151 m_thread_barrier = platform::getThreadImplementationService()->createBarrier();
152 m_thread_barrier->init(m_local_nb_rank);
153}
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158void HybridParallelMngContainer::
159_setMPICommunicator()
160{
161 MPI_Comm comm = static_cast<MPI_Comm>(m_mpi_communicator);
162
163 if (comm==MPI_COMM_NULL)
164 ARCANE_THROW(ArgumentException,"Null MPI Communicator");
165 m_mpi_communicator = comm;
166
167 int rank = 0;
168 MPI_Comm_rank(m_mpi_communicator,&rank);
169 int size = 0;
170 MPI_Comm_size(m_mpi_communicator,&size);
171
172 m_mpi_comm_rank = rank;
173 m_mpi_comm_size = size;
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
180_createParallelMng(Int32 local_rank,ITraceMng* tm)
181{
182 if (local_rank<0 || local_rank>=m_local_nb_rank)
183 ARCANE_THROW(ArgumentException,"Bad value '{0}' for local_rank (max={1})",
184 local_rank,m_local_nb_rank);
185
186 // Cette méthode n'est pas réentrante.
187 Mutex::ScopedLock sl(m_internal_create_mutex);
188
189 Int32 nb_process = m_mpi_comm_size;
190 bool is_parallel = nb_process > 1;
191
192 // Le communicateur passé en argument reste notre propriété.
194 bi.is_parallel = is_parallel;
195 bi.stat = m_stat;
196 bi.trace_mng = tm;
197 bi.thread_mng = m_thread_mng;
198 bi.is_mpi_comm_owned = false;
199 bi.mpi_lock = m_mpi_lock;
200
201 if (m_mpi_lock)
202 tm->info() << "MPI implementation need serialized threads : using locks";
203
204 MpiParallelMng* mpi_pm = new MpiParallelMng(bi);
205
206 mpi_pm->build();
207 mpi_pm->initialize();
208 mpi_pm->adapter()->enableDebugRequest(false);
209
211 build_info.local_rank = local_rank;
212 build_info.local_nb_rank = m_local_nb_rank;
213 build_info.mpi_parallel_mng = mpi_pm;
214 build_info.trace_mng = tm;
215 build_info.thread_mng = m_thread_mng;
216 build_info.message_queue = m_message_queue;
217 build_info.thread_barrier = m_thread_barrier;
218 build_info.parallel_mng_list = m_parallel_mng_list;
219 build_info.all_dispatchers = m_all_dispatchers;
220 build_info.sub_builder_factory = m_sub_builder_factory;
221 build_info.container = makeRef<IParallelMngContainer>(this);
222
223 // NOTE: Cette instance sera détruite par l'appelant de cette méthode
224 HybridParallelMng* pm = new HybridParallelMng(build_info);
225 pm->build();
226 (*m_parallel_mng_list)[local_rank] = pm;
227
228 return makeRef<IParallelMng>(pm);
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
237class HybridParallelMngContainerFactory
238: public AbstractService
240{
241 public:
242 HybridParallelMngContainerFactory(const ServiceBuildInfo& sbi)
243 : AbstractService(sbi), m_application(sbi.application()){}
244 public:
246 _createParallelMngBuilder(Int32 nb_rank,MP::Communicator mpi_communicator) override
247 {
248 auto x = new HybridParallelMngContainer(m_application,nb_rank,mpi_communicator,
249 this,m_stat,m_mpi_lock);
250 x->build();
252 }
253 private:
254 IApplication* m_application;
255 public:
256 MpiLock* m_mpi_lock = nullptr;
257 Parallel::IStat* m_stat = nullptr;
258};
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
264 ServiceProperty("HybridParallelMngContainerFactory",ST_Application),
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
275class HybridParallelSuperMng
276: public ParallelSuperMngDispatcher
277{
278 public:
279
280 explicit HybridParallelSuperMng(const ServiceBuildInfo& sbi);
281 ~HybridParallelSuperMng() override;
282
283 void initialize() override;
284 void build() override;
285
286 IApplication* application() const override { return m_application; }
287 IThreadMng* threadMng() const override { return m_container->m_thread_mng; }
288 bool isParallel() const override { return true; }
289 Int32 commRank() const override { return m_mpi_comm_rank; }
290 Int32 commSize() const override { return m_mpi_comm_size; }
291 Int32 traceRank() const override { return m_mpi_comm_rank * m_container->m_local_nb_rank; }
292 void* getMPICommunicator() override { return &m_mpi_communicator; }
293 MP::Communicator communicator() const override { return m_communicator; }
295 void tryAbort() override;
296 bool isMasterIO() const override { return commRank()==0; }
297 Integer masterIORank() const override { return 0; }
298 Integer nbLocalSubDomain() override { return m_container->m_local_nb_rank; }
299 void barrier() override;
300
301 public:
302
303 public:
304
305 HybridParallelMngContainer* m_container = nullptr;
306 Ref<IParallelMngContainerFactory> m_builder_factory;
307 Ref<IParallelMngContainer> m_main_builder;
308
310 Parallel::IStat* m_stat;
313 MPI_Comm m_mpi_communicator;
314 MP::Communicator m_communicator;
315 Int32 m_local_nb_rank = A_NULL_RANK;
316 MpiLock* m_mpi_lock;
317 MpiAdapter* m_mpi_adapter;
318 MpiDatatypeList* m_datatype_list;
319 MpiErrorHandler m_error_handler;
320};
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
325HybridParallelSuperMng::
326HybridParallelSuperMng(const ServiceBuildInfo& sbi)
327: m_application(sbi.application())
328, m_stat(nullptr)
329, m_mpi_comm_size(0)
330, m_mpi_communicator(MPI_COMM_NULL)
331, m_local_nb_rank(A_NULL_RANK)
332, m_mpi_lock(nullptr)
333, m_mpi_adapter(nullptr)
334, m_datatype_list(nullptr)
335{
337}
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
342HybridParallelSuperMng::
343~HybridParallelSuperMng()
344{
345 m_error_handler.removeHandler();
346 _finalize();
347 delete m_datatype_list;
348 if (m_mpi_adapter)
349 arcaneCallFunctionAndTerminateIfThrow([&]() { m_mpi_adapter->destroy(); });
350 delete m_mpi_lock;
351 delete m_stat;
352 MPI_Barrier(m_mpi_communicator);
353 MPI_Comm_free(&m_mpi_communicator);
354 m_mpi_communicator = MPI_COMM_NULL;
356}
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
370build()
371{
372 if (!arcaneHasThread())
373 ARCANE_FATAL("Can not create HybridParallelSuperMng because threads are disabled");
374
375 Request::setNullRequest(Request(0,nullptr,MPI_REQUEST_NULL));
376 Communicator::setNullCommunicator(Communicator(MPI_COMM_NULL));
377
378 int rank, size;
379 int* argc = nullptr;
380 char*** argv = nullptr;
381
382 const ApplicationInfo& app_info = m_application->applicationInfo();
383 const CommandLineArguments& cmd_line_args = app_info.commandLineArguments();
384 argc = cmd_line_args.commandLineArgc();
385 argv = cmd_line_args.commandLineArgv();
386
387 bool need_serialize = false;
388
389 // Essaie avec MPI_THREAD_MULTIPLE
390 // ce qui permet d'appeler MPI depuis plusieurs threads en même temps
391 // Si ce niveau n'existe pas, il faut au moins le niveau
392 // MPI_THREAD_SERIALIZED ce qui permet d'appeler MPI depuis plusieurs
393 // threads mais un seul à la fois. Il faut donc dans ce cas mettre
394 // des verrous autour des appels MPI. Dans notre cas, les verrous
395 // ne sont utiliser que pour les communications point à point car
396 // pour les opérations collectives il n'y a qu'un seul thread qui les fait
397 // à la fois.
398 int thread_wanted = MPI_THREAD_MULTIPLE;
399 int thread_provided = 0;
400
401 Real start_time = platform::getRealTime();
402 arcaneInitializeMPI(argc,argv,thread_wanted);
403 Real end_time = platform::getRealTime();
404 MPI_Query_thread(&thread_provided);
405
406 if (thread_provided < MPI_THREAD_MULTIPLE) {
407 if (thread_provided>=MPI_THREAD_SERIALIZED)
408 need_serialize = true;
409 else{
410 // Le niveau de thread requis n'est pas disponible.
411 // Lance un fatal mais seulement un seul processeur.
412 int my_rank = 0;
413 MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
414 if (my_rank!=0)
415 ARCANE_FATAL("MPI thread level provided!=wanted ({0}!={1})",
416 thread_provided,thread_wanted);
417 }
418 }
419
420 // decommenter pour forcer l'usage des verrous pour test.
421 // need_serialize = true;
422
423 if (need_serialize)
424 m_mpi_lock = new MpiLock();
425
426 MPI_Comm_dup(MPI_COMM_WORLD,&m_mpi_communicator);
427 m_communicator = Communicator(m_mpi_communicator);
428 MPI_Comm_rank(m_mpi_communicator,&rank);
429 MPI_Comm_size(m_mpi_communicator,&size);
430
431 m_mpi_comm_rank = rank;
432 m_mpi_comm_size = size;
434
435 m_error_handler.registerHandler(m_mpi_communicator);
436
437 Integer n = app->applicationBuildInfo().nbSharedMemorySubDomain();
438 if (n==0)
439 ARCANE_FATAL("Number of shared memory sub-domains is not defined");
440 m_local_nb_rank = n;
441
442 if (rank==0){
443 ITraceMng* tm = app->traceMng();
444 tm->info() << "MPI has non blocking collective";
445 tm->info() << "MPI: sizeof(MPI_Count)=" << sizeof(MPI_Count);
446 tm->info() << "MPI: is Cuda Aware?=" << arcaneIsCudaAwareMPI();
447 tm->info() << "MPI: init_time (seconds)=" << (end_time-start_time);
448 }
449
450 /*cout << "ThreadSuperParallelMng: nb_sub_domain=" << m_local_nb_rank
451 << " env=" << s
452 << " mpi_rank=" << m_mpi_comm_rank << "/" << m_mpi_comm_size
453 << " first_rank=" << m_current_rank << '\n';*/
454
455 ITraceMng* tm = app->traceMng();
456 m_datatype_list = new MpiDatatypeList(false);
457 auto* adapter = new MpiAdapter(tm,m_stat->toArccoreStat(),m_communicator,nullptr);
458 m_mpi_adapter = adapter;
459 auto c = createBuiltInDispatcher<Byte>(tm,nullptr,m_mpi_adapter,m_datatype_list);
460 auto i32 = createBuiltInDispatcher<Int32>(tm,nullptr,m_mpi_adapter,m_datatype_list);
461 auto i64 = createBuiltInDispatcher<Int64>(tm,nullptr,m_mpi_adapter,m_datatype_list);
462 auto r = createBuiltInDispatcher<Real>(tm,nullptr,m_mpi_adapter,m_datatype_list);
463 _setDispatchers(c,i32,i64,r);
464
466 String service_name = "HybridParallelMngContainerFactory";
467 m_builder_factory = sb.createReference(service_name);
468 auto* true_builder = dynamic_cast<HybridParallelMngContainerFactory*>(m_builder_factory.get());
469 ARCANE_CHECK_POINTER(true_builder);
470 true_builder->m_stat = m_stat;
471 true_builder->m_mpi_lock = m_mpi_lock;
472
473 Ref<IParallelMngContainer> x = m_builder_factory->_createParallelMngBuilder(n,m_communicator);
474 m_main_builder = x;
475 m_container = dynamic_cast<HybridParallelMngContainer*>(x.get());
476 ARCANE_CHECK_POINTER(m_container);
477}
478
479/*---------------------------------------------------------------------------*/
480/*---------------------------------------------------------------------------*/
481
484{
485 if (local_rank<0 || local_rank>=m_local_nb_rank)
486 throw ArgumentException(A_FUNCINFO,"Bad value for local_rank");
487
488 Int32 current_global_rank = local_rank + m_local_nb_rank * commRank();
489 ITraceMng* app_tm = m_application->traceMng();
490 app_tm->info() << "Create SharedMemoryParallelMng rank=" << current_global_rank;
491
492 ITraceMng* tm = nullptr;
493 if (local_rank==0){
494 // Le premier sous-domaine créé utilise le traceMng() par défaut.
495 tm = app_tm;
496 }
497 else{
498 tm = m_application->createAndInitializeTraceMng(app_tm,String::fromNumber(current_global_rank));
499 }
500
501 Ref<IParallelMng> pm = m_container->_createParallelMng(local_rank,tm);
502 return pm;
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
509tryAbort()
510{
511 m_application->traceMng()->flush();
512 MPI_Abort(m_communicator,2);
513}
514
515/*---------------------------------------------------------------------------*/
516/*---------------------------------------------------------------------------*/
517
519barrier()
520{
521 MPI_Barrier(m_communicator);
522}
523
524/*---------------------------------------------------------------------------*/
525/*---------------------------------------------------------------------------*/
526
528 ServiceProperty("HybridParallelSuperMng",ST_Application),
530
531// Ancien nom
533 ServiceProperty("MpiThreadParallelSuperMng",ST_Application),
535
536/*---------------------------------------------------------------------------*/
537/*---------------------------------------------------------------------------*/
538
539/*---------------------------------------------------------------------------*/
540/*---------------------------------------------------------------------------*/
547class MpiSharedMemoryParallelSuperMng
548: public SharedMemoryParallelSuperMng
549{
550 public:
551 explicit MpiSharedMemoryParallelSuperMng(const ServiceBuildInfo& sbi)
552 : SharedMemoryParallelSuperMng(sbi,Parallel::Communicator(MPI_COMM_WORLD),true)
553 {
554 Request::setNullRequest(Request(0,nullptr,MPI_REQUEST_NULL));
555 Communicator::setNullCommunicator(Communicator(MPI_COMM_NULL));
556 }
557
558 ~MpiSharedMemoryParallelSuperMng() override
559 {
560 //arcaneFinalizeMPI();
561 }
562
563 void build() override
564 {
566 }
567};
568
569/*---------------------------------------------------------------------------*/
570/*---------------------------------------------------------------------------*/
571
573 ServiceProperty("MpiSharedMemoryParallelSuperMng",ST_Application),
575
576/*---------------------------------------------------------------------------*/
577/*---------------------------------------------------------------------------*/
578
579} // End namespace Arcane::MessagePassing
580
581/*---------------------------------------------------------------------------*/
582/*---------------------------------------------------------------------------*/
#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.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Informations sur une application.
const CommandLineArguments & commandLineArguments() const
Arguments de la ligne de commande.
Exception lorsqu'un argument est invalide.
Arguments de la ligne de commande.
Interface de l'application.
virtual const ApplicationBuildInfo & applicationBuildInfo() const =0
Informations sur les paramètres de construction de l'instance.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Classe abstraite du superviseur de parallélisme.
virtual void destroy()=0
Détruit la barrière.
virtual void init(Integer nb_thread)=0
Initialise la barrière pour nb_thread.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Communicateur pour l'échange de message.
Conteneur des informations du gestionnaire de message en mode hybride.
IApplication * m_application
Gestionnaire principal.
Ref< IParallelMng > _createParallelMng(Int32 local_rank, ITraceMng *tm) override
Créé le IParallelMng pour le rang local local_rank.
Gestionnaire du parallélisme utilisant les threads.
void build() override
Construit l'instance.
Superviseur du parallélisme utilisant MPI et Threads.
void tryAbort() override
Tente de faire un abort.
Int32 commRank() const override
Retourne le numéro du process (compris entre 0 et nbProcess()-1)
MP::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
void build() override
Construit les membres l'instance.
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
IThreadMng * threadMng() const override
Gestionnaire de thread.
IApplication * application() const override
Retourne le gestionnaire principal.
void barrier() override
Gestionnaire de parallèlisme pour l'ensemble des ressources allouées.
Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank) override
Créé un gestionnaire de parallélisme pour l'ensemble des coeurs alloués.
Integer masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
void initialize() override
Initialise l'instance.
Integer nbLocalSubDomain() override
Nombre de sous-domaines à créér localement.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
Int32 commSize() const override
Retourne le nombre total de process utilisés.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
Int32 traceRank() const override
Rang de cette instance pour les traces.
IApplication * m_application
Gestionnaire principal.
Interface d'une file de messages avec les threads.
Superviseur en mémoire partagé avec initialisation MPI.
void build() override
Construit les membres l'instance.
void destroy()
Détruit l'instance. Elle ne doit plus être utilisée par la suite.
Verrou pour les appels MPI.
Definition MpiLock.h:37
Requête d'un message.
Definition Request.h:77
void build() override
Construit les membres l'instance.
Gère les MPI_Datatype associées aux types Arcane.
Interface des messages pour le type Type.
Gestionnaire du parallélisme utilisant MPI.
void build() override
Construit l'instance.
void initialize() override
Initialise le gestionnaire du parallélisme.
Statistiques sur le parallélisme.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
IApplication * application() const
Accès à l'application IApplication associé.
Structure contenant les informations pour créer un service.
Classe utilitaire pour instantier un service d'une interface donnée.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Propriétés de création d'un service.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
Definition Parallel.h:50
IStat * createDefaultStat()
Créé une instance par défaut.
ARCCORE_BASE_EXPORT Real getRealTime()
Temps Real utilisé en secondes.
IThreadImplementation * getThreadImplementationService()
Service utilisé pour gérer les threads.
ARCANE_MPI_EXPORT void arcaneInitializeMPI(int *argc, char ***argv, int wanted_thread_level)
Definition ArcaneMpi.cc:209
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
Definition Misc.cc:99
ARCANE_MPI_EXPORT bool arcaneIsCudaAwareMPI()
Indique si le runtime actuel de MPI a le support de CUDA.
Definition ArcaneMpi.cc:40
Int32 Integer
Type représentant un entier.
@ ST_Application
Le service s'utilise au niveau de l'application.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
ARCANE_MPI_EXPORT void arcaneFinalizeMPI()
Definition ArcaneMpi.cc:215
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un HybridParallelMng.
Infos pour construire un MpiParallelMng.