Skip to content

Commit 529e8b9

Browse files
authored
Merge pull request intel#1816 from nrspruit/l0_intel_driver_version
[L0] Use Intel Level Zero Driver String extension
2 parents 6b33a1b + 5dc794c commit 529e8b9

File tree

5 files changed

+73
-15
lines changed

5 files changed

+73
-15
lines changed

source/adapters/level_zero/adapter.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ ur_result_t initPlatforms(PlatformVec &platforms) noexcept try {
4949
for (uint32_t I = 0; I < ZeDriverCount; ++I) {
5050
auto platform = std::make_unique<ur_platform_handle_t_>(ZeDrivers[I]);
5151
UR_CALL(platform->initialize());
52-
ZE2UR_CALL(zelLoaderTranslateHandle,
53-
(ZEL_HANDLE_DRIVER, platform->ZeDriver,
54-
(void **)&platform->ZeDriverHandleExpTranslated));
5552

5653
// Save a copy in the cache for future uses.
5754
platforms.push_back(std::move(platform));

source/adapters/level_zero/common.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,22 @@ const bool ExposeCSliceInAffinityPartitioning = [] {
447447
const std::pair<int, int>
448448
getRangeOfAllowedCopyEngines(const ur_device_handle_t &Device);
449449

450+
class ZeDriverVersionStringExtension {
451+
// Pointer to function for Intel Driver Version String
452+
ze_result_t (*zeIntelGetDriverVersionStringPointer)(
453+
ze_driver_handle_t hDriver, char *, size_t *) = nullptr;
454+
455+
public:
456+
// Whether platform supports Intel Driver Version String.
457+
bool Supported;
458+
459+
ZeDriverVersionStringExtension() : Supported{false} {}
460+
461+
void setZeDriverVersionString(ur_platform_handle_t_ *Platform);
462+
void getDriverVersionString(ze_driver_handle_t DriverHandle,
463+
char *pDriverVersion, size_t *pVersionSize);
464+
};
465+
450466
class ZeUSMImportExtension {
451467
// Pointers to functions that import/release host memory into USM
452468
ze_result_t (*zexDriverImportExternalPointer)(ze_driver_handle_t hDriver,

source/adapters/level_zero/device.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,6 +1305,32 @@ ur_result_t urDeviceRelease(ur_device_handle_t Device) {
13051305
return UR_RESULT_SUCCESS;
13061306
}
13071307

1308+
void ZeDriverVersionStringExtension::setZeDriverVersionString(
1309+
ur_platform_handle_t_ *Platform) {
1310+
// Check if Intel Driver Version String is available. If yes, save the API
1311+
// pointer. The pointer will be used when reading the Driver Version for
1312+
// users.
1313+
ze_driver_handle_t DriverHandle = Platform->ZeDriver;
1314+
if (auto extension = Platform->zeDriverExtensionMap.find(
1315+
"ZE_intel_get_driver_version_string");
1316+
extension != Platform->zeDriverExtensionMap.end()) {
1317+
if (ZE_CALL_NOCHECK(zeDriverGetExtensionFunctionAddress,
1318+
(DriverHandle, "zeIntelGetDriverVersionString",
1319+
reinterpret_cast<void **>(
1320+
&zeIntelGetDriverVersionStringPointer))) == 0) {
1321+
// Intel Driver Version String is Supported by this Driver.
1322+
Supported = true;
1323+
}
1324+
}
1325+
}
1326+
1327+
void ZeDriverVersionStringExtension::getDriverVersionString(
1328+
ze_driver_handle_t DriverHandle, char *pDriverVersion,
1329+
size_t *pVersionSize) {
1330+
ZE_CALL_NOCHECK(zeIntelGetDriverVersionStringPointer,
1331+
(DriverHandle, pDriverVersion, pVersionSize));
1332+
}
1333+
13081334
void ZeUSMImportExtension::setZeUSMImport(ur_platform_handle_t_ *Platform) {
13091335
// Check if USM hostptr import feature is available. If yes, save the API
13101336
// pointers. The pointers will be used for both import/release of SYCL buffer

source/adapters/level_zero/platform.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,6 @@ UR_APIEXPORT ur_result_t UR_APICALL urPlatformCreateWithNativeHandle(
159159
}
160160

161161
ur_result_t ur_platform_handle_t_::initialize() {
162-
// Cache driver properties
163-
ZeStruct<ze_driver_properties_t> ZeDriverProperties;
164-
ZE2UR_CALL(zeDriverGetProperties, (ZeDriver, &ZeDriverProperties));
165-
uint32_t DriverVersion = ZeDriverProperties.driverVersion;
166-
// Intel Level-Zero GPU driver stores version as:
167-
// | 31 - 24 | 23 - 16 | 15 - 0 |
168-
// | Major | Minor | Build |
169-
auto VersionMajor = std::to_string((DriverVersion & 0xFF000000) >> 24);
170-
auto VersionMinor = std::to_string((DriverVersion & 0x00FF0000) >> 16);
171-
auto VersionBuild = std::to_string(DriverVersion & 0x0000FFFF);
172-
ZeDriverVersion = VersionMajor + "." + VersionMinor + "." + VersionBuild;
173-
174162
ZE2UR_CALL(zeDriverGetApiVersion, (ZeDriver, &ZeApiVersion));
175163
ZeDriverApiVersion = std::to_string(ZE_MAJOR_VERSION(ZeApiVersion)) + "." +
176164
std::to_string(ZE_MINOR_VERSION(ZeApiVersion));
@@ -211,6 +199,33 @@ ur_result_t ur_platform_handle_t_::initialize() {
211199
zeDriverExtensionMap[extension.name] = extension.version;
212200
}
213201

202+
ZE2UR_CALL(zelLoaderTranslateHandle, (ZEL_HANDLE_DRIVER, ZeDriver,
203+
(void **)&ZeDriverHandleExpTranslated));
204+
205+
// Check if intel Driver Version Extension is supported.
206+
ZeDriverVersionString.setZeDriverVersionString(this);
207+
// Cache driver properties
208+
ZeStruct<ze_driver_properties_t> ZeDriverProperties;
209+
ZE2UR_CALL(zeDriverGetProperties, (ZeDriver, &ZeDriverProperties));
210+
if (!ZeDriverVersionString.Supported) {
211+
uint32_t DriverVersion = ZeDriverProperties.driverVersion;
212+
// Intel Level-Zero GPU driver stores version as:
213+
// | 31 - 24 | 23 - 16 | 15 - 0 |
214+
// | Major | Minor | Build |
215+
auto VersionMajor = std::to_string((DriverVersion & 0xFF000000) >> 24);
216+
auto VersionMinor = std::to_string((DriverVersion & 0x00FF0000) >> 16);
217+
auto VersionBuild = std::to_string(DriverVersion & 0x0000FFFF);
218+
ZeDriverVersion = VersionMajor + "." + VersionMinor + "." + VersionBuild;
219+
} else {
220+
size_t sizeOfDriverString = 0;
221+
ZeDriverVersionString.getDriverVersionString(ZeDriverHandleExpTranslated,
222+
nullptr, &sizeOfDriverString);
223+
ZeDriverVersion.resize(sizeOfDriverString);
224+
ZeDriverVersionString.getDriverVersionString(ZeDriverHandleExpTranslated,
225+
ZeDriverVersion.data(),
226+
&sizeOfDriverString);
227+
}
228+
214229
// Check if import user ptr into USM feature has been requested.
215230
// If yes, then set up L0 API pointers if the platform supports it.
216231
ZeUSMImport.setZeUSMImport(this);

source/adapters/level_zero/platform.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ struct ur_platform_handle_t_ : public _ur_platform {
2828
// internal driver handle to allow calls to driver experimental apis.
2929
ze_driver_handle_t ZeDriverHandleExpTranslated;
3030

31+
// Helper wrapper for working with Driver Version String extension in Level
32+
// Zero.
33+
ZeDriverVersionStringExtension ZeDriverVersionString;
34+
3135
// Cache versions info from zeDriverGetProperties.
3236
std::string ZeDriverVersion;
3337
std::string ZeDriverApiVersion;

0 commit comments

Comments
 (0)