Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
RuntimeLoader.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/* RuntimeLoader.cc (C) 2000-2025 */
9/* */
10/* Gestion du chargement du runtime accélérateur. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/common/accelerator/internal/RuntimeLoader.h"
15
16#include "arccore/base/PlatformUtils.h"
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/base/internal/IDynamicLibraryLoader.h"
19
22#include "arccore/common/internal/MemoryUtilsInternal.h"
23#include "arccore/common/accelerator/AcceleratorRuntimeInitialisationInfo.h"
24#include "arccore/common/accelerator/internal/RegisterRuntimeInfo.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane::Accelerator::Impl
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
49 const String& default_runtime_name,
50 const String& library_path,
51 bool& has_accelerator)
52{
53 has_accelerator = false;
54 //AcceleratorRuntimeInitialisationInfo& init_info = si->m_accelerator_init_info;
55 if (!init_info.isUsingAcceleratorRuntime())
56 return 0;
57 String runtime_name = init_info.acceleratorRuntime();
58 if (runtime_name == "sequential")
59 return 0;
60 if (runtime_name.empty())
61 runtime_name = default_runtime_name;
62 if (runtime_name.empty())
63 return 0;
64 init_info.setAcceleratorRuntime(runtime_name);
65 try {
66 // Pour l'instant, seuls les runtimes 'cuda', 'hip' et 'sycl' sont autorisés
67 if (runtime_name != "cuda" && runtime_name != "hip" && runtime_name != "sycl")
68 ARCCORE_FATAL("Invalid accelerator runtime '{0}'. Only 'cuda', 'hip' or 'sycl' is allowed", runtime_name);
69
70 // Pour pouvoir automatiquement enregistrer un runtime accélérateur de nom \a NAME,
71 // il faut appeler la méthode 'arcaneRegisterAcceleratorRuntime${NAME}' qui se trouve
72 // dans la bibliothèque dynamique 'arcane_${NAME}'.
73
74 typedef void (*ArcaneAutoDetectAcceleratorFunctor)(Accelerator::RegisterRuntimeInfo&);
75
77
78 String os_dir(library_path);
79 String dll_name = "arccore_accelerator_" + runtime_name + "_runtime";
80 String symbol_name = "arcaneRegisterAcceleratorRuntime" + runtime_name;
81 IDynamicLibrary* dl = dll_loader->open(os_dir, dll_name);
82 if (!dl)
83 ARCCORE_FATAL("Can not found dynamic library '{0}' for using accelerator runtime", dll_name);
84
85 bool is_found = false;
86 void* functor_addr = dl->getSymbolAddress(symbol_name, &is_found);
87 if (!is_found || !functor_addr)
88 ARCCORE_FATAL("Can not find symbol '{0}' in library '{1}'", symbol_name, dll_name);
89
90 auto my_functor = reinterpret_cast<ArcaneAutoDetectAcceleratorFunctor>(functor_addr);
92
93 String verbose_str = Platform::getEnvironmentVariable("ARCANE_DEBUG_ACCELERATOR");
94 if (!verbose_str.null())
95 runtime_info.setVerbose(true);
96
97 (*my_functor)(runtime_info);
98 has_accelerator = true;
99
100 // Permet de surcharger le choix de l'allocateur des données
101 String data_allocator_str = Platform::getEnvironmentVariable("ARCANE_DEFAULT_DATA_MEMORY_RESOURCE");
102 if (!data_allocator_str.null()) {
106 }
107 }
108 catch (const Exception& ex) {
109 return ExceptionUtils::print(ex, nullptr);
110 }
111 catch (const std::exception& ex) {
112 return ExceptionUtils::print(ex, nullptr);
113 }
114 catch (...) {
115 return ExceptionUtils::print(nullptr);
116 }
117 return 0;
118}
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122
123} // namespace Arcane::Accelerator::Impl
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires pour la gestion des exceptions.
ARCCORE_COMMON_EXPORT Int32 print(ITraceMng *tm, bool is_no_continue=true)
Imprime un message pour une exception inconnue.
Fonctions utilitaires de gestion mémoire.
void setAcceleratorRuntime(StringView name)
Nom du runtime utilisé (pour l'instant uniquement 'cuda', 'hip' ou 'sycl')
static int loadRuntime(AcceleratorRuntimeInitialisationInfo &init_info, const String &default_runtime_name, const String &library_path, bool &has_accelerator)
Détecte et charge la bibliothèque de gestion du runtime des accélérateurs.
Informations pour initialiser le runtime accélérateur.
Classe de base d'une exception.
Interface d'un chargeur dynamique de bibliothèque.
static IDynamicLibraryLoader * getDefault()
Service utilisé pour charger dynamiquement des bibliothèques.
Interface d'une bibliothèque dynamique.
virtual void * getSymbolAddress(const String &symbol_name, bool *is_found)=0
Retourne l'adresse du symbol de nom symbol_name.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:305
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:316
ARCCORE_COMMON_EXPORT void setDefaultDataMemoryResource(eMemoryResource mem_resource)
Positionne la ressource mémoire utilisée pour l'allocateur mémoire des données.
ARCCORE_COMMON_EXPORT eMemoryResource getMemoryResourceFromName(const String &name)
Retourne la ressource mémoire par son nom.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
eMemoryResource
Liste des ressources mémoire disponibles.
@ Unknown
Valeur inconnue ou non initialisée.