Pass HwInfo to computeSlmValues function

Resolves: NEO-5215, NEO-5216

Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski
2020-12-04 11:57:11 +00:00
committed by Compute-Runtime-Automation
parent 0609a0915e
commit edbda8e8b2
7 changed files with 53 additions and 45 deletions

View File

@ -161,6 +161,7 @@ size_t HardwareCommandsHelper<GfxFamily>::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<GfxFamily>::sendInterfaceDescriptorData(
EncodeDispatchKernel<GfxFamily>::adjustBindingTablePrefetch(interfaceDescriptor, numSamplers, bindingTablePrefetchSize);
auto programmableIDSLMSize =
static_cast<typename INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE>(HwHelperHw<GfxFamily>::get().computeSlmValues(kernel.slmTotalSize));
static_cast<SHARED_LOCAL_MEMORY_SIZE>(HwHelperHw<GfxFamily>::get().computeSlmValues(hardwareInfo, kernel.slmTotalSize));
interfaceDescriptor.setSharedLocalMemorySize(programmableIDSLMSize);
EncodeDispatchKernel<GfxFamily>::programBarrierEnable(interfaceDescriptor,

View File

@ -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<FamilyType>::get().computeSlmValues(0));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(1));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(1024));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(1025));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(2048));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(2049));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(4096));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(4097));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(8192));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(8193));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(12288));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(16384));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(16385));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(24576));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(32768));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(32769));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(49152));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(65535));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(65536));
EXPECT_EQ(0u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 0));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1024));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1025));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 2048));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 2049));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 4096));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 4097));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 8192));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 8193));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 12288));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 16384));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 16385));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 24576));
EXPECT_EQ(8u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 32768));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 32769));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 49152));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 65535));
EXPECT_EQ(16u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 65536));
} else {
EXPECT_EQ(0u, HwHelperHw<FamilyType>::get().computeSlmValues(0));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(1));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(1024));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(1025));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(2048));
EXPECT_EQ(3u, HwHelperHw<FamilyType>::get().computeSlmValues(2049));
EXPECT_EQ(3u, HwHelperHw<FamilyType>::get().computeSlmValues(4096));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(4097));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(8192));
EXPECT_EQ(5u, HwHelperHw<FamilyType>::get().computeSlmValues(8193));
EXPECT_EQ(5u, HwHelperHw<FamilyType>::get().computeSlmValues(16384));
EXPECT_EQ(6u, HwHelperHw<FamilyType>::get().computeSlmValues(16385));
EXPECT_EQ(6u, HwHelperHw<FamilyType>::get().computeSlmValues(32768));
EXPECT_EQ(7u, HwHelperHw<FamilyType>::get().computeSlmValues(32769));
EXPECT_EQ(7u, HwHelperHw<FamilyType>::get().computeSlmValues(65536));
EXPECT_EQ(0u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 0));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1));
EXPECT_EQ(1u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1024));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 1025));
EXPECT_EQ(2u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 2048));
EXPECT_EQ(3u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 2049));
EXPECT_EQ(3u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 4096));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 4097));
EXPECT_EQ(4u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 8192));
EXPECT_EQ(5u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 8193));
EXPECT_EQ(5u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 16384));
EXPECT_EQ(6u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 16385));
EXPECT_EQ(6u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 32768));
EXPECT_EQ(7u, HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 32769));
EXPECT_EQ(7u, HwHelperHw<FamilyType>::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<SHARED_LOCAL_MEMORY_SIZE>(HwHelperHw<FamilyType>::get().computeSlmValues(hwInfo, 0));
EXPECT_EQ(SHARED_LOCAL_MEMORY_SIZE::SHARED_LOCAL_MEMORY_SIZE_ENCODES_0K, receivedSlmSize);
}

View File

@ -72,11 +72,8 @@ void EncodeDispatchKernel<Family>::encode(CommandContainer &container,
kernelDescriptor.kernelAttributes.hasBarriers,
hwInfo);
auto slmSize = static_cast<typename INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE>(
HwHelperHw<Family>::get().computeSlmValues(dispatchInterface->getSlmTotalSize()));
idd.setSharedLocalMemorySize(
dispatchInterface->getSlmTotalSize() > 0
? slmSize
: INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE_ENCODES_0K);
HwHelperHw<Family>::get().computeSlmValues(hwInfo, dispatchInterface->getSlmTotalSize()));
idd.setSharedLocalMemorySize(slmSize);
uint32_t bindingTableStateCount = kernelDescriptor.payloadMappings.bindingTable.numEntries;
uint32_t bindingTablePointer = 0u;

View File

@ -28,7 +28,7 @@ uint32_t HwHelperHw<Family>::alignSlmSize(uint32_t slmSize) {
}
template <>
uint32_t HwHelperHw<Family>::computeSlmValues(uint32_t slmSize) {
uint32_t HwHelperHw<Family>::computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) {
slmSize += (4 * KB - 1);
slmSize = slmSize >> 12;
slmSize = std::min(slmSize, 15u);

View File

@ -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();

View File

@ -326,7 +326,7 @@ uint32_t HwHelperHw<GfxFamily>::alignSlmSize(uint32_t slmSize) {
}
template <typename GfxFamily>
uint32_t HwHelperHw<GfxFamily>::computeSlmValues(uint32_t slmSize) {
uint32_t HwHelperHw<GfxFamily>::computeSlmValues(const HardwareInfo &hwInfo, uint32_t slmSize) {
auto value = std::max(slmSize, 1024u);
value = Math::nextPowerOfTwo(value);
value = Math::getMinLsbSet(value);

View File

@ -251,7 +251,7 @@ HWCMDTEST_F(IGFX_GEN8_CORE, CommandEncodeStatesTest, givenSlmTotalSizeGraterThan
auto interfaceDescriptorData = static_cast<INTERFACE_DESCRIPTOR_DATA *>(cmdContainer->getIddBlock());
uint32_t expectedValue = static_cast<typename INTERFACE_DESCRIPTOR_DATA::SHARED_LOCAL_MEMORY_SIZE>(
HwHelperHw<FamilyType>::get().computeSlmValues(slmTotalSize));
HwHelperHw<FamilyType>::get().computeSlmValues(pDevice->getHardwareInfo(), slmTotalSize));
EXPECT_EQ(expectedValue, interfaceDescriptorData->getSharedLocalMemorySize());
}