From 741101551e3675cf965286a9c1440859262f2f3d Mon Sep 17 00:00:00 2001 From: Dominik Dabek Date: Thu, 24 Oct 2024 15:15:52 +0000 Subject: [PATCH] fix: add infrastructure to limit device usm reuse max memory used Related-To: NEO-12924 Signed-off-by: Dominik Dabek --- shared/source/ail/ail_configuration.h | 4 ++++ shared/source/ail/ail_configuration_base.inl | 5 +++++ shared/source/ail/ail_configuration_extra.cpp | 2 ++ .../ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp | 6 ++++++ .../ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp | 6 ++++++ .../memory_manager/unified_memory_manager.cpp | 5 ++++- shared/test/common/mocks/mock_ail_configuration.h | 5 +++++ .../unified_memory_manager_cache_tests.cpp | 13 +++++++++++++ 8 files changed, 45 insertions(+), 1 deletion(-) diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index b33e200e22..941a43e547 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -82,6 +82,8 @@ class AILConfiguration { virtual bool disableBindlessAddressing() = 0; + virtual bool limitAmountOfDeviceMemoryForRecycling() = 0; + protected: virtual void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) = 0; std::string processName; @@ -96,6 +98,7 @@ extern const std::set applicationsContextSyncFlag; extern const std::set applicationsForceRcsDg2; extern const std::set applicationsBufferPoolDisabled; extern const std::set applicationsOverfetchDisabled; +extern const std::set applicationsDeviceUSMRecyclingLimited; template class AILConfigurationHw : public AILConfiguration { @@ -115,6 +118,7 @@ class AILConfigurationHw : public AILConfiguration { bool forceRcs() override; bool handleDivergentBarriers() override; bool disableBindlessAddressing() override; + bool limitAmountOfDeviceMemoryForRecycling() override; bool shouldForceRcs = false; bool shouldHandleDivergentBarriers = false; diff --git a/shared/source/ail/ail_configuration_base.inl b/shared/source/ail/ail_configuration_base.inl index 4ee57c5dfc..b633752c1b 100644 --- a/shared/source/ail/ail_configuration_base.inl +++ b/shared/source/ail/ail_configuration_base.inl @@ -61,4 +61,9 @@ inline void AILConfigurationHw::setDisableBindlessAddressing(bool val) shouldDisableBindlessAddressing = val; } +template +inline bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() { + return false; +} + } // namespace NEO diff --git a/shared/source/ail/ail_configuration_extra.cpp b/shared/source/ail/ail_configuration_extra.cpp index 8bf43b5e09..df7514580c 100644 --- a/shared/source/ail/ail_configuration_extra.cpp +++ b/shared/source/ail/ail_configuration_extra.cpp @@ -36,6 +36,8 @@ const std::set applicationsBufferPoolDisabled = {}; const std::set applicationsOverfetchDisabled = {}; +const std::set applicationsDeviceUSMRecyclingLimited = {}; + AILConfigurationCreateFunctionType ailConfigurationFactory[IGFX_MAX_PRODUCT]; void AILConfiguration::apply(RuntimeCapabilityTable &runtimeCapabilityTable) { diff --git a/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp b/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp index 8b594d37e9..22aca3dff3 100644 --- a/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp +++ b/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp @@ -18,6 +18,12 @@ bool AILConfigurationHw::isBufferPoolEnabled() { return iterator == applicationsBufferPoolDisabled.end(); } +template <> +bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() { + auto iterator = applicationsDeviceUSMRecyclingLimited.find(processName); + return iterator != applicationsDeviceUSMRecyclingLimited.end(); +} + template <> bool AILConfigurationHw::is256BPrefetchDisableRequired() { auto iterator = applicationsOverfetchDisabled.find(processName); diff --git a/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp b/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp index 740087c3c6..d4656458a8 100644 --- a/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp +++ b/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp @@ -58,6 +58,12 @@ bool AILConfigurationHw::isBufferPoolEnabled() { return iterator == applicationsBufferPoolDisabled.end(); } +template <> +bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() { + auto iterator = applicationsDeviceUSMRecyclingLimited.find(processName); + return iterator != applicationsDeviceUSMRecyclingLimited.end(); +} + template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/memory_manager/unified_memory_manager.cpp b/shared/source/memory_manager/unified_memory_manager.cpp index d6c8d95337..147df25077 100644 --- a/shared/source/memory_manager/unified_memory_manager.cpp +++ b/shared/source/memory_manager/unified_memory_manager.cpp @@ -7,6 +7,7 @@ #include "shared/source/memory_manager/unified_memory_manager.h" +#include "shared/source/ail/ail_configuration.h" #include "shared/source/command_stream/command_stream_receiver.h" #include "shared/source/device/sub_device.h" #include "shared/source/execution_environment/execution_environment.h" @@ -713,7 +714,9 @@ void SVMAllocsManager::freeZeroCopySvmAllocation(SvmAllocationData *svmData) { void SVMAllocsManager::initUsmDeviceAllocationsCache(Device &device) { this->usmDeviceAllocationsCache.allocations.reserve(128u); const auto totalDeviceMemory = device.getGlobalMemorySize(static_cast(device.getDeviceBitfield().to_ulong())); - auto fractionOfTotalMemoryForRecycling = 0.08; + auto ailConfiguration = device.getAilConfigurationHelper(); + const bool limitDeviceMemoryForReuse = ailConfiguration && ailConfiguration->limitAmountOfDeviceMemoryForRecycling(); + auto fractionOfTotalMemoryForRecycling = limitDeviceMemoryForReuse ? 0.02 : 0.08; if (debugManager.flags.ExperimentalEnableDeviceAllocationCache.get() != -1) { fractionOfTotalMemoryForRecycling = 0.01 * std::min(100, debugManager.flags.ExperimentalEnableDeviceAllocationCache.get()); } diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index b19b001fb9..e98c04c3a6 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -33,6 +33,11 @@ class MockAILConfiguration : public AILConfiguration { return isBufferPoolEnabledReturn; } + bool limitAmountOfDeviceMemoryForRecyclingReturn = false; + bool limitAmountOfDeviceMemoryForRecycling() override { + return limitAmountOfDeviceMemoryForRecyclingReturn; + } + bool fallbackToLegacyValidationLogic = false; bool useLegacyValidationLogic() override { return fallbackToLegacyValidationLogic; diff --git a/shared/test/unit_test/memory_manager/unified_memory_manager_cache_tests.cpp b/shared/test/unit_test/memory_manager/unified_memory_manager_cache_tests.cpp index 9853a01737..7684312a16 100644 --- a/shared/test/unit_test/memory_manager/unified_memory_manager_cache_tests.cpp +++ b/shared/test/unit_test/memory_manager/unified_memory_manager_cache_tests.cpp @@ -8,6 +8,7 @@ #include "shared/source/helpers/api_specific_config.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/raii_product_helper.h" +#include "shared/test/common/mocks/mock_ail_configuration.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_graphics_allocation.h" #include "shared/test/common/mocks/mock_memory_manager.h" @@ -136,6 +137,8 @@ HWTEST_F(SvmDeviceAllocationCacheTest, givenOclApiSpecificConfigWhenCheckingIfEn std::unique_ptr deviceFactory(new UltDeviceFactory(1, 1)); auto device = deviceFactory->rootDevices[0]; RAIIProductHelperFactory raii(*device->getExecutionEnvironment()->rootDeviceEnvironments[0]); + MockAILConfiguration mockAilConfigurationHelper; + device->mockAilConfigurationHelper = &mockAilConfigurationHelper; { raii.mockProductHelper->isDeviceUsmAllocationReuseSupportedResult = false; auto svmManager = std::make_unique(device->getMemoryManager(), false); @@ -152,6 +155,16 @@ HWTEST_F(SvmDeviceAllocationCacheTest, givenOclApiSpecificConfigWhenCheckingIfEn const auto expectedMaxSize = static_cast(0.08 * device->getGlobalMemorySize(static_cast(device->getDeviceBitfield().to_ullong()))); EXPECT_EQ(expectedMaxSize, svmManager->usmDeviceAllocationsCache.maxSize); } + { + raii.mockProductHelper->isDeviceUsmAllocationReuseSupportedResult = true; + mockAilConfigurationHelper.limitAmountOfDeviceMemoryForRecyclingReturn = true; + auto svmManager = std::make_unique(device->getMemoryManager(), false); + EXPECT_FALSE(svmManager->usmDeviceAllocationsCacheEnabled); + svmManager->initUsmAllocationsCaches(*device); + EXPECT_TRUE(svmManager->usmDeviceAllocationsCacheEnabled); + const auto expectedMaxSize = static_cast(0.02 * device->getGlobalMemorySize(static_cast(device->getDeviceBitfield().to_ullong()))); + EXPECT_EQ(expectedMaxSize, svmManager->usmDeviceAllocationsCache.maxSize); + } } struct SvmDeviceAllocationCacheSimpleTestDataType {