diff --git a/opencl/source/helpers/hardware_commands_helper_base.inl b/opencl/source/helpers/hardware_commands_helper_base.inl index 3fbcb7a43c..7d0f7b1620 100644 --- a/opencl/source/helpers/hardware_commands_helper_base.inl +++ b/opencl/source/helpers/hardware_commands_helper_base.inl @@ -161,6 +161,7 @@ size_t HardwareCommandsHelper::sendInterfaceDescriptorData( INTERFACE_DESCRIPTOR_DATA *inlineInterfaceDescriptor, const HardwareInfo &hardwareInfo) { using SAMPLER_STATE = typename GfxFamily::SAMPLER_STATE; + using SHARED_LOCAL_MEMORY_SIZE = typename INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE; // Allocate some memory for the interface descriptor auto pInterfaceDescriptor = getInterfaceDescriptor(indirectHeap, offsetInterfaceDescriptor, inlineInterfaceDescriptor); @@ -185,7 +186,7 @@ size_t HardwareCommandsHelper::sendInterfaceDescriptorData( EncodeDispatchKernel::adjustBindingTablePrefetch(interfaceDescriptor, numSamplers, bindingTablePrefetchSize); auto programmableIDSLMSize = - static_cast(HwHelperHw::get().computeSlmValues(kernel.slmTotalSize)); + static_cast(HwHelperHw::get().computeSlmValues(hardwareInfo, kernel.slmTotalSize)); interfaceDescriptor.setSharedLocalMemorySize(programmableIDSLMSize); EncodeDispatchKernel::programBarrierEnable(interfaceDescriptor, diff --git a/opencl/test/unit_test/helpers/hw_helper_tests.cpp b/opencl/test/unit_test/helpers/hw_helper_tests.cpp index a4e7112a54..c0fd860d1d 100644 --- a/opencl/test/unit_test/helpers/hw_helper_tests.cpp +++ b/opencl/test/unit_test/helpers/hw_helper_tests.cpp @@ -1115,41 +1115,51 @@ HWCMDTEST_F(IGFX_GEN8_CORE, HwHelperTest, GivenVariousValuesWhenAlignSlmSizeIsCa } HWCMDTEST_F(IGFX_GEN8_CORE, HwHelperTest, GivenVariousValuesWhenComputeSlmSizeIsCalledThenCorrectValueIsReturned) { + auto hwInfo = *defaultHwInfo; + if (::renderCoreFamily == IGFX_GEN8_CORE) { - EXPECT_EQ(0u, HwHelperHw::get().computeSlmValues(0)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(1)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(1024)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(1025)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(2048)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(2049)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(4096)); - EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(4097)); - EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(8192)); - EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(8193)); - EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(12288)); - EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(16384)); - EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(16385)); - EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(24576)); - EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(32768)); - EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(32769)); - EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(49152)); - EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(65535)); - EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(65536)); + EXPECT_EQ(0u, HwHelperHw::get().computeSlmValues(hwInfo, 0)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 1)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 1024)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 1025)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 2048)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 2049)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 4096)); + EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(hwInfo, 4097)); + EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(hwInfo, 8192)); + EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(hwInfo, 8193)); + EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(hwInfo, 12288)); + EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(hwInfo, 16384)); + EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(hwInfo, 16385)); + EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(hwInfo, 24576)); + EXPECT_EQ(8u, HwHelperHw::get().computeSlmValues(hwInfo, 32768)); + EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(hwInfo, 32769)); + EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(hwInfo, 49152)); + EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(hwInfo, 65535)); + EXPECT_EQ(16u, HwHelperHw::get().computeSlmValues(hwInfo, 65536)); } else { - EXPECT_EQ(0u, HwHelperHw::get().computeSlmValues(0)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(1)); - EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(1024)); - EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(1025)); - EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(2048)); - EXPECT_EQ(3u, HwHelperHw::get().computeSlmValues(2049)); - EXPECT_EQ(3u, HwHelperHw::get().computeSlmValues(4096)); - EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(4097)); - EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(8192)); - EXPECT_EQ(5u, HwHelperHw::get().computeSlmValues(8193)); - EXPECT_EQ(5u, HwHelperHw::get().computeSlmValues(16384)); - EXPECT_EQ(6u, HwHelperHw::get().computeSlmValues(16385)); - EXPECT_EQ(6u, HwHelperHw::get().computeSlmValues(32768)); - EXPECT_EQ(7u, HwHelperHw::get().computeSlmValues(32769)); - EXPECT_EQ(7u, HwHelperHw::get().computeSlmValues(65536)); + EXPECT_EQ(0u, HwHelperHw::get().computeSlmValues(hwInfo, 0)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 1)); + EXPECT_EQ(1u, HwHelperHw::get().computeSlmValues(hwInfo, 1024)); + EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(hwInfo, 1025)); + EXPECT_EQ(2u, HwHelperHw::get().computeSlmValues(hwInfo, 2048)); + EXPECT_EQ(3u, HwHelperHw::get().computeSlmValues(hwInfo, 2049)); + EXPECT_EQ(3u, HwHelperHw::get().computeSlmValues(hwInfo, 4096)); + EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(hwInfo, 4097)); + EXPECT_EQ(4u, HwHelperHw::get().computeSlmValues(hwInfo, 8192)); + EXPECT_EQ(5u, HwHelperHw::get().computeSlmValues(hwInfo, 8193)); + EXPECT_EQ(5u, HwHelperHw::get().computeSlmValues(hwInfo, 16384)); + EXPECT_EQ(6u, HwHelperHw::get().computeSlmValues(hwInfo, 16385)); + EXPECT_EQ(6u, HwHelperHw::get().computeSlmValues(hwInfo, 32768)); + EXPECT_EQ(7u, HwHelperHw::get().computeSlmValues(hwInfo, 32769)); + EXPECT_EQ(7u, HwHelperHw::get().computeSlmValues(hwInfo, 65536)); } } + +HWTEST_F(HwHelperTest, GivenZeroSlmSizeWhenComputeSlmSizeIsCalledThenCorrectValueIsReturned) { + using SHARED_LOCAL_MEMORY_SIZE = typename FamilyType::INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE; + auto hwInfo = *defaultHwInfo; + + auto receivedSlmSize = static_cast(HwHelperHw::get().computeSlmValues(hwInfo, 0)); + EXPECT_EQ(SHARED_LOCAL_MEMORY_SIZE::SHARED_LOCAL_MEMORY_SIZE_ENCODES_0K, receivedSlmSize); +} diff --git a/shared/source/command_container/command_encoder_bdw_plus.inl b/shared/source/command_container/command_encoder_bdw_plus.inl index 7204da780e..3857115b35 100644 --- a/shared/source/command_container/command_encoder_bdw_plus.inl +++ b/shared/source/command_container/command_encoder_bdw_plus.inl @@ -72,11 +72,8 @@ void EncodeDispatchKernel::encode(CommandContainer &container, kernelDescriptor.kernelAttributes.hasBarriers, hwInfo); auto slmSize = static_cast( - HwHelperHw::get().computeSlmValues(dispatchInterface->getSlmTotalSize())); - idd.setSharedLocalMemorySize( - dispatchInterface->getSlmTotalSize() > 0 - ? slmSize - : INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE_ENCODES_0K); + HwHelperHw::get().computeSlmValues(hwInfo, dispatchInterface->getSlmTotalSize())); + idd.setSharedLocalMemorySize(slmSize); uint32_t bindingTableStateCount = kernelDescriptor.payloadMappings.bindingTable.numEntries; uint32_t bindingTablePointer = 0u; diff --git a/shared/source/gen8/hw_helper_gen8.cpp b/shared/source/gen8/hw_helper_gen8.cpp index 1f89b481fc..aa73c56a9f 100644 --- a/shared/source/gen8/hw_helper_gen8.cpp +++ b/shared/source/gen8/hw_helper_gen8.cpp @@ -28,7 +28,7 @@ uint32_t HwHelperHw::alignSlmSize(uint32_t slmSize) { } template <> -uint32_t HwHelperHw::computeSlmValues(uint32_t slmSize) { +uint32_t HwHelperHw::computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) { slmSize += (4 * KB - 1); slmSize = slmSize >> 12; slmSize = std::min(slmSize, 15u); diff --git a/shared/source/helpers/hw_helper.h b/shared/source/helpers/hw_helper.h index 3cd1dec5ca..f06bf76738 100644 --- a/shared/source/helpers/hw_helper.h +++ b/shared/source/helpers/hw_helper.h @@ -98,7 +98,7 @@ class HwHelper { virtual uint32_t calculateAvailableThreadCount(PRODUCT_FAMILY family, uint32_t grfCount, uint32_t euCount, uint32_t threadsPerEu) = 0; virtual uint32_t alignSlmSize(uint32_t slmSize) = 0; - virtual uint32_t computeSlmValues(uint32_t slmSize) = 0; + virtual uint32_t computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) = 0; virtual bool isForceEmuInt32DivRemSPWARequired(const HardwareInfo &hwInfo) = 0; virtual bool isWaDisableRccRhwoOptimizationRequired() const = 0; @@ -257,7 +257,7 @@ class HwHelperHw : public HwHelper { uint32_t alignSlmSize(uint32_t slmSize) override; - uint32_t computeSlmValues(uint32_t slmSize) override; + uint32_t computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) override; static AuxTranslationMode getAuxTranslationMode(); diff --git a/shared/source/helpers/hw_helper_base.inl b/shared/source/helpers/hw_helper_base.inl index b03448d11e..a94c303a92 100644 --- a/shared/source/helpers/hw_helper_base.inl +++ b/shared/source/helpers/hw_helper_base.inl @@ -326,7 +326,7 @@ uint32_t HwHelperHw::alignSlmSize(uint32_t slmSize) { } template -uint32_t HwHelperHw::computeSlmValues(uint32_t slmSize) { +uint32_t HwHelperHw::computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) { auto value = std::max(slmSize, 1024u); value = Math::nextPowerOfTwo(value); value = Math::getMinLsbSet(value); diff --git a/shared/test/unit_test/encoders/test_encode_dispatch_kernel.cpp b/shared/test/unit_test/encoders/test_encode_dispatch_kernel.cpp index 1b600bf874..d815b0b0cd 100644 --- a/shared/test/unit_test/encoders/test_encode_dispatch_kernel.cpp +++ b/shared/test/unit_test/encoders/test_encode_dispatch_kernel.cpp @@ -251,7 +251,7 @@ HWCMDTEST_F(IGFX_GEN8_CORE, CommandEncodeStatesTest, givenSlmTotalSizeGraterThan auto interfaceDescriptorData = static_cast(cmdContainer->getIddBlock()); uint32_t expectedValue = static_cast( - HwHelperHw::get().computeSlmValues(slmTotalSize)); + HwHelperHw::get().computeSlmValues(pDevice->getHardwareInfo(), slmTotalSize)); EXPECT_EQ(expectedValue, interfaceDescriptorData->getSharedLocalMemorySize()); }