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
49loadRuntime(AcceleratorRuntimeInitialisationInfo& init_info,
50 const String& default_runtime_name,
51 const String& library_path,
52 bool& has_accelerator)
54 has_accelerator =
false;
56 if (!init_info.isUsingAcceleratorRuntime())
58 String runtime_name = init_info.acceleratorRuntime();
59 if (runtime_name ==
"sequential")
61 if (runtime_name.empty())
62 runtime_name = default_runtime_name;
63 if (runtime_name.empty())
65 init_info.setAcceleratorRuntime(runtime_name);
68 if (runtime_name !=
"cuda" && runtime_name !=
"hip" && runtime_name !=
"sycl")
69 ARCCORE_FATAL(
"Invalid accelerator runtime '{0}'. Only 'cuda', 'hip' or 'sycl' is allowed", runtime_name);
75 typedef void (*ArcaneAutoDetectAcceleratorFunctor)(Accelerator::RegisterRuntimeInfo&);
77 IDynamicLibraryLoader* dll_loader = IDynamicLibraryLoader::getDefault();
79 String os_dir(library_path);
80 String dll_name =
"arccore_accelerator_" + runtime_name +
"_runtime";
81 String symbol_name =
"arcaneRegisterAcceleratorRuntime" + runtime_name;
82 IDynamicLibrary* dl = dll_loader->open(os_dir, dll_name);
84 ARCCORE_FATAL(
"Can not found dynamic library '{0}' for using accelerator runtime", dll_name);
86 bool is_found =
false;
87 void* functor_addr = dl->getSymbolAddress(symbol_name, &is_found);
88 if (!is_found || !functor_addr)
89 ARCCORE_FATAL(
"Can not find symbol '{0}' in library '{1}'", symbol_name, dll_name);
91 auto my_functor =
reinterpret_cast<ArcaneAutoDetectAcceleratorFunctor
>(functor_addr);
92 Accelerator::RegisterRuntimeInfo runtime_info;
95 if (!verbose_str.null())
96 runtime_info.setVerbose(
true);
98 (*my_functor)(runtime_info);
99 has_accelerator =
true;
103 if (!data_allocator_str.null()) {
106 MemoryUtils::setDefaultDataMemoryResource(v);
109 catch (
const Exception& ex) {
110 return ExceptionUtils::print(ex,
nullptr);
112 catch (
const std::exception& ex) {
113 return ExceptionUtils::print(ex,
nullptr);
116 return ExceptionUtils::print(
nullptr);
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
Utility functions for exception handling.
Memory management utility functions.
eMemoryResource getMemoryResourceFromName(const String &name)
Returns the memory resource by its name.
eMemoryResource
List of available memory resources.
@ Unknown
Unknown or uninitialized value.