Arcane
v3.15.0.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
// CRAY MPICH
64
# if defined(CRAY_MPICH_VERSION)
65
int
is_supported = 0;
66
MPIX_GPU_query_support(MPIX_GPU_SUPPORT_HIP,&is_supported);
67
is_aware = (is_supported!=0);
68
# else
69
is_aware = (MPIX_Query_hip_support()==1);
70
# endif
71
#endif
72
73
// OpenMPI:
74
#if defined(MPIX_ROCM_AWARE_SUPPORT)
75
is_aware = (MPIX_Query_rocm_support()==1);
76
#endif
77
#endif
78
return
is_aware;
79
}
80
81
extern
"C++"
ARCANE_MPI_EXPORT
bool
82
arcaneIsAcceleratorAwareMPI
()
83
{
84
return
arcaneIsCudaAwareMPI
() || arcaneIsHipAwareMPI();
85
}
86
87
/*---------------------------------------------------------------------------*/
88
/*---------------------------------------------------------------------------*/
94
class
MpiAutoInit
95
{
96
public
:
97
MpiAutoInit
() : m_need_finalize(
false
) {}
98
public
:
99
void
initialize(
int
* argc,
char
*** argv,
int
wanted_thread_level
)
100
{
101
int
is_init
= 0;
102
MPI_Initialized
(&
is_init
);
103
104
if
(
is_init
!=0)
105
return
;
106
107
int
thread_provided
= 0;
108
MPI_Init_thread
(argc, argv,
wanted_thread_level
, &
thread_provided
);
109
m_need_finalize =
true
;
110
}
111
112
void
finalize()
113
{
114
if
(m_need_finalize){
115
MPI_Finalize
();
116
m_need_finalize =
false
;
117
}
118
}
119
private
:
120
bool
m_need_finalize;
121
};
122
123
/*---------------------------------------------------------------------------*/
124
/*---------------------------------------------------------------------------*/
125
126
class
AutoDetecterMPI
127
:
public
IApplicationBuildInfoVisitor
128
{
129
public
:
130
void
visit
(
ApplicationBuildInfo
&
app_build_info
)
override
;
131
};
132
133
/*---------------------------------------------------------------------------*/
134
/*---------------------------------------------------------------------------*/
148
void
AutoDetecterMPI::
149
visit
(
ApplicationBuildInfo
&
app_build_info
)
150
{
151
bool
has_shared_memory_message_passing
=
app_build_info
.nbSharedMemorySubDomain()>0;
152
153
// Si MPI n'a pas été initialisé, on le fait ici.
154
// On choisit le niveau de thread en fonction du nombre de
155
// sous-domaines en mémoire partagée spécifié. Si pas de mémoire
156
// partagée, prend MPI_THREAD_SERIALIZED.
157
int
thread_wanted
=
MPI_THREAD_SERIALIZED
;
158
if
(
has_shared_memory_message_passing
)
159
thread_wanted
=
MPI_THREAD_MULTIPLE
;
160
161
// TODO: utiliser les bons arguments.
162
int
* argc =
nullptr
;
163
char
*** argv =
nullptr
;
164
arcaneInitializeMPI
(argc,argv,
thread_wanted
);
165
166
int
comm_size
= 0;
167
MPI_Comm_size
(
MPI_COMM_WORLD
,&
comm_size
);
168
169
String
message_passing_service
=
"Sequential"
;
170
if
(
comm_size
>1){
171
if
(
has_shared_memory_message_passing
)
172
message_passing_service
=
"Hybrid"
;
173
else
174
message_passing_service
=
"Mpi"
;
175
}
176
else
{
177
if
(
has_shared_memory_message_passing
)
178
message_passing_service
=
"MpiSharedMemory"
;
179
else
180
message_passing_service
=
"MpiSequential"
;
181
}
182
message_passing_service
=
message_passing_service
+
"ParallelSuperMng"
;
183
// Change le service par défaut.
184
app_build_info
.internalSetDefaultMessagePassingService(
message_passing_service
);
185
}
186
187
/*---------------------------------------------------------------------------*/
188
/*---------------------------------------------------------------------------*/
189
190
namespace
191
{
192
MpiAutoInit
global_mpi_auto_init
;
193
AutoDetecterMPI
global_autodetecter_mpi
;
194
bool
global_already_added
=
false
;
195
}
196
197
/*---------------------------------------------------------------------------*/
198
/*---------------------------------------------------------------------------*/
199
200
extern
"C"
ARCANE_MPI_EXPORT
void
201
arcaneAutoDetectMessagePassingServiceMPI
()
202
{
203
if
(!
global_already_added
)
204
ArcaneMain::addApplicationBuildInfoVisitor
(&
global_autodetecter_mpi
);
205
global_already_added
=
true
;
206
}
207
208
extern
"C++"
ARCANE_MPI_EXPORT
void
209
arcaneInitializeMPI
(
int
* argc,
char
*** argv,
int
wanted_thread_level
)
210
{
211
global_mpi_auto_init
.initialize(argc,argv,
wanted_thread_level
);
212
}
213
214
extern
"C++"
ARCANE_MPI_EXPORT
void
215
arcaneFinalizeMPI
()
216
{
217
global_mpi_auto_init
.finalize();
218
}
219
220
/*---------------------------------------------------------------------------*/
221
/*---------------------------------------------------------------------------*/
222
223
}
// End namespace Arcane.
224
225
/*---------------------------------------------------------------------------*/
226
/*---------------------------------------------------------------------------*/
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:809
Arcane::AutoDetecterMPI
Definition
ArcaneMpi.cc:128
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:149
Arcane::IApplicationBuildInfoVisitor
Definition
ArcaneMain.h:62
Arcane::LimaWrapper
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition
Lima.cc:149
Arcane::MpiAutoInit
Classe singleton pour appeler automatiquement MPI_Init et MPI_Finalize si besoin. On appelle MPI_Fina...
Definition
ArcaneMpi.cc:95
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:209
Arcane::arcaneIsAcceleratorAwareMPI
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indique si le runtime actuel de MPI a le support des accélérateurs.
Definition
ArcaneMpi.cc:82
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:201
Arcane::arcaneFinalizeMPI
ARCANE_MPI_EXPORT void arcaneFinalizeMPI()
Definition
ArcaneMpi.cc:215
arcane
parallel
mpi
ArcaneMpi.cc
Généré le Lundi 13 Janvier 2025 02:58:45 pour Arcane par
1.9.8