Skip to content

Commit f3f608b

Browse files
committed
Call only zeInitDrivers for windows based on the ze_loader.dll version
Signed-off-by: Bogdan Pereanu <[email protected]>
1 parent bac064b commit f3f608b

File tree

4 files changed

+77
-23
lines changed

4 files changed

+77
-23
lines changed

src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_api.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,17 @@ class ZeroApi {
8080

8181
static const std::shared_ptr<ZeroApi>& getInstance();
8282

83+
const uint32_t getVersion();
84+
8385
#define symbol_statement(symbol) decltype(&::symbol) symbol;
8486
symbols_list();
8587
weak_symbols_list();
8688
#undef symbol_statement
8789

8890
private:
8991
std::shared_ptr<void> lib;
92+
93+
uint32_t version = 0;
9094
};
9195

9296
#define symbol_statement(symbol) \

src/plugins/intel_npu/src/utils/src/zero/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ target_include_directories(${TARGET_NAME}
2525
$<TARGET_PROPERTY:LevelZero::NPUExt,INTERFACE_INCLUDE_DIRECTORIES>
2626
$<BUILD_INTERFACE:${NPU_UTILS_SOURCE_DIR}/include>)
2727

28-
target_link_libraries(${TARGET_NAME} PUBLIC openvino::runtime::dev)
28+
if(WIN32)
29+
target_link_libraries(${TARGET_NAME} PUBLIC openvino::runtime::dev Version.lib)
30+
else()
31+
target_link_libraries(${TARGET_NAME} PUBLIC openvino::runtime::dev)
32+
endif()
2933

3034
#
3135
# targets install

src/plugins/intel_npu/src/utils/src/zero/zero_api.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,47 @@
44

55
#include "intel_npu/utils/zero/zero_api.hpp"
66

7+
#include <stdio.h>
8+
#ifdef _WIN32
9+
# include <windows.h>
10+
#endif
11+
712
#include "openvino/util/file_util.hpp"
813
#include "openvino/util/shared_object.hpp"
914

1015
namespace intel_npu {
1116
ZeroApi::ZeroApi() {
12-
const std::string baseName = "ze_loader";
17+
const std::string base_name = "ze_loader";
1318
try {
14-
auto libpath = ov::util::make_plugin_library_name({}, baseName);
19+
auto libpath = ov::util::make_plugin_library_name({}, base_name);
1520
#if !defined(_WIN32) && !defined(ANDROID)
1621
libpath = libpath + LIB_ZE_LOADER_SUFFIX;
1722
#endif
1823

24+
#ifdef _WIN32
25+
// Get required size for wide string
26+
int size_needed = MultiByteToWideChar(CP_UTF8, 0, libpath.c_str(), -1, nullptr, 0);
27+
// Create a buffer to hold wide characters
28+
std::wstring wide(size_needed, 0);
29+
// Convert to wide string
30+
MultiByteToWideChar(CP_UTF8, 0, libpath.c_str(), -1, &wide[0], size_needed);
31+
// Get const wchar_t*
32+
const wchar_t* path = wide.c_str();
33+
34+
DWORD handle = 0;
35+
DWORD size = GetFileVersionInfoSizeW(path, &handle);
36+
std::vector<BYTE> data(size);
37+
if (GetFileVersionInfoW(path, handle, size, data.data())) {
38+
VS_FIXEDFILEINFO* loader_version = NULL;
39+
uint32_t loader_version_size = 0;
40+
if (VerQueryValueW(data.data(), L"\\", (LPVOID*)&loader_version, &loader_version_size) ||
41+
!loader_version_size) {
42+
// Version is in dwFileVersionMS (high: major.minor) and dwFileVersionLS (low: build.revision)
43+
version = loader_version->dwFileVersionMS;
44+
}
45+
}
46+
#endif
47+
1948
#if defined(OPENVINO_ENABLE_UNICODE_PATH_SUPPORT) && defined(_WIN32)
2049
this->lib = ov::util::load_shared_object(ov::util::string_to_wstring(libpath).c_str());
2150
#else
@@ -54,4 +83,8 @@ const std::shared_ptr<ZeroApi>& ZeroApi::getInstance() {
5483
return instance;
5584
}
5685

86+
const uint32_t ZeroApi::getVersion() {
87+
return version;
88+
}
89+
5790
} // namespace intel_npu

src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ void ZeroInitStructsHolder::initNpuDriver() {
7474
auto fallbackToZeDriverGet = [&]() {
7575
log.debug("ZeroInitStructsHolder - zeInitDrivers not supported, fallback to zeDriverGet");
7676

77+
log.debug("ZeroInitStructsHolder - performing zeInit on NPU only");
78+
THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY));
79+
7780
uint32_t drivers_count = 0;
7881
THROW_ON_FAIL_FOR_LEVELZERO("zeDriverGet", zeDriverGet(&drivers_count, nullptr));
7982

@@ -84,31 +87,44 @@ void ZeroInitStructsHolder::initNpuDriver() {
8487
setNpuDriver(drivers_count, std::move(all_drivers));
8588
};
8689

87-
zel_version_t loader_version = {};
88-
size_t num_components;
89-
auto result = zelLoaderGetVersions(&num_components, nullptr);
90-
if (result == ZE_RESULT_SUCCESS) {
91-
zel_component_version_t* versions = new zel_component_version_t[num_components];
92-
result = zelLoaderGetVersions(&num_components, versions);
90+
uint32_t loader_version = zero_api->getVersion();
91+
uint32_t major;
92+
uint32_t minor;
93+
94+
if (loader_version == 0) {
95+
log.debug("ZeroInitStructsHolder - performing zeInit on NPU only");
96+
THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY));
9397

98+
zel_version_t zel_loader_version = {};
99+
size_t num_components;
100+
auto result = zelLoaderGetVersions(&num_components, nullptr);
94101
if (result == ZE_RESULT_SUCCESS) {
95-
for (size_t i = 0; i < num_components; ++i) {
96-
if (strncmp(versions[i].component_name, "loader", strlen("loader")) == 0) {
97-
loader_version = versions[i].component_lib_version;
98-
99-
log.debug("ZeroInitStructsHolder - ze_loader.dll version: %d.%d.%d",
100-
loader_version.major,
101-
loader_version.minor,
102-
loader_version.patch);
102+
zel_component_version_t* versions = new zel_component_version_t[num_components];
103+
result = zelLoaderGetVersions(&num_components, versions);
104+
105+
if (result == ZE_RESULT_SUCCESS) {
106+
for (size_t i = 0; i < num_components; ++i) {
107+
if (strncmp(versions[i].component_name, "loader", strlen("loader")) == 0) {
108+
zel_loader_version = versions[i].component_lib_version;
109+
log.debug("ZeroInitStructsHolder - ze_loader.dll version: %d.%d.%d",
110+
zel_loader_version.major,
111+
zel_loader_version.minor,
112+
zel_loader_version.patch);
113+
}
103114
}
104115
}
116+
117+
delete[] versions;
105118
}
106119

107-
delete[] versions;
120+
major = zel_loader_version.major > 0 ? zel_loader_version.major : 0;
121+
minor = zel_loader_version.minor > 0 ? zel_loader_version.minor : 0;
122+
} else {
123+
major = (loader_version >> 16) & 0xffff;
124+
minor = loader_version & 0xffff;
108125
}
109126

110-
if (loader_version.major > 1 || (loader_version.major == 1 && loader_version.minor > 18) ||
111-
(loader_version.major == 1 && loader_version.minor == 18 && loader_version.patch >= 5)) {
127+
if (major > 1 || (major == 1 && minor >= 19)) {
112128
uint32_t drivers_count = 0;
113129
ze_init_driver_type_desc_t desc = {};
114130
desc.stype = ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC;
@@ -138,9 +154,6 @@ void ZeroInitStructsHolder::initNpuDriver() {
138154
ZeroInitStructsHolder::ZeroInitStructsHolder()
139155
: zero_api(ZeroApi::getInstance()),
140156
log("NPUZeroInitStructsHolder", Logger::global().level()) {
141-
log.debug("ZeroInitStructsHolder - performing zeInit on NPU only");
142-
THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY));
143-
144157
log.debug("ZeroInitStructsHolder - initialize NPU Driver");
145158
initNpuDriver();
146159

0 commit comments

Comments
 (0)