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
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 // 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
81extern "C++" ARCANE_MPI_EXPORT bool
83{
84 return arcaneIsCudaAwareMPI() || arcaneIsHipAwareMPI();
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
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;
103
104 if (is_init!=0)
105 return;
106
107 int thread_provided = 0;
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
128{
129 public:
131};
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
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.
160
161 // TODO: utiliser les bons arguments.
162 int* argc = nullptr;
163 char*** argv = nullptr;
165
166 int comm_size = 0;
168
169 String message_passing_service = "Sequential";
170 if (comm_size>1){
172 message_passing_service = "Hybrid";
173 else
175 }
176 else{
178 message_passing_service = "MpiSharedMemory";
179 else
180 message_passing_service = "MpiSequential";
181 }
183 // Change le service par défaut.
184 app_build_info.internalSetDefaultMessagePassingService(message_passing_service);
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190namespace
191{
194bool global_already_added = false;
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200extern "C" ARCANE_MPI_EXPORT void
207
208extern "C++" ARCANE_MPI_EXPORT void
209arcaneInitializeMPI(int* argc,char*** argv,int wanted_thread_level)
210{
211 global_mpi_auto_init.initialize(argc,argv,wanted_thread_level);
212}
213
214extern "C++" ARCANE_MPI_EXPORT void
216{
217 global_mpi_auto_init.finalize();
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223} // End namespace Arcane.
224
225/*---------------------------------------------------------------------------*/
226/*---------------------------------------------------------------------------*/
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:149
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Classe singleton pour appeler automatiquement MPI_Init et MPI_Finalize si besoin. On appelle MPI_Fina...
Definition ArcaneMpi.cc:95
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:209
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indique si le runtime actuel de MPI a le support des accélérateurs.
Definition ArcaneMpi.cc:82
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:201
ARCANE_MPI_EXPORT void arcaneFinalizeMPI()
Definition ArcaneMpi.cc:215