diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index 3bc9389308..46c7e801e0 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -682,6 +682,23 @@ ze_result_t KernelImp::getProperties(ze_kernel_properties_t *pKernelProperties) uint32_t maxKernelWorkGroupSize = static_cast(this->module->getDevice()->getNEODevice()->getDeviceInfo().maxWorkGroupSize); pKernelProperties->maxNumSubgroups = maxKernelWorkGroupSize / kernelDescriptor.kernelAttributes.simdSize; + void *pNext = pKernelProperties->pNext; + while (pNext) { + ze_base_desc_t *extendedProperties = reinterpret_cast(pKernelProperties->pNext); + if (extendedProperties->stype == ZE_STRUCTURE_TYPE_KERNEL_PREFERRED_GROUP_SIZE_PROPERTIES) { + ze_kernel_preferred_group_size_properties_t *preferredGroupSizeProperties = + reinterpret_cast(extendedProperties); + + preferredGroupSizeProperties->preferredMultiple = this->kernelImmData->getKernelInfo()->getMaxSimdSize(); + + auto &hwHelper = NEO::HwHelper::get(this->module->getDevice()->getHwInfo().platform.eRenderCoreFamily); + if (hwHelper.isFusedEuDispatchEnabled(this->module->getDevice()->getHwInfo())) { + preferredGroupSizeProperties->preferredMultiple *= 2; + } + } + pNext = const_cast(extendedProperties->pNext); + } + return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index 2a913c09c7..782773ff81 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -757,6 +757,44 @@ HWTEST_F(KernelPropertiesTests, givenValidKernelThenPropertiesAreRetrieved) { sizeof(kernelProperties.uuid.mid))); } +HWTEST_F(KernelPropertiesTests, whenPassingPreferredGroupSizeStructToGetPropertiesThenPreferredMultipleIsReturned) { + ze_kernel_properties_t kernelProperties = {}; + kernelProperties.stype = ZE_STRUCTURE_TYPE_KERNEL_PROPERTIES; + + ze_kernel_preferred_group_size_properties_t preferredGroupProperties = {}; + preferredGroupProperties.stype = ZE_STRUCTURE_TYPE_KERNEL_PREFERRED_GROUP_SIZE_PROPERTIES; + + kernelProperties.pNext = &preferredGroupProperties; + + ze_result_t res = kernel->getProperties(&kernelProperties); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + auto &hwHelper = NEO::HwHelper::get(module->getDevice()->getHwInfo().platform.eRenderCoreFamily); + if (hwHelper.isFusedEuDispatchEnabled(module->getDevice()->getHwInfo())) { + EXPECT_EQ(preferredGroupProperties.preferredMultiple, static_cast(kernel->getImmutableData()->getKernelInfo()->getMaxSimdSize()) * 2); + } else { + EXPECT_EQ(preferredGroupProperties.preferredMultiple, static_cast(kernel->getImmutableData()->getKernelInfo()->getMaxSimdSize())); + } +} + +HWTEST_F(KernelPropertiesTests, whenPassingPreferredGroupSizeStructWithWrongStypeSuccessIsReturnedAndNoFieldsInPreferredGroupSizeStructAreSet) { + ze_kernel_properties_t kernelProperties = {}; + kernelProperties.stype = ZE_STRUCTURE_TYPE_KERNEL_PROPERTIES; + + ze_kernel_preferred_group_size_properties_t preferredGroupProperties = {}; + preferredGroupProperties.stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32; + + kernelProperties.pNext = &preferredGroupProperties; + + uint32_t dummyPreferredMultiple = 101; + preferredGroupProperties.preferredMultiple = dummyPreferredMultiple; + + ze_result_t res = kernel->getProperties(&kernelProperties); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + EXPECT_EQ(preferredGroupProperties.preferredMultiple, dummyPreferredMultiple); +} + HWTEST_F(KernelPropertiesTests, givenValidKernelThenProfilePropertiesAreRetrieved) { zet_profile_properties_t kernelProfileProperties = {};