Skip to content

Commit 2688439

Browse files
authored
[PTI-LIB] Enable Support for zeInitDrivers. (#489)
Add support for initializing level zero with `zeInitDrivers`. As of oneAPI 2025.1.0, the Unified Runtime initializes the Level Zero drivers with the API call `zeInitDrivers()`. However, this caused instability within our SYCL tests. If the Level Zero Loader version >= `1.19.2`, we will now call `zeInitDrivers` after `zeInit`. We keep the old (deprecated `zeInit`) to allow compatibility with older driver versions. Signed-off-by: Schilling, Matthew <matthew.schilling@intel.com>
1 parent 7f2bdd9 commit 2688439

File tree

9 files changed

+238
-27
lines changed

9 files changed

+238
-27
lines changed

sdk/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ add_library(pti_all INTERFACE)
108108
add_library(Pti::pti_all ALIAS pti_all)
109109

110110
# formerly pti_view
111-
add_library(pti MODULE "${PROJECT_SOURCE_DIR}/src/pti_view.cc")
111+
add_library(pti MODULE "${PROJECT_SOURCE_DIR}/src/pti_view.cc"
112+
"${PROJECT_SOURCE_DIR}/src/levelzero/ze_driver_init.cc")
112113
# We might want to make our own, but for now use CMake's
113114
# https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html
114115
include(GenerateExportHeader)

sdk/src/levelzero/ze_collector.h

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "pti/pti_view.h"
4141
#include "unikernel.h"
4242
#include "utils.h"
43+
#include "ze_driver_init.h"
4344
#include "ze_event_cache.h"
4445
#include "ze_local_collection_helpers.h"
4546
#include "ze_timer_helper.h"
@@ -177,33 +178,23 @@ class ZeCollector {
177178
void* callback_data = nullptr) {
178179
SPDLOG_DEBUG("In {}", __FUNCTION__);
179180
PTI_ASSERT(nullptr != pti_state);
180-
ze_result_t status = zeInit(ZE_INIT_FLAG_GPU_ONLY);
181-
if (status != ZE_RESULT_SUCCESS) {
182-
SPDLOG_CRITICAL(
183-
"zeInit() returned: {}. There might be Level-Zero Loader "
184-
"and Tracing library mismatch. Cannot continue",
185-
static_cast<uint32_t>(status));
181+
ZeDriverInit driver_init{};
182+
if (!driver_init.Success()) {
183+
SPDLOG_ERROR("Unable to initialize Level Zero driver(s)");
186184
*pti_state = pti_result::PTI_ERROR_DRIVER;
187-
}
188-
189-
ze_api_version_t version = utils::ze::GetVersion();
190-
PTI_ASSERT(ZE_MAJOR_VERSION(version) >= 1 && ZE_MINOR_VERSION(version) >= 3);
191-
SPDLOG_DEBUG("Driver version major: {}, minor: {}", ZE_MAJOR_VERSION(version),
192-
ZE_MINOR_VERSION(version));
193-
if ((*pti_state) != pti_result::PTI_SUCCESS) {
194-
// zeInit returned not SUCCESS but we want to know version of driver in any case
195185
return nullptr;
196186
}
197187

198-
auto collector =
199-
std::unique_ptr<ZeCollector>(new ZeCollector(options, acallback, fcallback, callback_data));
188+
auto collector = std::unique_ptr<ZeCollector>(
189+
new ZeCollector(options, acallback, fcallback, callback_data, driver_init.Drivers()));
190+
200191
PTI_ASSERT(collector != nullptr);
201192
collector->parent_state_ = pti_state;
202193

203194
zel_tracer_desc_t tracer_desc = {ZEL_STRUCTURE_TYPE_TRACER_EXP_DESC, nullptr, collector.get()};
204195
zel_tracer_handle_t tracer = nullptr;
205196
overhead::Init();
206-
status = zelTracerCreate(&tracer_desc, &tracer);
197+
auto status = zelTracerCreate(&tracer_desc, &tracer);
207198
overhead_fini(zelTracerCreate_id);
208199

209200
if (status != ZE_RESULT_SUCCESS) {
@@ -443,15 +434,16 @@ class ZeCollector {
443434

444435
private: // Implementation
445436
ZeCollector(CollectorOptions options, OnZeKernelFinishCallback acallback,
446-
OnZeApiCallsFinishCallback fcallback, void* callback_data)
437+
OnZeApiCallsFinishCallback fcallback, void* callback_data,
438+
const std::vector<ze_driver_handle_t>& drv_list)
447439
: options_(options),
448440
acallback_(acallback),
449441
fcallback_(fcallback),
450442
callback_data_(callback_data),
451443
event_cache_(ZE_EVENT_POOL_FLAG_KERNEL_TIMESTAMP),
452444
swap_event_pool_(512),
453445
startstop_mode_changer(this) {
454-
CreateDeviceMap();
446+
CreateDeviceMap(drv_list);
455447
UpdateDeviceSyncDelta();
456448
ze_result_t res = l0_wrapper_.InitDynamicTracingWrappers();
457449
if (ZE_RESULT_SUCCESS == res) {
@@ -513,6 +505,10 @@ class ZeCollector {
513505
void CreateDeviceMap() {
514506
SPDLOG_DEBUG("In {}", __FUNCTION__);
515507
const auto drivers = utils::ze::GetDriverList();
508+
CreateDeviceMap(drivers);
509+
}
510+
511+
void CreateDeviceMap(const std::vector<ze_driver_handle_t>& drivers) {
516512
for (auto* const driver : drivers) {
517513
const auto devices = utils::ze::GetDeviceList(driver);
518514
for (auto* const device : devices) {

sdk/src/levelzero/ze_driver_init.cc

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
//==============================================================
2+
// Copyright (C) Intel Corporation
3+
//
4+
// SPDX-License-Identifier: MIT
5+
// =============================================================
6+
7+
#include "ze_driver_init.h"
8+
9+
#include <level_zero/loader/ze_loader.h>
10+
#include <level_zero/ze_api.h>
11+
#include <spdlog/spdlog.h>
12+
13+
#include "lz_api_tracing_api_loader.h"
14+
#include "overhead_kinds.h"
15+
#include "pti_assert.h"
16+
#include "ze_utils.h"
17+
18+
namespace {
19+
// The Level Zero Loader version with a fully functional zeInitDrivers.
20+
// Versions prior to this one have bugs (or don't have it at all).
21+
// zeInitDrivers is the preferred method for initializing drivers from this point on.
22+
constexpr zel_version_t kProperLoaderVersionForZeInitDrivers = {1, 19, 2};
23+
24+
inline bool operator>=(const zel_version_t& left, const zel_version_t& right) {
25+
bool same_major_version = left.major == right.major;
26+
return (same_major_version && left.minor > right.minor) ||
27+
(same_major_version && left.minor == right.minor && left.patch >= right.patch) ||
28+
(left.major > right.major);
29+
}
30+
31+
ze_result_t ZeInitDrivers(uint32_t* driver_count, ze_driver_handle_t* drivers,
32+
ze_init_driver_type_desc_t* desc) {
33+
if (pti::PtiLzTracerLoader::Instance().zeInitDrivers_) {
34+
return pti::PtiLzTracerLoader::Instance().zeInitDrivers_(driver_count, drivers, desc);
35+
}
36+
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
37+
}
38+
39+
bool ProperLoaderforZeInitDrivers() {
40+
auto loader_version = utils::ze::GetLoaderVersion();
41+
if (!loader_version) {
42+
return false;
43+
}
44+
SPDLOG_DEBUG("Loader version: {}.{}.{}.", loader_version->major, loader_version->minor,
45+
loader_version->patch);
46+
return *loader_version >= kProperLoaderVersionForZeInitDrivers;
47+
}
48+
49+
void CheckLegacyDriverVersion(const std::vector<ze_driver_handle_t>& drivers) {
50+
auto version = utils::ze::GetVersion(drivers);
51+
SPDLOG_INFO("Driver version major: {}, minor: {}", ZE_MAJOR_VERSION(version),
52+
ZE_MINOR_VERSION(version));
53+
PTI_ASSERT(ZE_MAJOR_VERSION(version) > 1 ||
54+
ZE_MAJOR_VERSION(version) == 1 && ZE_MINOR_VERSION(version) >= 3);
55+
}
56+
57+
bool InitLegacyDrivers() {
58+
overhead::Init();
59+
ze_result_t status = zeInit(ZE_INIT_FLAG_GPU_ONLY);
60+
overhead_fini(zeInit_id);
61+
bool result = (status == ZE_RESULT_SUCCESS);
62+
if (!result) {
63+
SPDLOG_WARN("zeInit returned: {}.", static_cast<uint32_t>(status));
64+
return false;
65+
}
66+
return result;
67+
}
68+
} // namespace
69+
70+
ZeDriverInit::ZeDriverInit() : init_success_(InitLegacyDrivers()) {
71+
CollectLegacyDrivers();
72+
CheckLegacyDriverVersion(drivers_);
73+
if (ProperLoaderforZeInitDrivers()) {
74+
// If legacy driver initialization failed, the current way. Don't immediately fail.
75+
if (InitDrivers()) {
76+
init_success_ = true;
77+
}
78+
}
79+
}
80+
81+
bool ZeDriverInit::Success() const { return init_success_; }
82+
83+
const std::vector<ze_driver_handle_t>& ZeDriverInit::Drivers() const { return drivers_; }
84+
85+
std::vector<ze_driver_handle_t>& ZeDriverInit::Drivers() { return drivers_; }
86+
87+
bool ZeDriverInit::InitDrivers() {
88+
std::uint32_t drv_cnt = 0;
89+
ze_init_driver_type_desc_t desc{};
90+
desc.stype = ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC;
91+
desc.flags = ZE_INIT_DRIVER_TYPE_FLAG_GPU;
92+
desc.pNext = nullptr;
93+
overhead::Init();
94+
auto status = ZeInitDrivers(&drv_cnt, nullptr, &desc);
95+
overhead_fini(zeInitDrivers_id);
96+
97+
bool result = (status == ZE_RESULT_SUCCESS);
98+
99+
if (!result) {
100+
SPDLOG_INFO("ZeInitDrivers returned: {}.", static_cast<uint32_t>(status));
101+
return result;
102+
}
103+
104+
std::vector<ze_driver_handle_t> driver_list(static_cast<size_t>(drv_cnt));
105+
106+
overhead::Init();
107+
status = ZeInitDrivers(&drv_cnt, driver_list.data(), &desc);
108+
overhead_fini(zeInitDrivers_id);
109+
result = (status == ZE_RESULT_SUCCESS);
110+
111+
if (!result) {
112+
SPDLOG_INFO("ZeInitDrivers returned: {}.", static_cast<uint32_t>(status));
113+
return result;
114+
}
115+
116+
for (auto* driver : driver_list) {
117+
drivers_.push_back(driver);
118+
}
119+
120+
return result;
121+
}
122+
123+
void ZeDriverInit::CollectLegacyDrivers() { drivers_ = utils::ze::GetDriverList(); }

sdk/src/levelzero/ze_driver_init.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//==============================================================
2+
// Copyright (C) Intel Corporation
3+
//
4+
// SPDX-License-Identifier: MIT
5+
// =============================================================
6+
7+
#ifndef LEVEL_ZERO_ZE_DRIVER_INIT_H_
8+
#define LEVEL_ZERO_ZE_DRIVER_INIT_H_
9+
10+
#include <level_zero/ze_api.h>
11+
12+
#include <vector>
13+
14+
class ZeDriverInit {
15+
public:
16+
ZeDriverInit();
17+
18+
bool Success() const;
19+
20+
const std::vector<ze_driver_handle_t>& Drivers() const;
21+
22+
std::vector<ze_driver_handle_t>& Drivers();
23+
24+
private:
25+
bool InitDrivers();
26+
void CollectLegacyDrivers();
27+
28+
bool init_success_ = false;
29+
std::vector<ze_driver_handle_t> drivers_;
30+
};
31+
32+
#endif // LEVEL_ZERO_ZE_DRIVER_INIT_H_

sdk/src/lz_api_tracing_api_loader.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
#ifndef SRC_LZ_API_TRACING_API_LOADER_H_
77
#define SRC_LZ_API_TRACING_API_LOADER_H_
88

9+
#include <level_zero/layers/zel_tracing_api.h>
10+
#include <level_zero/layers/zel_tracing_register_cb.h>
11+
#include <level_zero/ze_api.h>
12+
#include <level_zero/zet_api.h>
913
#include <spdlog/cfg/env.h>
1014
#include <spdlog/sinks/stdout_color_sinks.h>
1115
#include <spdlog/spdlog.h>
@@ -35,6 +39,8 @@ class PtiLzTracerLoader {
3539

3640
bool ViewAvailable() const { return api_dlsyms_lib_ != nullptr; }
3741

42+
decltype(&zeInitDrivers) zeInitDrivers_ = nullptr; // NOLINT
43+
3844
// Forward to implementation in core library
3945
#include <tracing_api_dlsym_public.gen> // Auto-generated callbacks
4046

@@ -50,6 +56,7 @@ class PtiLzTracerLoader {
5056
#define LEVEL_ZERO_LOADER_GET_SYMBOL(X) \
5157
X##_ = api_dlsyms_lib_->GetSymbol<decltype(&X)>(#X) // NOLINT
5258
#include <tracing_api_dlsym_private.gen> // Auto-generated callbacks
59+
LEVEL_ZERO_LOADER_GET_SYMBOL(zeInitDrivers);
5360
#undef LEVEL_ZERO_LOADER_GET_SYMBOL
5461
}
5562
std::unique_ptr<LibraryLoader> api_dlsyms_lib_ = nullptr;

sdk/src/overhead_kinds.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* ocallback.
1515
*/
1616
#include <pti/pti_driver_levelzero_api_ids.h>
17-
//#include <pti/pti_driver_opencl_api_ids.h>
17+
// #include <pti/pti_driver_opencl_api_ids.h>
1818

1919
#include "unikernel.h"
2020
#include "utils.h"

sdk/src/utils/ze_utils.h

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
#ifndef PTI_UTILS_ZE_UTILS_H_
88
#define PTI_UTILS_ZE_UTILS_H_
99

10+
#include <level_zero/loader/ze_loader.h>
1011
#include <level_zero/ze_api.h>
1112
#include <level_zero/zet_api.h>
1213
#include <pti/pti_driver_levelzero_api_ids.h>
1314

15+
#include <array>
1416
#include <iomanip>
17+
#include <optional>
1518
#include <sstream>
1619
#include <string>
1720
#include <vector>
@@ -475,14 +478,44 @@ inline bool GetDeviceUUID(ze_device_handle_t device, uint8_t* uuid, bool measure
475478
return true;
476479
}
477480

478-
inline ze_api_version_t GetVersion() {
479-
auto driver_list = GetDriverList();
481+
inline ze_api_version_t GetVersion(const std::vector<ze_driver_handle_t>& driver_list) {
480482
if (driver_list.empty()) {
481483
return ZE_API_VERSION_FORCE_UINT32;
482484
}
483485
return GetDriverVersion(driver_list.front());
484486
}
485487

488+
inline ze_api_version_t GetVersion() {
489+
auto driver_list = GetDriverList();
490+
return GetVersion(driver_list);
491+
}
492+
493+
inline std::optional<zel_version_t> GetLoaderVersion() {
494+
constexpr auto* kLoaderComponentName = "loader";
495+
constexpr auto kLoaderComponentNameLength = std::char_traits<char>::length(kLoaderComponentName);
496+
size_t number_of_components = 0;
497+
auto status = zelLoaderGetVersions(&number_of_components, nullptr);
498+
if (number_of_components == 0 || status != ZE_RESULT_SUCCESS) {
499+
return std::nullopt;
500+
}
501+
502+
std::vector<zel_component_version_t> versions(number_of_components);
503+
504+
status = zelLoaderGetVersions(&number_of_components, versions.data());
505+
if (status != ZE_RESULT_SUCCESS) {
506+
return std::nullopt;
507+
}
508+
509+
for (const auto& component_version : versions) {
510+
if (!std::strncmp(component_version.component_name, kLoaderComponentName,
511+
kLoaderComponentNameLength)) {
512+
return component_version.component_lib_version;
513+
}
514+
}
515+
516+
return std::nullopt;
517+
}
518+
486519
} // namespace ze
487520
} // namespace utils
488521

sdk/test/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,8 @@ target_include_directories(
406406
target_link_libraries(view_record_test PUBLIC spdlog::spdlog Pti::pti_view GTest::gtest_main
407407
spdlog::spdlog)
408408

409-
add_executable(assert_exception_test assert_exception_test.cc)
409+
add_executable(assert_exception_test assert_exception_test.cc
410+
"${PROJECT_SOURCE_DIR}/src/levelzero/ze_driver_init.cc")
410411

411412
target_include_directories(
412413
assert_exception_test

0 commit comments

Comments
 (0)