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
33namespace Arcane
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
39extern "C++" ARCANE_MPI_EXPORT bool
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)
48#endif
49#endif
50 return is_aware;
51}
52
53extern "C++" ARCANE_MPI_EXPORT bool
54arcaneIsHipAwareMPI()
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
74extern "C++" ARCANE_MPI_EXPORT bool
76{
77 return arcaneIsCudaAwareMPI() || arcaneIsHipAwareMPI();
78}
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
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;
96
97 if (is_init!=0)
98 return;
99
100 int thread_provided = 0;
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
121{
122 public:
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
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.
153
154 // TODO: utiliser les bons arguments.
155 int* argc = nullptr;
156 char*** argv = nullptr;
158
159 int comm_size = 0;
161
162 String message_passing_service = "Sequential";
163 if (comm_size>1){
165 message_passing_service = "Hybrid";
166 else
168 }
169 else{
171 message_passing_service = "MpiSharedMemory";
172 else
173 message_passing_service = "MpiSequential";
174 }
176 // Change le service par défaut.
177 app_build_info.internalSetDefaultMessagePassingService(message_passing_service);
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
183namespace
184{
187bool global_already_added = false;
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193extern "C" ARCANE_MPI_EXPORT void
200
201extern "C++" ARCANE_MPI_EXPORT void
202arcaneInitializeMPI(int* argc,char*** argv,int wanted_thread_level)
203{
204 global_mpi_auto_init.initialize(argc,argv,wanted_thread_level);
205}
206
207extern "C++" ARCANE_MPI_EXPORT void
209{
210 global_mpi_auto_init.finalize();
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216} // End namespace Arcane.
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
Informations pour construire une instance de IApplication.
static void addApplicationBuildInfoVisitor(IApplicationBuildInfoVisitor *visitor)
Ajoute un visiteur pour remplir ApplicationBuildInfo.
void visit(ApplicationBuildInfo &app_build_info) override
Remplit les valeurs par défaut pour les services d'échange de message.
Definition ArcaneMpi.cc:142
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe singleton pour appeler automatiquement MPI_Init et MPI_Finalize si besoin. On appelle MPI_Fina...
Definition ArcaneMpi.cc:88
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCANE_MPI_EXPORT void arcaneInitializeMPI(int *argc, char ***argv, int wanted_thread_level)
Definition ArcaneMpi.cc:202
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indique si le runtime actuel de MPI a le support des accélérateurs.
Definition ArcaneMpi.cc:75
ARCANE_MPI_EXPORT bool arcaneIsCudaAwareMPI()
Indique si le runtime actuel de MPI a le support de CUDA.
Definition ArcaneMpi.cc:40
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_MPI_EXPORT void arcaneFinalizeMPI()
Definition ArcaneMpi.cc:208