From 8f06f3f50acbc73104fcb0272f86fb8849ab20e4 Mon Sep 17 00:00:00 2001 From: Dominik Dabek Date: Wed, 15 Nov 2023 15:04:20 +0000 Subject: [PATCH] performance: add override cacheable to gmm add attribute to override cacheable attribute to gmm constructor enable this override for command buffers on mtl change command buffers back to allocation by kmd this keeps the quicker allocation which is needed to keep enqueue times low Related-To: NEO-8152 Signed-off-by: Dominik Dabek --- shared/source/gmm_helper/gmm.cpp | 6 ++++- shared/source/gmm_helper/gmm.h | 13 ++++++++++ shared/source/os_interface/product_helper.h | 2 ++ shared/source/os_interface/product_helper.inl | 5 ++++ .../source/os_interface/product_helper_hw.h | 1 + .../windows/wddm_memory_manager.cpp | 5 +++- .../release_helper_common_xe_lpg.inl | 2 -- .../os_agnostic_product_helper_xe_lpg.inl | 6 +++++ .../test/common/mocks/mock_product_helper.h | 1 + .../test/unit_test/gmm_helper/gmm_tests.cpp | 6 +++++ .../windows/wddm_memory_manager_tests.cpp | 18 ++++++++++++++ .../release_helper_12_70_tests.cpp | 4 ++-- .../release_helper_12_71_tests.cpp | 4 ++-- .../release_helper_tests_base.cpp | 24 +------------------ .../release_helper_tests_base.h | 3 +-- .../mtl/product_helper_tests_mtl.cpp | 11 +++++++++ 16 files changed, 78 insertions(+), 33 deletions(-) diff --git a/shared/source/gmm_helper/gmm.cpp b/shared/source/gmm_helper/gmm.cpp index b571776860..a52e290edd 100644 --- a/shared/source/gmm_helper/gmm.cpp +++ b/shared/source/gmm_helper/gmm.cpp @@ -39,8 +39,12 @@ Gmm::Gmm(GmmHelper *gmmHelper, const void *alignedPtr, size_t alignedSize, size_ resourceParams.Usage = gmmResourceUsage; resourceParams.Flags.Info.Linear = 1; + this->preferNoCpuAccess = CacheSettingsHelper::preferNoCpuAccess(gmmResourceUsage, gmmHelper->getRootDeviceEnvironment()); - resourceParams.Flags.Info.Cacheable = !this->preferNoCpuAccess && !CacheSettingsHelper::isUncachedType(gmmResourceUsage); + bool cacheable = !this->preferNoCpuAccess && !CacheSettingsHelper::isUncachedType(gmmResourceUsage); + gmmRequirements.overriderCacheable.doOverride(cacheable); + resourceParams.Flags.Info.Cacheable = cacheable; + resourceParams.Flags.Gpu.Texture = 1; if (alignedPtr) { diff --git a/shared/source/gmm_helper/gmm.h b/shared/source/gmm_helper/gmm.h index 6ddb17a154..8b327623c3 100644 --- a/shared/source/gmm_helper/gmm.h +++ b/shared/source/gmm_helper/gmm.h @@ -19,9 +19,22 @@ struct StorageInfo; class GmmResourceInfo; class GmmHelper; +template +struct Overrider { + bool enableOverride{false}; + OverriddenType value; + + void doOverride(OverriddenType &variable) const { + if (enableOverride) { + variable = value; + } + } +}; + struct GmmRequirements { bool preferCompressed; bool allowLargePages; + Overrider overriderCacheable; }; class Gmm { diff --git a/shared/source/os_interface/product_helper.h b/shared/source/os_interface/product_helper.h index 81e10a3543..c6e29730f8 100644 --- a/shared/source/os_interface/product_helper.h +++ b/shared/source/os_interface/product_helper.h @@ -20,6 +20,7 @@ enum class ProductFamily : uint32_t; namespace NEO { +struct AllocationData; class CommandStreamReceiver; class Device; enum class LocalMemoryAccessMode; @@ -168,6 +169,7 @@ class ProductHelper { virtual uint32_t getCommandBuffersPreallocatedPerCommandQueue() const = 0; virtual bool isPlatformDpasSupported() const = 0; virtual bool isPlatformDp4aSupported() const = 0; + virtual bool overrideAllocationCacheable(const AllocationData &allocationData) const = 0; virtual bool getFrontEndPropertyScratchSizeSupport() const = 0; virtual bool getFrontEndPropertyPrivateScratchSizeSupport() const = 0; diff --git a/shared/source/os_interface/product_helper.inl b/shared/source/os_interface/product_helper.inl index 93f9d3daf0..393eeca513 100644 --- a/shared/source/os_interface/product_helper.inl +++ b/shared/source/os_interface/product_helper.inl @@ -176,6 +176,11 @@ bool ProductHelperHw::isPlatformDp4aSupported() const { return false; } +template +bool ProductHelperHw::overrideAllocationCacheable(const AllocationData &allocationData) const { + return false; +} + template bool ProductHelperHw::isAdditionalStateBaseAddressWARequired(const HardwareInfo &hwInfo) const { return false; diff --git a/shared/source/os_interface/product_helper_hw.h b/shared/source/os_interface/product_helper_hw.h index 9c7dc5bbf1..b30b5d93c3 100644 --- a/shared/source/os_interface/product_helper_hw.h +++ b/shared/source/os_interface/product_helper_hw.h @@ -122,6 +122,7 @@ class ProductHelperHw : public ProductHelper { uint32_t getCommandBuffersPreallocatedPerCommandQueue() const override; bool isPlatformDpasSupported() const override; bool isPlatformDp4aSupported() const override; + bool overrideAllocationCacheable(const AllocationData &allocationData) const override; bool getFrontEndPropertyScratchSizeSupport() const override; bool getFrontEndPropertyPrivateScratchSizeSupport() const override; diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 8571405810..efd12003f1 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -111,7 +111,6 @@ bool WddmMemoryManager::mapPhysicalToVirtualMemory(GraphicsAllocation *physicalA } GraphicsAllocation *WddmMemoryManager::allocatePhysicalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) { - auto &productHelper = executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHelper(); StorageInfo systemMemoryStorageInfo = {}; systemMemoryStorageInfo.isLockable = allocationData.storageInfo.isLockable; @@ -215,6 +214,10 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC GmmRequirements gmmRequirements{}; gmmRequirements.allowLargePages = allowLargePages; gmmRequirements.preferCompressed = allocationData.flags.preferCompressed; + if (productHelper.overrideAllocationCacheable(allocationData)) { + gmmRequirements.overriderCacheable.enableOverride = true; + gmmRequirements.overriderCacheable.value = true; + } auto gmm = new Gmm(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), nullptr, sizeAligned, 0u, diff --git a/shared/source/release_helper/release_helper_common_xe_lpg.inl b/shared/source/release_helper/release_helper_common_xe_lpg.inl index 409735a223..5f6ddcfd0e 100644 --- a/shared/source/release_helper/release_helper_common_xe_lpg.inl +++ b/shared/source/release_helper/release_helper_common_xe_lpg.inl @@ -21,8 +21,6 @@ std::optional ReleaseHelperHw::getPreferredA case AllocationType::TAG_BUFFER: case AllocationType::TIMESTAMP_PACKET_TAG_BUFFER: return {}; - case AllocationType::COMMAND_BUFFER: - return GfxMemoryAllocationMethod::UseUmdSystemPtr; default: return GfxMemoryAllocationMethod::AllocateByKmd; } diff --git a/shared/source/xe_hpg_core/xe_lpg/os_agnostic_product_helper_xe_lpg.inl b/shared/source/xe_hpg_core/xe_lpg/os_agnostic_product_helper_xe_lpg.inl index 922d083210..059fa58db6 100644 --- a/shared/source/xe_hpg_core/xe_lpg/os_agnostic_product_helper_xe_lpg.inl +++ b/shared/source/xe_hpg_core/xe_lpg/os_agnostic_product_helper_xe_lpg.inl @@ -7,6 +7,7 @@ #include "shared/source/command_stream/command_stream_receiver.h" #include "shared/source/helpers/gfx_core_helper.h" +#include "shared/source/memory_manager/allocation_properties.h" #include "shared/source/memory_manager/allocation_type.h" #include "shared/source/os_interface/product_helper.h" #include "shared/source/os_interface/product_helper.inl" @@ -91,6 +92,11 @@ bool ProductHelperHw::isPlatformDp4aSupported() const { return true; } +template <> +bool ProductHelperHw::overrideAllocationCacheable(const AllocationData &allocationData) const { + return allocationData.type == AllocationType::COMMAND_BUFFER; +} + template <> uint32_t ProductHelperHw::getCommandBuffersPreallocatedPerCommandQueue() const { return 2u; diff --git a/shared/test/common/mocks/mock_product_helper.h b/shared/test/common/mocks/mock_product_helper.h index f9f89146e8..5fa89d0f94 100644 --- a/shared/test/common/mocks/mock_product_helper.h +++ b/shared/test/common/mocks/mock_product_helper.h @@ -16,6 +16,7 @@ struct MockProductHelper : ProductHelperHw { MockProductHelper() = default; ADDMETHOD_CONST_NOBASE(is48bResourceNeededForRayTracing, bool, true, ()); + ADDMETHOD_CONST_NOBASE(overrideAllocationCacheable, bool, false, (const AllocationData &allocationData)); ADDMETHOD_NOBASE(configureHwInfoWddm, int, 0, (const HardwareInfo *inHwInfo, HardwareInfo *outHwInfo, const RootDeviceEnvironment &rootDeviceEnvironment)); }; } // namespace NEO diff --git a/shared/test/unit_test/gmm_helper/gmm_tests.cpp b/shared/test/unit_test/gmm_helper/gmm_tests.cpp index 438abf3114..5b87434bf1 100644 --- a/shared/test/unit_test/gmm_helper/gmm_tests.cpp +++ b/shared/test/unit_test/gmm_helper/gmm_tests.cpp @@ -119,6 +119,12 @@ HWTEST_F(GmmTests, givenVariousResourceUsageTypeWhenCreateGmmThenFlagCacheableIs auto gmm = std::make_unique(getGmmHelper(), nullptr, 0, 0, uncacheableResourceUsageType, storageInfo, gmmRequirements); EXPECT_FALSE(gmm->resourceParams.Flags.Info.Cacheable); } + { + gmmRequirements.overriderCacheable.enableOverride = true; + gmmRequirements.overriderCacheable.value = true; + auto gmm = std::make_unique(getGmmHelper(), nullptr, 0, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, storageInfo, gmmRequirements); + EXPECT_TRUE(gmm->resourceParams.Flags.Info.Cacheable); + } } } // namespace NEO diff --git a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index 704b5c2f58..16b7fc51cc 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -28,6 +28,7 @@ #include "shared/test/common/mocks/mock_gmm_page_table_mngr.h" #include "shared/test/common/mocks/mock_memory_manager.h" #include "shared/test/common/mocks/mock_os_context.h" +#include "shared/test/common/mocks/mock_product_helper.h" #include "shared/test/common/mocks/windows/mock_wddm_allocation.h" #include "shared/test/common/os_interface/windows/mock_wddm_memory_manager.h" #include "shared/test/common/os_interface/windows/wddm_fixture.h" @@ -141,6 +142,23 @@ TEST_F(WddmMemoryManagerTests, GivenNotCompressedAndNotLockableAllocationTypeWhe memoryManager->freeGraphicsMemory(graphicsAllocation); } +TEST_F(WddmMemoryManagerTests, GivenOverrideAllocationCacheableWhenAllocateUsingKmdAndMapToCpuVaThenOverrideAllocationCacheable) { + NEO::AllocationData allocData = {}; + allocData.type = NEO::AllocationType::COMMAND_BUFFER; + auto mockProductHelper = std::make_unique(); + mockProductHelper->overrideAllocationCacheableResult = true; + executionEnvironment->rootDeviceEnvironments[0]->productHelper.reset(mockProductHelper.release()); + + memoryManager->callBaseAllocateGraphicsMemoryUsingKmdAndMapItToCpuVA = true; + auto graphicsAllocation = memoryManager->allocateGraphicsMemoryUsingKmdAndMapItToCpuVA(allocData, false); + + ASSERT_NE(nullptr, graphicsAllocation); + + EXPECT_TRUE(graphicsAllocation->getDefaultGmm()->resourceParams.Flags.Info.Cacheable); + + memoryManager->freeGraphicsMemory(graphicsAllocation); +} + TEST_F(WddmMemoryManagerTests, GivenCompressedAndNotLockableAllocationTypeWhenAllocateUsingKmdAndMapToCpuVaThenSetResourceNotLockable) { NEO::AllocationData allocData = {}; allocData.type = NEO::AllocationType::BUFFER; diff --git a/shared/test/unit_test/release_helper/release_helper_12_70_tests.cpp b/shared/test/unit_test/release_helper/release_helper_12_70_tests.cpp index ab1b3347c3..ac902e1be4 100644 --- a/shared/test/unit_test/release_helper/release_helper_12_70_tests.cpp +++ b/shared/test/unit_test/release_helper/release_helper_12_70_tests.cpp @@ -66,8 +66,8 @@ TEST_F(ReleaseHelper1270Tests, whenGettingMediaFrequencyTileIndexThenOneIsReturn whenGettingMediaFrequencyTileIndexThenOneIsReturned(); } -TEST_F(ReleaseHelper1270Tests, whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestapPacketTagBuffer) { - whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBufferAndCommandBuffer(); +TEST_F(ReleaseHelper1270Tests, whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer) { + whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer(); } TEST_F(ReleaseHelper1270Tests, whenGettingSupportedNumGrfsThenCorrectValuesAreReturned) { diff --git a/shared/test/unit_test/release_helper/release_helper_12_71_tests.cpp b/shared/test/unit_test/release_helper/release_helper_12_71_tests.cpp index 32864fae58..7123839301 100644 --- a/shared/test/unit_test/release_helper/release_helper_12_71_tests.cpp +++ b/shared/test/unit_test/release_helper/release_helper_12_71_tests.cpp @@ -67,8 +67,8 @@ TEST_F(ReleaseHelper1271Tests, whenGettingMediaFrequencyTileIndexThenOneIsReturn whenGettingMediaFrequencyTileIndexThenOneIsReturned(); } -TEST_F(ReleaseHelper1271Tests, whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestapPacketTagBuffer) { - whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBufferAndCommandBuffer(); +TEST_F(ReleaseHelper1271Tests, whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer) { + whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer(); } TEST_F(ReleaseHelper1271Tests, whenGettingSupportedNumGrfsThenCorrectValuesAreReturned) { diff --git a/shared/test/unit_test/release_helper/release_helper_tests_base.cpp b/shared/test/unit_test/release_helper/release_helper_tests_base.cpp index 6eb5ee35d0..b351c3ea01 100644 --- a/shared/test/unit_test/release_helper/release_helper_tests_base.cpp +++ b/shared/test/unit_test/release_helper/release_helper_tests_base.cpp @@ -68,7 +68,7 @@ void ReleaseHelperTestsBase::whenGettingMediaFrequencyTileIndexThenOneIsReturned } } -void ReleaseHelperTestsBase::whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestapPacketTagBuffer() { +void ReleaseHelperTestsBase::whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer() { for (auto &revision : getRevisions()) { ipVersion.revision = revision; releaseHelper = ReleaseHelper::create(ipVersion); @@ -87,28 +87,6 @@ void ReleaseHelperTestsBase::whenCheckPreferredAllocationMethodThenAllocateByKmd } } -void ReleaseHelperTestsBase::whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBufferAndCommandBuffer() { - for (auto &revision : getRevisions()) { - ipVersion.revision = revision; - releaseHelper = ReleaseHelper::create(ipVersion); - ASSERT_NE(nullptr, releaseHelper); - for (auto i = 0; i < static_cast(AllocationType::COUNT); i++) { - auto allocationType = static_cast(i); - auto preferredAllocationMethod = releaseHelper->getPreferredAllocationMethod(allocationType); - if (allocationType == AllocationType::TAG_BUFFER || - allocationType == AllocationType::TIMESTAMP_PACKET_TAG_BUFFER) { - EXPECT_FALSE(preferredAllocationMethod.has_value()); - } else if (allocationType == AllocationType::COMMAND_BUFFER) { - EXPECT_TRUE(preferredAllocationMethod.has_value()); - EXPECT_EQ(GfxMemoryAllocationMethod::UseUmdSystemPtr, preferredAllocationMethod.value()); - } else { - EXPECT_TRUE(preferredAllocationMethod.has_value()); - EXPECT_EQ(GfxMemoryAllocationMethod::AllocateByKmd, preferredAllocationMethod.value()); - } - } - } -} - void ReleaseHelperTestsBase::whenShouldAdjustCalledThenTrueReturned() { for (auto &revision : getRevisions()) { ipVersion.revision = revision; diff --git a/shared/test/unit_test/release_helper/release_helper_tests_base.h b/shared/test/unit_test/release_helper/release_helper_tests_base.h index a881a48a31..c0e378372c 100644 --- a/shared/test/unit_test/release_helper/release_helper_tests_base.h +++ b/shared/test/unit_test/release_helper/release_helper_tests_base.h @@ -25,8 +25,7 @@ struct ReleaseHelperTestsBase : public ::testing::Test { void whenGettingPreferredAllocationMethodThenNoPreferenceIsReturned(); void whenGettingMaxPreferredSlmSizeThenSizeIsNotModified(); void whenGettingMediaFrequencyTileIndexThenOneIsReturned(); - void whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestapPacketTagBuffer(); - void whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBufferAndCommandBuffer(); + void whenCheckPreferredAllocationMethodThenAllocateByKmdIsReturnedExceptTagBufferAndTimestampPacketTagBuffer(); void whenShouldAdjustCalledThenTrueReturned(); void whenShouldAdjustCalledThenFalseReturned(); void whenGettingSupportedNumGrfsThenValues128And256Returned(); diff --git a/shared/test/unit_test/xe_hpg_core/mtl/product_helper_tests_mtl.cpp b/shared/test/unit_test/xe_hpg_core/mtl/product_helper_tests_mtl.cpp index b87ae0ef0a..512848a434 100644 --- a/shared/test/unit_test/xe_hpg_core/mtl/product_helper_tests_mtl.cpp +++ b/shared/test/unit_test/xe_hpg_core/mtl/product_helper_tests_mtl.cpp @@ -5,6 +5,8 @@ * */ +#include "shared/source/memory_manager/allocation_properties.h" +#include "shared/source/memory_manager/allocation_type.h" #include "shared/source/os_interface/product_helper.h" #include "shared/source/xe_hpg_core/hw_cmds_mtl.h" #include "shared/test/common/test_macros/header/per_product_test_definitions.h" @@ -18,3 +20,12 @@ using MtlProductHelper = ProductHelperTest; MTLTEST_F(MtlProductHelper, givenProductHelperWhenCheckDirectSubmissionSupportedThenTrueIsReturned) { EXPECT_TRUE(productHelper->isDirectSubmissionSupported(releaseHelper)); } + +MTLTEST_F(MtlProductHelper, givenProductHelperWhenCheckOverrideAllocationCacheableThenTrueIsReturnedForCommandBuffer) { + AllocationData allocationData{}; + allocationData.type = AllocationType::COMMAND_BUFFER; + EXPECT_TRUE(productHelper->overrideAllocationCacheable(allocationData)); + + allocationData.type = AllocationType::BUFFER; + EXPECT_FALSE(productHelper->overrideAllocationCacheable(allocationData)); +} \ No newline at end of file