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