ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert::compiler::BackendManager Class Reference

#include <BackendManager.h>

Public Types

using backend_create_t = backend::Backend *(*)()
 
using backend_destroy_t = void(*)(backend::Backend *)
 
using dlhandle_destroy_t = std::function< void(void *)>
 

Public Member Functions

backend::Backendget (std::string_view key)
 
const backend::Backendget (std::string_view key) const
 
const backend::BackendgetBuiltin () const
 
const std::vector< const backend::Backend * > getAll () const
 
size_t num_backends () const
 
void loadBackend (const std::string &backend)
 load backend plugin
 

Static Public Member Functions

static BackendManagerget ()
 

Detailed Description

Definition at line 29 of file BackendManager.h.

Member Typedef Documentation

◆ backend_create_t

◆ backend_destroy_t

◆ dlhandle_destroy_t

using onert::compiler::BackendManager::dlhandle_destroy_t = std::function<void(void *)>

Definition at line 34 of file BackendManager.h.

Member Function Documentation

◆ get() [1/3]

BackendManager & onert::compiler::BackendManager::get ( )
static

Definition at line 35 of file BackendManager.cc.

36{
37 static BackendManager object;
38 return object;
39}

Referenced by get(), get(), loadBackend(), and onert::compiler::ManualScheduler::schedule().

◆ get() [2/3]

backend::Backend * onert::compiler::BackendManager::get ( std::string_view  key)

Definition at line 128 of file BackendManager.cc.

129{
130 if (auto it = _gen_map.find(key); it != _gen_map.end())
131 {
132 return it->second.get();
133 }
134
135 return nullptr;
136}

References get().

◆ get() [3/3]

const backend::Backend * onert::compiler::BackendManager::get ( std::string_view  key) const

Definition at line 138 of file BackendManager.cc.

139{
140 if (auto it = _gen_map.find(key); it != _gen_map.end())
141 {
142 return it->second.get();
143 }
144
145 return nullptr;
146}

References get().

◆ getAll()

const std::vector< const backend::Backend * > onert::compiler::BackendManager::getAll ( ) const
inline

Definition at line 42 of file BackendManager.h.

43 {
44 std::vector<const backend::Backend *> v;
45 for (const auto &p : _gen_map)
46 v.emplace_back(p.second.get());
47 return v;
48 }
static BackendManager & get()
Configuration p

References p.

◆ getBuiltin()

const backend::Backend * onert::compiler::BackendManager::getBuiltin ( ) const

Definition at line 148 of file BackendManager.cc.

148{ return _builtin; }

◆ loadBackend()

void onert::compiler::BackendManager::loadBackend ( const std::string &  backend)

load backend plugin

Parameters
backendbackend to be loaded
Returns

Definition at line 58 of file BackendManager.cc.

59{
60 if (get(backend) != nullptr)
61 {
62 return;
63 }
64
65 const std::string backend_so = "libbackend_" + backend + SHARED_LIB_EXT;
66 void *handle = dlopen(backend_so.c_str(), RTLD_LAZY | RTLD_LOCAL);
67
68 if (handle == nullptr)
69 {
70 VERBOSE(BackendManager) << "Failed to load backend '" << backend << "' - " << dlerror() << "\n";
71 return;
72 }
73
74 VERBOSE(BackendManager) << "Successfully loaded '" << backend << "'(" << backend_so << ")\n";
75
76 {
77 // load object creator function
78 auto backend_create = (backend_create_t)dlsym(handle, "onert_backend_create");
79 if (backend_create == nullptr)
80 {
81 // TODO replace `fprintf` with `VERBOSE`
82 fprintf(stderr, "BackendManager: unable to find function `onert_backend_create` : %s\n",
83 dlerror());
84 dlclose(handle);
85 return;
86 }
87
88 // load object creator function
89 auto backend_destroy = (backend_destroy_t)dlsym(handle, "onert_backend_destroy");
90 if (backend_destroy == nullptr)
91 {
92 // TODO replace `fprintf` with `VERBOSE`
93 fprintf(stderr, "BackendManager: unable to find `function onert_backend_destroy` : %s\n",
94 dlerror());
95 dlclose(handle);
96 return;
97 }
98
99 auto backend_object =
100 std::unique_ptr<backend::Backend, backend_destroy_t>(backend_create(), backend_destroy);
101 bool initialized = backend_object->config()->initialize(); // Call initialize here?
102 if (!initialized)
103 {
104 VERBOSE(BackendManager) << backend.c_str()
105 << " backend initialization failed. Don't use this backend"
106 << std::endl;
107 dlclose(handle);
108 return;
109 }
110 _gen_map.emplace(backend_object->config()->id(), std::move(backend_object));
111 }
112
113 // Save backend handle (avoid warning by handle lost without dlclose())
114 auto u_handle = std::unique_ptr<void, dlhandle_destroy_t>{
115 handle, [id = backend, filename = backend_so](void *h) {
116 if (dlclose(h) == 0)
117 {
118 VERBOSE(BackendManager) << "Successfully unloaded '" << id << "'(" << filename << ")\n";
119 }
120 else
121 {
122 VERBOSE(BackendManager) << "Failed to unload backend '" << id << "'- " << dlerror() << "\n";
123 }
124 }};
125 _handle_map.emplace(backend, std::move(u_handle));
126}
void(*)(backend::Backend *) backend_destroy_t
backend::Backend *(*)() backend_create_t
#define VERBOSE(name, lv)
Definition Log.h:71

References get(), and VERBOSE.

◆ num_backends()

size_t onert::compiler::BackendManager::num_backends ( ) const
inline

Definition at line 49 of file BackendManager.h.

49{ return _gen_map.size(); }

The documentation for this class was generated from the following files: