From 2974ff5a6fa9a67e6e5e5eaba30ef8ddf6a82828 Mon Sep 17 00:00:00 2001 From: Bogdan Pereanu Date: Thu, 2 Oct 2025 12:16:29 +0300 Subject: [PATCH] Call only zeInitDrivers for windows based on the ze_loader.dll version Signed-off-by: Bogdan Pereanu --- .../windows_conditional_compilation.yml | 6 +- .../include/intel_npu/utils/zero/zero_api.hpp | 4 ++ .../intel_npu/utils/zero/zero_init.hpp | 2 +- .../src/utils/src/zero/CMakeLists.txt | 4 ++ .../intel_npu/src/utils/src/zero/zero_api.cpp | 34 +++++++++-- .../src/utils/src/zero/zero_init.cpp | 58 ++++++++++++------- 6 files changed, 78 insertions(+), 30 deletions(-) diff --git a/.github/workflows/windows_conditional_compilation.yml b/.github/workflows/windows_conditional_compilation.yml index e64cd21f832244..bf3ab5fe0d44be 100644 --- a/.github/workflows/windows_conditional_compilation.yml +++ b/.github/workflows/windows_conditional_compilation.yml @@ -209,13 +209,13 @@ jobs: - name: Ctest - OpenVINO unit tests shell: cmd run: | - set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin;${{ env.BUILD_DIR }}\bin\${{ env.CMAKE_BUILD_TYPE }} + set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin ctest -C ${{ env.CMAKE_BUILD_TYPE }} --test-dir ${{ env.BUILD_DIR }} -V -L UNIT - name: Perform code tracing via ITT collector shell: cmd run: | - set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin;${{ env.BUILD_DIR }}\bin\${{ env.CMAKE_BUILD_TYPE }} + set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin python3 ${{ env.OPENVINO_REPO }}\thirdparty\itt_collector\runtool\sea_runtool.py ^ --bindir ${{ env.OPENVINO_REPO }}\bin\intel64\${{ env.CMAKE_BUILD_TYPE }} ^ @@ -395,7 +395,7 @@ jobs: - name: Run with CC-ed runtime shell: cmd run: | - set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin;${{ env.BUILD_DIR }}\bin\${{ env.CMAKE_BUILD_TYPE }} + set path=%path%;${{ env.OPENVINO_REPO }}\temp\Windows_AMD64\tbb\bin ${{ env.OPENVINO_REPO }}\bin\intel64\${{ env.CMAKE_BUILD_TYPE }}\benchmark_app.exe -niter 1 -nireq 1 -m ${{ env.MODELS_PATH }}\models\test_model\test_model_fp32.xml -d CPU CPU_Functional_Tests: diff --git a/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_api.hpp b/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_api.hpp index 80cfed03e7a946..d3909fb4d4b470 100644 --- a/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_api.hpp +++ b/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_api.hpp @@ -80,6 +80,8 @@ class ZeroApi { static const std::shared_ptr& getInstance(); + const uint32_t getVersion(); + #define symbol_statement(symbol) decltype(&::symbol) symbol; symbols_list(); weak_symbols_list(); @@ -87,6 +89,8 @@ class ZeroApi { private: std::shared_ptr lib; + + uint32_t version = 0; }; #define symbol_statement(symbol) \ diff --git a/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_init.hpp b/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_init.hpp index bdc2206f388f05..4133b36cfaa44d 100644 --- a/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_init.hpp +++ b/src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_init.hpp @@ -79,7 +79,7 @@ class ZeroInitStructsHolder final { void initNpuDriver(); // keep zero_api alive until context is destroyed - std::shared_ptr zero_api; + std::shared_ptr zero_api = nullptr; static const ze_driver_uuid_t uuid; Logger log; diff --git a/src/plugins/intel_npu/src/utils/src/zero/CMakeLists.txt b/src/plugins/intel_npu/src/utils/src/zero/CMakeLists.txt index e30d60ca3c233a..506aca6ebbea92 100644 --- a/src/plugins/intel_npu/src/utils/src/zero/CMakeLists.txt +++ b/src/plugins/intel_npu/src/utils/src/zero/CMakeLists.txt @@ -27,6 +27,10 @@ target_include_directories(${TARGET_NAME} target_link_libraries(${TARGET_NAME} PUBLIC openvino::runtime::dev) +if(WIN32) +target_link_libraries(${TARGET_NAME} PRIVATE Version.lib) +endif() + # # targets install # diff --git a/src/plugins/intel_npu/src/utils/src/zero/zero_api.cpp b/src/plugins/intel_npu/src/utils/src/zero/zero_api.cpp index cc52bfdfd32962..b67f789b9f187f 100644 --- a/src/plugins/intel_npu/src/utils/src/zero/zero_api.cpp +++ b/src/plugins/intel_npu/src/utils/src/zero/zero_api.cpp @@ -4,22 +4,40 @@ #include "intel_npu/utils/zero/zero_api.hpp" +#ifdef _WIN32 +# include +#endif + #include "openvino/util/file_util.hpp" #include "openvino/util/shared_object.hpp" namespace intel_npu { ZeroApi::ZeroApi() { - const std::string baseName = "ze_loader"; + const std::string base_name = "ze_loader"; try { - auto libpath = ov::util::make_plugin_library_name({}, baseName); + auto lib_path = ov::util::make_plugin_library_name({}, base_name); #if !defined(_WIN32) && !defined(ANDROID) - libpath = libpath + LIB_ZE_LOADER_SUFFIX; + lib_path = lib_path + LIB_ZE_LOADER_SUFFIX; #endif + this->lib = ov::util::load_shared_object(lib_path.c_str()); + #if defined(OPENVINO_ENABLE_UNICODE_PATH_SUPPORT) && defined(_WIN32) - this->lib = ov::util::load_shared_object(ov::util::string_to_wstring(libpath).c_str()); -#else - this->lib = ov::util::load_shared_object(libpath.c_str()); + DWORD handle = 0; + const wchar_t* wide_path = ov::util::string_to_wstring(lib_path).c_str(); + DWORD size = GetFileVersionInfoSizeW(wide_path, &handle); + if (size > 0) { + std::vector data(size); + if (GetFileVersionInfoW(wide_path, handle, size, data.data())) { + VS_FIXEDFILEINFO* loader_version = NULL; + uint32_t loader_version_size = 0; + if (VerQueryValueW(data.data(), L"\\", (LPVOID*)&loader_version, &loader_version_size) && + loader_version_size > 0 && loader_version != nullptr) { + // Version is in dwFileVersionMS (high: major.minor) and dwFileVersionLS (low: build.revision) + version = loader_version->dwFileVersionMS; + } + } + } #endif } catch (const std::runtime_error& error) { OPENVINO_THROW(error.what()); @@ -54,4 +72,8 @@ const std::shared_ptr& ZeroApi::getInstance() { return instance; } +const uint32_t ZeroApi::getVersion() { + return version; +} + } // namespace intel_npu diff --git a/src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp b/src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp index 5414d0718ecddf..42c536e25651d7 100644 --- a/src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp +++ b/src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp @@ -71,9 +71,21 @@ void ZeroInitStructsHolder::initNpuDriver() { } }; + uint32_t loader_version; + if (zero_api != nullptr) { + loader_version = zero_api->getVersion(); + } else { + loader_version = 0; + } + auto fallbackToZeDriverGet = [&]() { log.debug("ZeroInitStructsHolder - zeInitDrivers not supported, fallback to zeDriverGet"); + if (loader_version > 0) { + log.debug("ZeroInitStructsHolder - performing zeInit on NPU only"); + THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY)); + } + uint32_t drivers_count = 0; THROW_ON_FAIL_FOR_LEVELZERO("zeDriverGet", zeDriverGet(&drivers_count, nullptr)); @@ -84,31 +96,40 @@ void ZeroInitStructsHolder::initNpuDriver() { setNpuDriver(drivers_count, std::move(all_drivers)); }; - zel_version_t loader_version = {}; - size_t num_components; - auto result = zelLoaderGetVersions(&num_components, nullptr); - if (result == ZE_RESULT_SUCCESS) { - zel_component_version_t* versions = new zel_component_version_t[num_components]; - result = zelLoaderGetVersions(&num_components, versions); + uint32_t major; + uint32_t minor; + + if (loader_version == 0) { + log.debug("ZeroInitStructsHolder - performing zeInit on NPU only"); + THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY)); + zel_version_t zel_loader_version = {}; + size_t num_components; + auto result = zelLoaderGetVersions(&num_components, nullptr); if (result == ZE_RESULT_SUCCESS) { - for (size_t i = 0; i < num_components; ++i) { - if (strncmp(versions[i].component_name, "loader", strlen("loader")) == 0) { - loader_version = versions[i].component_lib_version; - - log.debug("ZeroInitStructsHolder - ze_loader.dll version: %d.%d.%d", - loader_version.major, - loader_version.minor, - loader_version.patch); + std::vector versions(num_components); + result = zelLoaderGetVersions(&num_components, versions.data()); + if (result == ZE_RESULT_SUCCESS) { + for (size_t i = 0; i < num_components; ++i) { + if (strncmp(versions[i].component_name, "loader", strlen("loader")) == 0) { + zel_loader_version = versions[i].component_lib_version; + log.debug("ZeroInitStructsHolder - ze_loader.dll version: %d.%d.%d", + zel_loader_version.major, + zel_loader_version.minor, + zel_loader_version.patch); + } } } } - delete[] versions; + major = zel_loader_version.major > 0 ? zel_loader_version.major : 0; + minor = zel_loader_version.minor > 0 ? zel_loader_version.minor : 0; + } else { + major = (loader_version >> 16) & 0xffff; + minor = loader_version & 0xffff; } - if (loader_version.major > 1 || (loader_version.major == 1 && loader_version.minor > 18) || - (loader_version.major == 1 && loader_version.minor == 18 && loader_version.patch >= 5)) { + if (major > 1 || (major == 1 && minor >= 19)) { uint32_t drivers_count = 0; ze_init_driver_type_desc_t desc = {}; desc.stype = ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC; @@ -138,9 +159,6 @@ void ZeroInitStructsHolder::initNpuDriver() { ZeroInitStructsHolder::ZeroInitStructsHolder() : zero_api(ZeroApi::getInstance()), log("NPUZeroInitStructsHolder", Logger::global().level()) { - log.debug("ZeroInitStructsHolder - performing zeInit on NPU only"); - THROW_ON_FAIL_FOR_LEVELZERO("zeInit", zeInit(ZE_INIT_FLAG_VPU_ONLY)); - log.debug("ZeroInitStructsHolder - initialize NPU Driver"); initNpuDriver();