Arcane  v3.16.7.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#include "arcane/parallel/mpithread/internal/HybridMachineMemoryWindowBaseInternalCreator.h"
41
42#include "arcane/core/FactoryService.h"
43#include "arcane/core/AbstractService.h"
44#include "arcane/core/IApplication.h"
45#include "arcane/core/ParallelSuperMngDispatcher.h"
46#include "arcane/core/ApplicationBuildInfo.h"
47#include "arcane/core/ServiceBuilder.h"
48
49#include "arcane/core/IMainFactory.h"
50
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
57{
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
64class HybridParallelMngContainer
66{
67 public:
68 HybridParallelMngContainer(IApplication* app,Int32 nb_local_rank,
69 MP::Communicator mpi_comm, IParallelMngContainerFactory* factory,
70 Parallel::IStat* stat,MpiLock* mpi_lock);
71 ~HybridParallelMngContainer() override;
72
73
74 public:
75
76 void build();
77 Ref<IParallelMng> _createParallelMng(Int32 local_rank,ITraceMng* tm) override;
78
79 public:
80
82 Parallel::IStat* m_stat = nullptr;
84 MpiLock* m_mpi_lock = nullptr;
85 ISharedMemoryMessageQueue* m_message_queue = nullptr;
86 IThreadBarrier* m_thread_barrier = nullptr;
87 Int32 m_local_nb_rank = -1;
88 MpiThreadAllDispatcher* m_all_dispatchers = nullptr;
89 // Cet objet est partagé par tous les HybridParallelMng.
90 UniqueArray<HybridParallelMng*>* m_parallel_mng_list = nullptr;
91 Mutex* m_internal_create_mutex = nullptr;
92 IParallelMngContainerFactory* m_sub_builder_factory = nullptr;
93 HybridMachineMemoryWindowBaseInternalCreator* m_window_creator = nullptr;
94
95 private:
99 private:
100 void _setMPICommunicator();
101};
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106HybridParallelMngContainer::
107HybridParallelMngContainer(IApplication* app,Int32 nb_local_rank,
108 MP::Communicator mpi_comm, IParallelMngContainerFactory* factory,
109 Parallel::IStat* stat,MpiLock* mpi_lock)
110: m_application(app)
111, m_stat(stat)
112, m_thread_mng(new SharedMemoryThreadMng())
113, m_mpi_lock(mpi_lock)
114, m_local_nb_rank(nb_local_rank)
115, m_parallel_mng_list(new UniqueArray<HybridParallelMng*>())
116, m_sub_builder_factory(factory)
117, m_mpi_communicator(mpi_comm)
118{
119 _setMPICommunicator();
120}
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124
125HybridParallelMngContainer::
126~HybridParallelMngContainer()
127{
128 // TODO: regarder s'il faut détruire le communicateur
129 m_thread_barrier->destroy();
130 delete m_message_queue;
131 delete m_thread_mng;
132 delete m_all_dispatchers;
133 delete m_parallel_mng_list;
134 delete m_internal_create_mutex;
135 delete m_window_creator;
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
141void HybridParallelMngContainer::
142build()
143{
144 m_internal_create_mutex = new Mutex();
145
146 m_all_dispatchers = new MpiThreadAllDispatcher();
147 m_all_dispatchers->resize(m_local_nb_rank);
148
149 m_parallel_mng_list->resize(m_local_nb_rank);
150 m_parallel_mng_list->fill(nullptr);
151
152 m_message_queue = new SharedMemoryMessageQueue();
153 m_message_queue->init(m_local_nb_rank);
154
155 m_thread_barrier = platform::getThreadImplementationService()->createBarrier();
156 m_thread_barrier->init(m_local_nb_rank);
157
158 m_window_creator = new HybridMachineMemoryWindowBaseInternalCreator(m_local_nb_rank, m_thread_barrier);
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164void HybridParallelMngContainer::
165_setMPICommunicator()
166{
167 MPI_Comm comm = static_cast<MPI_Comm>(m_mpi_communicator);
168
169 if (comm==MPI_COMM_NULL)
170 ARCANE_THROW(ArgumentException,"Null MPI Communicator");
171 m_mpi_communicator = comm;
172
173 int rank = 0;
174 MPI_Comm_rank(m_mpi_communicator,&rank);
175 int size = 0;
176 MPI_Comm_size(m_mpi_communicator,&size);
177
178 m_mpi_comm_rank = rank;
179 m_mpi_comm_size = size;
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
186_createParallelMng(Int32 local_rank,ITraceMng* tm)
187{
188 if (local_rank<0 || local_rank>=m_local_nb_rank)
189 ARCANE_THROW(ArgumentException,"Bad value '{0}' for local_rank (max={1})",
190 local_rank,m_local_nb_rank);
191
192 // Cette méthode n'est pas réentrante.
193 Mutex::ScopedLock sl(m_internal_create_mutex);
194
195 Int32 nb_process = m_mpi_comm_size;
196 bool is_parallel = nb_process > 1;
197
198 // Le communicateur passé en argument reste notre propriété.
200 bi.is_parallel = is_parallel;
201 bi.stat = m_stat;
202 bi.trace_mng = tm;
203 bi.thread_mng = m_thread_mng;
204 bi.is_mpi_comm_owned = false;
205 bi.mpi_lock = m_mpi_lock;
206
207 if (m_mpi_lock)
208 tm->info() << "MPI implementation need serialized threads : using locks";
209
210 MpiParallelMng* mpi_pm = new MpiParallelMng(bi);
211
212 mpi_pm->build();
213 mpi_pm->initialize();
214 mpi_pm->adapter()->enableDebugRequest(false);
215
217 build_info.local_rank = local_rank;
218 build_info.local_nb_rank = m_local_nb_rank;
219 build_info.mpi_parallel_mng = mpi_pm;
220 build_info.trace_mng = tm;
221 build_info.thread_mng = m_thread_mng;
222 build_info.message_queue = m_message_queue;
223 build_info.thread_barrier = m_thread_barrier;
224 build_info.parallel_mng_list = m_parallel_mng_list;
225 build_info.all_dispatchers = m_all_dispatchers;
226 build_info.sub_builder_factory = m_sub_builder_factory;
227 build_info.container = makeRef<IParallelMngContainer>(this);
228 build_info.window_creator = m_window_creator;
229
230 // NOTE: Cette instance sera détruite par l'appelant de cette méthode
231 HybridParallelMng* pm = new HybridParallelMng(build_info);
232 pm->build();
233 (*m_parallel_mng_list)[local_rank] = pm;
234
235 return makeRef<IParallelMng>(pm);
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
244class HybridParallelMngContainerFactory
245: public AbstractService
247{
248 public:
249 HybridParallelMngContainerFactory(const ServiceBuildInfo& sbi)
250 : AbstractService(sbi), m_application(sbi.application()){}
251 public:
253 _createParallelMngBuilder(Int32 nb_rank,MP::Communicator mpi_communicator) override
254 {
255 auto x = new HybridParallelMngContainer(m_application,nb_rank,mpi_communicator,
256 this,m_stat,m_mpi_lock);
257 x->build();
259 }
260 private:
261 IApplication* m_application;
262 public:
263 MpiLock* m_mpi_lock = nullptr;
264 Parallel::IStat* m_stat = nullptr;
265};
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
271 ServiceProperty("HybridParallelMngContainerFactory",ST_Application),
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
282class HybridParallelSuperMng
283: public ParallelSuperMngDispatcher
284{
285 public:
286
287 explicit HybridParallelSuperMng(const ServiceBuildInfo& sbi);
288 ~HybridParallelSuperMng() override;
289
290 void initialize() override;
291 void build() override;
292
293 IApplication* application() const override { return m_application; }
294 IThreadMng* threadMng() const override { return m_container->m_thread_mng; }
295 bool isParallel() const override { return true; }
296 Int32 commRank() const override { return m_mpi_comm_rank; }
297 Int32 commSize() const override { return m_mpi_comm_size; }
298 Int32 traceRank() const override { return m_mpi_comm_rank * m_container->m_local_nb_rank; }
299 void* getMPICommunicator() override { return &m_mpi_communicator; }
300 MP::Communicator communicator() const override { return m_communicator; }
302 void tryAbort() override;
303 bool isMasterIO() const override { return commRank()==0; }
304 Integer masterIORank() const override { return 0; }
305 Integer nbLocalSubDomain() override { return m_container->m_local_nb_rank; }
306 void barrier() override;
307
308 public:
309
310 public:
311
312 HybridParallelMngContainer* m_container = nullptr;
313 Ref<IParallelMngContainerFactory> m_builder_factory;
314 Ref<IParallelMngContainer> m_main_builder;
315
317 Parallel::IStat* m_stat;
320 MPI_Comm m_mpi_communicator;
321 MP::Communicator m_communicator;
322 Int32 m_local_nb_rank = A_NULL_RANK;
323 MpiLock* m_mpi_lock;
324 MpiAdapter* m_mpi_adapter;
325 MpiDatatypeList* m_datatype_list;
326 MpiErrorHandler m_error_handler;
327};
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331
332HybridParallelSuperMng::
333HybridParallelSuperMng(const ServiceBuildInfo& sbi)
334: m_application(sbi.application())
335, m_stat(nullptr)
336, m_mpi_comm_size(0)
337, m_mpi_communicator(MPI_COMM_NULL)
338, m_local_nb_rank(A_NULL_RANK)
339, m_mpi_lock(nullptr)
340, m_mpi_adapter(nullptr)
341, m_datatype_list(nullptr)
342{
344}
345
346/*---------------------------------------------------------------------------*/
347/*---------------------------------------------------------------------------*/
348
349HybridParallelSuperMng::
350~HybridParallelSuperMng()
351{
352 m_error_handler.removeHandler();
353 _finalize();
354 delete m_datatype_list;
355 if (m_mpi_adapter)
356 arcaneCallFunctionAndTerminateIfThrow([&]() { m_mpi_adapter->destroy(); });
357 delete m_mpi_lock;
358 delete m_stat;
359 MPI_Barrier(m_mpi_communicator);
360 MPI_Comm_free(&m_mpi_communicator);
361 m_mpi_communicator = MPI_COMM_NULL;
363}
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
367
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375
377build()
378{
379 if (!arcaneHasThread())
380 ARCANE_FATAL("Can not create HybridParallelSuperMng because threads are disabled");
381
382 Request::setNullRequest(Request(0,nullptr,MPI_REQUEST_NULL));
383 Communicator::setNullCommunicator(Communicator(MPI_COMM_NULL));
384
385 int rank, size;
386 int* argc = nullptr;
387 char*** argv = nullptr;
388
389 const ApplicationInfo& app_info = m_application->applicationInfo();
390 const CommandLineArguments& cmd_line_args = app_info.commandLineArguments();
391 argc = cmd_line_args.commandLineArgc();
392 argv = cmd_line_args.commandLineArgv();
393
394 bool need_serialize = false;
395
396 // Essaie avec MPI_THREAD_MULTIPLE
397 // ce qui permet d'appeler MPI depuis plusieurs threads en même temps
398 // Si ce niveau n'existe pas, il faut au moins le niveau
399 // MPI_THREAD_SERIALIZED ce qui permet d'appeler MPI depuis plusieurs
400 // threads mais un seul à la fois. Il faut donc dans ce cas mettre
401 // des verrous autour des appels MPI. Dans notre cas, les verrous
402 // ne sont utiliser que pour les communications point à point car
403 // pour les opérations collectives il n'y a qu'un seul thread qui les fait
404 // à la fois.
405 int thread_wanted = MPI_THREAD_MULTIPLE;
406 int thread_provided = 0;
407
408 Real start_time = platform::getRealTime();
409 arcaneInitializeMPI(argc,argv,thread_wanted);
410 Real end_time = platform::getRealTime();
411 MPI_Query_thread(&thread_provided);
412
413 if (thread_provided < MPI_THREAD_MULTIPLE) {
414 if (thread_provided>=MPI_THREAD_SERIALIZED)
415 need_serialize = true;
416 else{
417 // Le niveau de thread requis n'est pas disponible.
418 // Lance un fatal mais seulement un seul processeur.
419 int my_rank = 0;
420 MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
421 if (my_rank!=0)
422 ARCANE_FATAL("MPI thread level provided!=wanted ({0}!={1})",
423 thread_provided,thread_wanted);
424 }
425 }
426
427 // decommenter pour forcer l'usage des verrous pour test.
428 // need_serialize = true;
429
430 if (need_serialize)
431 m_mpi_lock = new MpiLock();
432
433 MPI_Comm_dup(MPI_COMM_WORLD,&m_mpi_communicator);
434 m_communicator = Communicator(m_mpi_communicator);
435 MPI_Comm_rank(m_mpi_communicator,&rank);
436 MPI_Comm_size(m_mpi_communicator,&size);
437
438 m_mpi_comm_rank = rank;
439 m_mpi_comm_size = size;
441
442 m_error_handler.registerHandler(m_mpi_communicator);
443
444 Integer n = app->applicationBuildInfo().nbSharedMemorySubDomain();
445 if (n==0)
446 ARCANE_FATAL("Number of shared memory sub-domains is not defined");
447 m_local_nb_rank = n;
448
449 if (rank==0){
450 ITraceMng* tm = app->traceMng();
451 tm->info() << "MPI has non blocking collective";
452 tm->info() << "MPI: sizeof(MPI_Count)=" << sizeof(MPI_Count);
453 tm->info() << "MPI: is Cuda Aware?=" << arcaneIsCudaAwareMPI();
454 tm->info() << "MPI: init_time (seconds)=" << (end_time-start_time);
455 }
456
457 /*cout << "ThreadSuperParallelMng: nb_sub_domain=" << m_local_nb_rank
458 << " env=" << s
459 << " mpi_rank=" << m_mpi_comm_rank << "/" << m_mpi_comm_size
460 << " first_rank=" << m_current_rank << '\n';*/
461
462 ITraceMng* tm = app->traceMng();
463 m_datatype_list = new MpiDatatypeList(false);
464 auto* adapter = new MpiAdapter(tm,m_stat->toArccoreStat(),m_communicator,nullptr);
465 m_mpi_adapter = adapter;
466 auto c = createBuiltInDispatcher<Byte>(tm,nullptr,m_mpi_adapter,m_datatype_list);
467 auto i32 = createBuiltInDispatcher<Int32>(tm,nullptr,m_mpi_adapter,m_datatype_list);
468 auto i64 = createBuiltInDispatcher<Int64>(tm,nullptr,m_mpi_adapter,m_datatype_list);
469 auto r = createBuiltInDispatcher<Real>(tm,nullptr,m_mpi_adapter,m_datatype_list);
470 _setDispatchers(c,i32,i64,r);
471
473 String service_name = "HybridParallelMngContainerFactory";
474 m_builder_factory = sb.createReference(service_name);
475 auto* true_builder = dynamic_cast<HybridParallelMngContainerFactory*>(m_builder_factory.get());
476 ARCANE_CHECK_POINTER(true_builder);
477 true_builder->m_stat = m_stat;
478 true_builder->m_mpi_lock = m_mpi_lock;
479
480 Ref<IParallelMngContainer> x = m_builder_factory->_createParallelMngBuilder(n,m_communicator);
481 m_main_builder = x;
482 m_container = dynamic_cast<HybridParallelMngContainer*>(x.get());
483 ARCANE_CHECK_POINTER(m_container);
484}
485
486/*---------------------------------------------------------------------------*/
487/*---------------------------------------------------------------------------*/
488
491{
492 if (local_rank<0 || local_rank>=m_local_nb_rank)
493 throw ArgumentException(A_FUNCINFO,"Bad value for local_rank");
494
495 Int32 current_global_rank = local_rank + m_local_nb_rank * commRank();
496 ITraceMng* app_tm = m_application->traceMng();
497 app_tm->info() << "Create SharedMemoryParallelMng rank=" << current_global_rank;
498
499 ITraceMng* tm = nullptr;
500 if (local_rank==0){
501 // Le premier sous-domaine créé utilise le traceMng() par défaut.
502 tm = app_tm;
503 }
504 else{
505 tm = m_application->createAndInitializeTraceMng(app_tm,String::fromNumber(current_global_rank));
506 }
507
508 Ref<IParallelMng> pm = m_container->_createParallelMng(local_rank,tm);
509 return pm;
510}
511
512/*---------------------------------------------------------------------------*/
513/*---------------------------------------------------------------------------*/
514
516tryAbort()
517{
518 m_application->traceMng()->flush();
519 MPI_Abort(m_communicator,2);
520}
521
522/*---------------------------------------------------------------------------*/
523/*---------------------------------------------------------------------------*/
524
526barrier()
527{
528 MPI_Barrier(m_communicator);
529}
530
531/*---------------------------------------------------------------------------*/
532/*---------------------------------------------------------------------------*/
533
535 ServiceProperty("HybridParallelSuperMng",ST_Application),
537
538// Ancien nom
540 ServiceProperty("MpiThreadParallelSuperMng",ST_Application),
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
546/*---------------------------------------------------------------------------*/
547/*---------------------------------------------------------------------------*/
554class MpiSharedMemoryParallelSuperMng
555: public SharedMemoryParallelSuperMng
556{
557 public:
558 explicit MpiSharedMemoryParallelSuperMng(const ServiceBuildInfo& sbi)
559 : SharedMemoryParallelSuperMng(sbi,Parallel::Communicator(MPI_COMM_WORLD),true)
560 {
561 Request::setNullRequest(Request(0,nullptr,MPI_REQUEST_NULL));
562 Communicator::setNullCommunicator(Communicator(MPI_COMM_NULL));
563 }
564
565 ~MpiSharedMemoryParallelSuperMng() override
566 {
567 //arcaneFinalizeMPI();
568 }
569
570 void build() override
571 {
573 }
574};
575
576/*---------------------------------------------------------------------------*/
577/*---------------------------------------------------------------------------*/
578
580 ServiceProperty("MpiSharedMemoryParallelSuperMng",ST_Application),
582
583/*---------------------------------------------------------------------------*/
584/*---------------------------------------------------------------------------*/
585
586} // End namespace Arcane::MessagePassing
587
588/*---------------------------------------------------------------------------*/
589/*---------------------------------------------------------------------------*/
#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.
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.