Arcane
v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArcaneMpi.cc
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
//-----------------------------------------------------------------------------
3
// Copyright 2000-2024 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
/* ArcaneMpi.cc (C) 2000-2024 */
9
/* */
10
/* Déclarations globales pour la partie MPI de Arcane. */
11
/*---------------------------------------------------------------------------*/
12
/*---------------------------------------------------------------------------*/
13
14
#include "arcane/parallel/mpi/ArcaneMpi.h"
15
16
#include "arcane/utils/String.h"
17
#include "arcane/impl/ArcaneMain.h"
18
#include "arcane/ApplicationBuildInfo.h"
19
20
#include <iostream>
21
22
// Ce fichier est utilisé par OpenMpi pour définir des extensions
23
// La page https://www.open-mpi.org/faq/?category=runcuda
24
// indique comment détecter si on est CUDA-AWARE.
25
26
#if __has_include(<mpi-ext.h>)
27
#include <mpi-ext.h>
28
#endif
29
30
/*---------------------------------------------------------------------------*/
31
/*---------------------------------------------------------------------------*/
32
33
namespace
Arcane
34
{
35
36
/*---------------------------------------------------------------------------*/
37
/*---------------------------------------------------------------------------*/
38
39
extern
"C++"
ARCANE_MPI_EXPORT
bool
40
arcaneIsCudaAwareMPI
()
41
{
42
bool
is_aware
=
false
;
43
// OpenMPI définit MPIX_CUDA_AWARE_SUPPORT et mpich définit MPIX_GPU_SUPPORT_CUDA
44
// pour indiquer que MPIX_Query_cuda_support() est disponible.
45
#if defined(ARCANE_OS_LINUX)
46
#if defined(MPIX_CUDA_AWARE_SUPPORT) || defined(MPIX_GPU_SUPPORT_CUDA)
47
is_aware
= (
MPIX_Query_cuda_support
()==1);
48
#endif
49
#endif
50
return
is_aware
;
51
}
52
53
extern
"C++"
ARCANE_MPI_EXPORT
bool
54
arcaneIsHipAwareMPI()
55
{
56
bool
is_aware =
false
;
57
// OpenMPI définit MPIX_HIP_AWARE_SUPPORT et mpich définit MPIX_GPU_SUPPORT_HIP
58
// pour indiquer que MPIX_Query_hip_support() est disponible.
59
60
// MPICH
61
#if defined(ARCANE_OS_LINUX)
62
#if defined(MPIX_GPU_SUPPORT_HIP)
63
is_aware = (MPIX_Query_hip_support()==1);
64
#endif
65
66
// OpenMPI:
67
#if defined(MPIX_ROCM_AWARE_SUPPORT)
68
is_aware = (MPIX_Query_rocm_support()==1);
69
#endif
70
#endif
71
return
is_aware;
72
}
73
74
extern
"C++"
ARCANE_MPI_EXPORT
bool
75
arcaneIsAcceleratorAwareMPI
()
76
{
77
return
arcaneIsCudaAwareMPI
() || arcaneIsHipAwareMPI();
78
}
79
80
/*---------------------------------------------------------------------------*/
81
/*---------------------------------------------------------------------------*/
87
class
MpiAutoInit
88
{
89
public
:
90
MpiAutoInit
() : m_need_finalize(
false
) {}
91
public
:
92
void
initialize(
int
* argc,
char
*** argv,
int
wanted_thread_level
)
93
{
94
int
is_init
= 0;
95
MPI_Initialized
(&
is_init
);
96
97
if
(
is_init
!=0)
98
return
;
99
100
int
thread_provided
= 0;
101
MPI_Init_thread
(argc, argv,
wanted_thread_level
, &
thread_provided
);
102
m_need_finalize =
true
;
103
}
104
105
void
finalize()
106
{
107
if
(m_need_finalize){
108
MPI_Finalize
();
109
m_need_finalize =
false
;
110
}
111
}
112
private
:
113
bool
m_need_finalize;
114
};
115
116
/*---------------------------------------------------------------------------*/
117
/*---------------------------------------------------------------------------*/
118
119
class
AutoDetecterMPI
120
:
public
IApplicationBuildInfoVisitor
121
{
122
public
:
123
void
visit
(
ApplicationBuildInfo
&
app_build_info
)
override
;
124
};
125
126
/*---------------------------------------------------------------------------*/
127
/*---------------------------------------------------------------------------*/
141
void
AutoDetecterMPI::
142
visit
(
ApplicationBuildInfo
&
app_build_info
)
143
{
144
bool
has_shared_memory_message_passing
=
app_build_info
.nbSharedMemorySubDomain()>0;
145
146
// Si MPI n'a pas été initialisé, on le fait ici.
147
// On choisit le niveau de thread en fonction du nombre de
148
// sous-domaines en mémoire partagée spécifié. Si pas de mémoire
149
// partagée, prend MPI_THREAD_SERIALIZED.
150
int
thread_wanted
=
MPI_THREAD_SERIALIZED
;
151
if
(
has_shared_memory_message_passing
)
152
thread_wanted
=
MPI_THREAD_MULTIPLE
;
153
154
// TODO: utiliser les bons arguments.
155
int
* argc =
nullptr
;
156
char
*** argv =
nullptr
;
157
arcaneInitializeMPI
(argc,argv,
thread_wanted
);
158
159
int
comm_size
= 0;
160
MPI_Comm_size
(
MPI_COMM_WORLD
,&
comm_size
);
161
162
String
message_passing_service
=
"Sequential"
;
163
if
(
comm_size
>1){
164
if
(
has_shared_memory_message_passing
)
165
message_passing_service
=
"Hybrid"
;
166
else
167
message_passing_service
=
"Mpi"
;
168
}
169
else
{
170
if
(
has_shared_memory_message_passing
)
171
message_passing_service
=
"MpiSharedMemory"
;
172
else
173
message_passing_service
=
"MpiSequential"
;
174
}
175
message_passing_service
=
message_passing_service
+
"ParallelSuperMng"
;
176
// Change le service par défaut.
177
app_build_info
.internalSetDefaultMessagePassingService(
message_passing_service
);
178
}
179
180
/*---------------------------------------------------------------------------*/
181
/*---------------------------------------------------------------------------*/
182
183
namespace
184
{
185
MpiAutoInit
global_mpi_auto_init
;
186
AutoDetecterMPI
global_autodetecter_mpi
;
187
bool
global_already_added
=
false
;
188
}
189
190
/*---------------------------------------------------------------------------*/
191
/*---------------------------------------------------------------------------*/
192
193
extern
"C"
ARCANE_MPI_EXPORT
void
194
arcaneAutoDetectMessagePassingServiceMPI
()
195
{
196
if
(!
global_already_added
)
197
ArcaneMain::addApplicationBuildInfoVisitor
(&
global_autodetecter_mpi
);
198
global_already_added
=
true
;
199
}
200
201
extern
"C++"
ARCANE_MPI_EXPORT
void
202
arcaneInitializeMPI
(
int
* argc,
char
*** argv,
int
wanted_thread_level
)
203
{
204
global_mpi_auto_init
.initialize(argc,argv,
wanted_thread_level
);
205
}
206
207
extern
"C++"
ARCANE_MPI_EXPORT
void
208
arcaneFinalizeMPI
()
209
{
210
global_mpi_auto_init
.finalize();
211
}
212
213
/*---------------------------------------------------------------------------*/
214
/*---------------------------------------------------------------------------*/
215
216
}
// End namespace Arcane.
217
218
/*---------------------------------------------------------------------------*/
219
/*---------------------------------------------------------------------------*/
Arcane::ApplicationBuildInfo
Informations pour construire une instance de IApplication.
Definition
ApplicationBuildInfo.h:32
Arcane::ArcaneMain::addApplicationBuildInfoVisitor
static void addApplicationBuildInfoVisitor(IApplicationBuildInfoVisitor *visitor)
Ajoute un visiteur pour remplir ApplicationBuildInfo.
Definition
ArcaneMain.cc:802
Arcane::AutoDetecterMPI
Definition
ArcaneMpi.cc:121
Arcane::AutoDetecterMPI::visit
void visit(ApplicationBuildInfo &app_build_info) override
Remplit les valeurs par défaut pour les services d'échange de message.
Definition
ArcaneMpi.cc:142
Arcane::IApplicationBuildInfoVisitor
Definition
ArcaneMain.h:62
Arcane::LimaWrapper
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition
Lima.cc:120
Arcane::MpiAutoInit
Classe singleton pour appeler automatiquement MPI_Init et MPI_Finalize si besoin. On appelle MPI_Fina...
Definition
ArcaneMpi.cc:88
Arccore::String
Chaîne de caractères unicode.
Definition
arccore/src/base/arccore/base/String.h:70
Arcane
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Definition
AcceleratorGlobal.h:36
Arcane::arcaneInitializeMPI
ARCANE_MPI_EXPORT void arcaneInitializeMPI(int *argc, char ***argv, int wanted_thread_level)
Definition
ArcaneMpi.cc:202
Arcane::arcaneIsAcceleratorAwareMPI
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indique si le runtime actuel de MPI a le support des accélérateurs.
Definition
ArcaneMpi.cc:75
Arcane::arcaneIsCudaAwareMPI
ARCANE_MPI_EXPORT bool arcaneIsCudaAwareMPI()
Indique si le runtime actuel de MPI a le support de CUDA.
Definition
ArcaneMpi.cc:40
Arcane::arcaneAutoDetectMessagePassingServiceMPI
ARCANE_MPI_EXPORT void arcaneAutoDetectMessagePassingServiceMPI()
Mécanisme pour initialiser automatiquement MPI et les services d'échange de messages de Arcane en fon...
Definition
ArcaneMpi.cc:194
Arcane::arcaneFinalizeMPI
ARCANE_MPI_EXPORT void arcaneFinalizeMPI()
Definition
ArcaneMpi.cc:208
arcane
parallel
mpi
ArcaneMpi.cc
Généré le Lundi 18 Novembre 2024 03:01:41 pour Arcane par
1.9.8