From 24c18beada3d5154fb9cd117fbe93574035636be Mon Sep 17 00:00:00 2001 From: Jaime Arteaga Date: Mon, 31 Jan 2022 03:04:54 +0000 Subject: [PATCH] Add ze_eu_count_t to get total number of EUs Related-To: LOCI-2667 Signed-off-by: Jaime Arteaga --- level_zero/core/source/device/device_imp.cpp | 13 +++++ .../test/black_box_tests/zello_world_gpu.cpp | 2 +- .../unit_tests/sources/device/test_device.cpp | 49 +++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index 457128e1b4..d8809437e2 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -562,6 +562,19 @@ ze_result_t DeviceImp::getProperties(ze_device_properties_t *pDeviceProperties) std::string name = getNEODevice()->getDeviceInfo().name; memcpy_s(pDeviceProperties->name, name.length(), name.c_str(), name.length()); + if (pDeviceProperties->pNext) { + ze_base_desc_t *extendedDesc = reinterpret_cast(pDeviceProperties->pNext); + if (extendedDesc->stype == ZE_STRUCTURE_TYPE_EU_COUNT_EXT) { + ze_eu_count_ext_t *ze_eu_count_desc = reinterpret_cast(extendedDesc); + uint32_t numTotalEUs = hardwareInfo.gtSystemInfo.MaxEuPerSubSlice * hardwareInfo.gtSystemInfo.SubSliceCount * hardwareInfo.gtSystemInfo.SliceCount; + + if (isImplicitScalingCapable()) { + numTotalEUs *= neoDevice->getNumGenericSubDevices(); + } + ze_eu_count_desc->numTotalEUs = numTotalEUs; + } + } + return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/test/black_box_tests/zello_world_gpu.cpp b/level_zero/core/test/black_box_tests/zello_world_gpu.cpp index c614556100..61900b9eaa 100644 --- a/level_zero/core/test/black_box_tests/zello_world_gpu.cpp +++ b/level_zero/core/test/black_box_tests/zello_world_gpu.cpp @@ -149,7 +149,7 @@ int main(int argc, char *argv[]) { SUCCESS_OR_TERMINATE(zeContextDestroy(context)); - std::cout << "\nZello World Results validation " << (outputValidationSuccessful ? "PASSED" : "FAILED") << "\n"; + std::cout << "\nZello World GPU Results validation " << (outputValidationSuccessful ? "PASSED" : "FAILED") << "\n"; return 0; } diff --git a/level_zero/core/test/unit_tests/sources/device/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_device.cpp index 5cecc57fab..4a6084ec4f 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_device.cpp @@ -966,6 +966,34 @@ TEST_F(DeviceTest, givenDevicePropertiesStructureWhenDevicePropertiesCalledThenA EXPECT_NE(deviceProperties.maxMemAllocSize, devicePropertiesBefore.maxMemAllocSize); } +TEST_F(DeviceTest, WhenRequestingZeEuCountThenExpectedEUsAreReturned) { + ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; + ze_eu_count_ext_t ze_eu_count_desc = {ZE_STRUCTURE_TYPE_EU_COUNT_EXT}; + deviceProperties.pNext = &ze_eu_count_desc; + + uint32_t maxEuPerSubSlice = 48; + uint32_t subSliceCount = 8; + uint32_t sliceCount = 1; + + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.MaxEuPerSubSlice = maxEuPerSubSlice; + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.SubSliceCount = subSliceCount; + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.SliceCount = sliceCount; + + device->getProperties(&deviceProperties); + + uint32_t expectedEUs = maxEuPerSubSlice * subSliceCount * sliceCount; + + EXPECT_EQ(expectedEUs, ze_eu_count_desc.numTotalEUs); +} + +TEST_F(DeviceTest, WhenRequestingZeEuCountWithIncorrectStypeThenPNextIsIgnored) { + ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; + ze_eu_count_ext_t ze_eu_count_desc = {ZE_STRUCTURE_TYPE_SCHEDULING_HINT_EXP_PROPERTIES}; + deviceProperties.pNext = &ze_eu_count_desc; + device->getProperties(&deviceProperties); + EXPECT_EQ(0u, ze_eu_count_desc.numTotalEUs); +} + TEST_F(DeviceTest, WhenGettingDevicePropertiesThenSubslicesPerSliceIsBasedOnSubslicesSupported) { ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; deviceProperties.type = ZE_DEVICE_TYPE_GPU; @@ -1640,6 +1668,27 @@ TEST_F(MultipleDevicesDisabledImplicitScalingTest, whenCallingGetMemoryPropertie EXPECT_EQ(memProperties.totalSize, device0->getNEODevice()->getDeviceInfo().globalMemSize / numSubDevices); } +TEST_F(MultipleDevicesEnabledImplicitScalingTest, WhenRequestingZeEuCountThenExpectedEUsAreReturned) { + ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; + ze_eu_count_ext_t ze_eu_count_desc = {ZE_STRUCTURE_TYPE_EU_COUNT_EXT}; + deviceProperties.pNext = &ze_eu_count_desc; + + uint32_t maxEuPerSubSlice = 48; + uint32_t subSliceCount = 8; + uint32_t sliceCount = 1; + + L0::Device *device = driverHandle->devices[0]; + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.MaxEuPerSubSlice = maxEuPerSubSlice; + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.SubSliceCount = subSliceCount; + device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->gtSystemInfo.SliceCount = sliceCount; + + device->getProperties(&deviceProperties); + + uint32_t expectedEUs = maxEuPerSubSlice * subSliceCount * sliceCount; + + EXPECT_EQ(expectedEUs * numSubDevices, ze_eu_count_desc.numTotalEUs); +} + TEST_F(MultipleDevicesEnabledImplicitScalingTest, whenCallingGetMemoryPropertiesWithSubDevicesThenCorrectSizeReturned) { L0::Device *device0 = driverHandle->devices[0]; uint32_t count = 1;