refactor: indirect detection helpers, VC

Allow for different required version for VC compiled kernels.
Define constant for detection disabled.

Related-To: NEO-12491

Signed-off-by: Dominik Dabek <dominik.dabek@intel.com>
This commit is contained in:
Dominik Dabek 2024-09-13 13:52:55 +00:00 committed by Compute-Runtime-Automation
parent f5b88f085a
commit 3bd2befe74
5 changed files with 100 additions and 69 deletions

View File

@ -12,5 +12,6 @@
namespace NEO { namespace NEO {
namespace IndirectDetectionVersions { namespace IndirectDetectionVersions {
constexpr uint32_t requiredDetectIndirectVersionPVC = 3u; constexpr uint32_t requiredDetectIndirectVersionPVC = 3u;
} constexpr uint32_t disabled = std::numeric_limits<uint32_t>::max();
} // namespace IndirectDetectionVersions
} // namespace NEO } // namespace NEO

View File

@ -189,6 +189,7 @@ class ProductHelper {
virtual bool isDummyBlitWaRequired() const = 0; virtual bool isDummyBlitWaRequired() const = 0;
virtual bool isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const = 0; virtual bool isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const = 0;
virtual uint32_t getRequiredDetectIndirectVersion() const = 0; virtual uint32_t getRequiredDetectIndirectVersion() const = 0;
virtual uint32_t getRequiredDetectIndirectVersionVC() const = 0;
virtual bool isLinearStoragePreferred(bool isImage1d, bool forceLinearStorage) const = 0; virtual bool isLinearStoragePreferred(bool isImage1d, bool forceLinearStorage) const = 0;
virtual bool isTranslationExceptionSupported() const = 0; virtual bool isTranslationExceptionSupported() const = 0;
virtual uint32_t getMaxNumSamplers() const = 0; virtual uint32_t getMaxNumSamplers() const = 0;

View File

@ -12,6 +12,7 @@
#include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/helpers/cache_policy.h" #include "shared/source/helpers/cache_policy.h"
#include "shared/source/helpers/constants.h" #include "shared/source/helpers/constants.h"
#include "shared/source/helpers/definitions/indirect_detection_versions.h"
#include "shared/source/helpers/hw_info.h" #include "shared/source/helpers/hw_info.h"
#include "shared/source/helpers/hw_mapper.h" #include "shared/source/helpers/hw_mapper.h"
#include "shared/source/helpers/local_memory_access_modes.h" #include "shared/source/helpers/local_memory_access_modes.h"
@ -71,19 +72,32 @@ bool ProductHelperHw<gfxProduct>::isTlbFlushRequired() const {
template <PRODUCT_FAMILY gfxProduct> template <PRODUCT_FAMILY gfxProduct>
bool ProductHelperHw<gfxProduct>::isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const { bool ProductHelperHw<gfxProduct>::isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const {
if (std::numeric_limits<uint32_t>::max() == getRequiredDetectIndirectVersion()) {
return false;
}
const bool isZebin = kernelDescriptor.kernelAttributes.binaryFormat == DeviceBinaryFormat::zebin;
const bool isCMKernelHeuristic = kernelDescriptor.kernelAttributes.simdSize == 1; const bool isCMKernelHeuristic = kernelDescriptor.kernelAttributes.simdSize == 1;
const bool isZebin = kernelDescriptor.kernelAttributes.binaryFormat == DeviceBinaryFormat::zebin;
const auto currentIndirectDetectionVersion = isPrecompiled ? precompiledKernelIndirectDetectionVersion : INDIRECT_ACCESS_DETECTION_VERSION; const auto currentIndirectDetectionVersion = isPrecompiled ? precompiledKernelIndirectDetectionVersion : INDIRECT_ACCESS_DETECTION_VERSION;
const bool indirectDetectionValid = currentIndirectDetectionVersion >= getRequiredDetectIndirectVersion(); bool indirectDetectionValid = false;
return isZebin && indirectDetectionValid && !isCMKernelHeuristic; if (isCMKernelHeuristic) {
if (IndirectDetectionVersions::disabled == getRequiredDetectIndirectVersionVC()) {
return false;
}
indirectDetectionValid = currentIndirectDetectionVersion >= getRequiredDetectIndirectVersionVC();
} else {
if (IndirectDetectionVersions::disabled == getRequiredDetectIndirectVersion()) {
return false;
}
indirectDetectionValid = currentIndirectDetectionVersion >= getRequiredDetectIndirectVersion();
}
return isZebin && indirectDetectionValid;
} }
template <PRODUCT_FAMILY gfxProduct> template <PRODUCT_FAMILY gfxProduct>
uint32_t ProductHelperHw<gfxProduct>::getRequiredDetectIndirectVersion() const { uint32_t ProductHelperHw<gfxProduct>::getRequiredDetectIndirectVersion() const {
return std::numeric_limits<uint32_t>::max(); return IndirectDetectionVersions::disabled;
}
template <PRODUCT_FAMILY gfxProduct>
uint32_t ProductHelperHw<gfxProduct>::getRequiredDetectIndirectVersionVC() const {
return IndirectDetectionVersions::disabled;
} }
template <PRODUCT_FAMILY gfxProduct> template <PRODUCT_FAMILY gfxProduct>

View File

@ -132,6 +132,7 @@ class ProductHelperHw : public ProductHelper {
bool isDummyBlitWaRequired() const override; bool isDummyBlitWaRequired() const override;
bool isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const override; bool isDetectIndirectAccessInKernelSupported(const KernelDescriptor &kernelDescriptor, const bool isPrecompiled, const uint32_t precompiledKernelIndirectDetectionVersion) const override;
uint32_t getRequiredDetectIndirectVersion() const override; uint32_t getRequiredDetectIndirectVersion() const override;
uint32_t getRequiredDetectIndirectVersionVC() const override;
bool isLinearStoragePreferred(bool isImage1d, bool forceLinearStorage) const override; bool isLinearStoragePreferred(bool isImage1d, bool forceLinearStorage) const override;
bool isTranslationExceptionSupported() const override; bool isTranslationExceptionSupported() const override;
uint32_t getMaxNumSamplers() const override; uint32_t getMaxNumSamplers() const override;

View File

@ -8,6 +8,7 @@
#include "shared/test/unit_test/os_interface/product_helper_tests.h" #include "shared/test/unit_test/os_interface/product_helper_tests.h"
#include "shared/source/aub_mem_dump/aub_mem_dump.h" #include "shared/source/aub_mem_dump/aub_mem_dump.h"
#include "shared/source/helpers/definitions/indirect_detection_versions.h"
#include "shared/source/helpers/gfx_core_helper.h" #include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/helpers/local_memory_access_modes.h" #include "shared/source/helpers/local_memory_access_modes.h"
#include "shared/source/kernel/kernel_descriptor.h" #include "shared/source/kernel/kernel_descriptor.h"
@ -883,69 +884,82 @@ HWTEST_F(ProductHelperTest, givenProductHelperWhenCheckDummyBlitWaRequiredThenRe
HWTEST_F(ProductHelperTest, givenProductHelperAndKernelBinaryFormatsWhenCheckingIsDetectIndirectAccessInKernelSupportedThenCorrectValueIsReturned) { HWTEST_F(ProductHelperTest, givenProductHelperAndKernelBinaryFormatsWhenCheckingIsDetectIndirectAccessInKernelSupportedThenCorrectValueIsReturned) {
KernelDescriptor kernelDescriptor; KernelDescriptor kernelDescriptor;
const auto minimalRequiredDetectIndirectVersion = productHelper->getRequiredDetectIndirectVersion();
EXPECT_GT(minimalRequiredDetectIndirectVersion, 0u);
const auto igcDetectIndirectVersion = INDIRECT_ACCESS_DETECTION_VERSION; const auto igcDetectIndirectVersion = INDIRECT_ACCESS_DETECTION_VERSION;
EXPECT_LE(igcDetectIndirectVersion, minimalRequiredDetectIndirectVersion); {
const bool detectionEnabled = std::numeric_limits<uint32_t>::max() != minimalRequiredDetectIndirectVersion; const auto minimalRequiredDetectIndirectVersion = productHelper->getRequiredDetectIndirectVersion();
if (detectionEnabled) { EXPECT_GT(minimalRequiredDetectIndirectVersion, 0u);
const uint32_t notAcceptedIndirectDetectionVersion = minimalRequiredDetectIndirectVersion - 1; EXPECT_LE(igcDetectIndirectVersion, minimalRequiredDetectIndirectVersion);
{ const bool detectionEnabled = IndirectDetectionVersions::disabled != minimalRequiredDetectIndirectVersion;
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens; if (detectionEnabled) {
kernelDescriptor.kernelAttributes.simdSize = 8u; const uint32_t notAcceptedIndirectDetectionVersion = minimalRequiredDetectIndirectVersion - 1;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion)); {
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion)); kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); kernelDescriptor.kernelAttributes.simdSize = 8u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
}
{
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
kernelDescriptor.kernelAttributes.simdSize = 8u;
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion));
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
}
} else { // detection disabled
{
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens;
kernelDescriptor.kernelAttributes.simdSize = 8u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
}
{
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
kernelDescriptor.kernelAttributes.simdSize = 8u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
}
} }
{ }
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens;
kernelDescriptor.kernelAttributes.simdSize = 1u; {
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion)); const auto minimalRequiredDetectIndirectVersionVC = productHelper->getRequiredDetectIndirectVersionVC();
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion)); EXPECT_GT(minimalRequiredDetectIndirectVersionVC, 0u);
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); EXPECT_LE(igcDetectIndirectVersion, minimalRequiredDetectIndirectVersionVC);
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); const bool detectionEnabledVC = IndirectDetectionVersions::disabled != minimalRequiredDetectIndirectVersionVC;
} if (detectionEnabledVC) {
{ const uint32_t notAcceptedIndirectDetectionVersionVC = minimalRequiredDetectIndirectVersionVC - 1;
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin; {
kernelDescriptor.kernelAttributes.simdSize = 1u; kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion)); kernelDescriptor.kernelAttributes.simdSize = 1u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersionVC));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersionVC));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersionVC));
} EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersionVC));
{ }
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin; {
kernelDescriptor.kernelAttributes.simdSize = 8u; kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersion)); kernelDescriptor.kernelAttributes.simdSize = 1u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersion)); EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, notAcceptedIndirectDetectionVersionVC));
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, notAcceptedIndirectDetectionVersionVC));
EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersionVC));
} EXPECT_TRUE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersionVC));
} else { // detection disabled }
{ } else { // detection disabled for VC
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens; {
kernelDescriptor.kernelAttributes.simdSize = 8u; kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); kernelDescriptor.kernelAttributes.simdSize = 1u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersionVC));
} EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersionVC));
{ }
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::patchtokens; {
kernelDescriptor.kernelAttributes.simdSize = 1u; kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion)); kernelDescriptor.kernelAttributes.simdSize = 1u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion)); EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersionVC));
} EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersionVC));
{ }
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
kernelDescriptor.kernelAttributes.simdSize = 1u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
}
{
kernelDescriptor.kernelAttributes.binaryFormat = DeviceBinaryFormat::zebin;
kernelDescriptor.kernelAttributes.simdSize = 8u;
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, false, minimalRequiredDetectIndirectVersion));
EXPECT_FALSE(productHelper->isDetectIndirectAccessInKernelSupported(kernelDescriptor, true, minimalRequiredDetectIndirectVersion));
} }
} }
} }