14#include "arccore/common/accelerator/internal/RuntimeLoader.h"
16#include "arccore/base/PlatformUtils.h"
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/base/internal/IDynamicLibraryLoader.h"
22#include "arccore/common/internal/MemoryUtilsInternal.h"
23#include "arccore/common/accelerator/AcceleratorRuntimeInitialisationInfo.h"
24#include "arccore/common/accelerator/internal/RegisterRuntimeInfo.h"
29namespace Arcane::Accelerator::Impl
48loadRuntime(AcceleratorRuntimeInitialisationInfo& init_info,
49 const String& default_runtime_name,
50 const String& library_path,
51 bool& has_accelerator)
53 has_accelerator =
false;
55 if (!init_info.isUsingAcceleratorRuntime())
57 String runtime_name = init_info.acceleratorRuntime();
58 if (runtime_name ==
"sequential")
60 if (runtime_name.empty())
61 runtime_name = default_runtime_name;
62 if (runtime_name.empty())
64 init_info.setAcceleratorRuntime(runtime_name);
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);
74 typedef void (*ArcaneAutoDetectAcceleratorFunctor)(Accelerator::RegisterRuntimeInfo&);
76 IDynamicLibraryLoader* dll_loader = IDynamicLibraryLoader::getDefault();
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);
83 ARCCORE_FATAL(
"Can not found dynamic library '{0}' for using accelerator runtime", dll_name);
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);
90 auto my_functor =
reinterpret_cast<ArcaneAutoDetectAcceleratorFunctor
>(functor_addr);
91 Accelerator::RegisterRuntimeInfo runtime_info;
94 if (!verbose_str.null())
95 runtime_info.setVerbose(
true);
97 (*my_functor)(runtime_info);
98 has_accelerator =
true;
102 if (!data_allocator_str.null()) {
105 MemoryUtils::setDefaultDataMemoryResource(v);
108 catch (
const Exception& ex) {
109 return ExceptionUtils::print(ex,
nullptr);
111 catch (
const std::exception& ex) {
112 return ExceptionUtils::print(ex,
nullptr);
115 return ExceptionUtils::print(
nullptr);
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires pour la gestion des exceptions.
Fonctions utilitaires de gestion mémoire.
eMemoryResource getMemoryResourceFromName(const String &name)
Retourne la ressource mémoire par son nom.
eMemoryResource
Liste des ressources mémoire disponibles.
@ Unknown
Valeur inconnue ou non initialisée.