diff --git a/opencl/test/unit_test/memory_manager/local_memory_usage_tests.cpp b/opencl/test/unit_test/memory_manager/local_memory_usage_tests.cpp index 4b1e5fcf5f..59177e5929 100644 --- a/opencl/test/unit_test/memory_manager/local_memory_usage_tests.cpp +++ b/opencl/test/unit_test/memory_manager/local_memory_usage_tests.cpp @@ -7,6 +7,7 @@ #include "shared/source/helpers/basic_math.h" #include "shared/source/memory_manager/local_memory_usage.h" +#include "shared/test/unit_test/helpers/debug_manager_state_restore.h" #include "third_party/gtest/gtest/gtest.h" @@ -56,6 +57,18 @@ TEST(localMemoryUsageTest, givenLocalMemoryUsageBankSelectorWhenMemoryIsReleased EXPECT_EQ(allocationSize, selector.getOccupiedMemorySizeForBank(bankIndex)); } +TEST(localMemoryUsageTest, givenOverrideLeastOccupiedBankDebugFlagWhenGetLeastOccupiedBankIsCalledThenForcedBankIndexIsReturned) { + DebugManagerStateRestore dbgRestore; + MockLocalMemoryUsageBankSelector selector(1u); + auto bankIndex = selector.getLeastOccupiedBank(); + EXPECT_EQ(0u, bankIndex); + + uint32_t forcedBankIndex = 64u; + DebugManager.flags.OverrideLeastOccupiedBank.set(static_cast(forcedBankIndex)); + bankIndex = selector.getLeastOccupiedBank(); + EXPECT_EQ(forcedBankIndex, bankIndex); +} + TEST(localMemoryUsageTest, givenLocalMemoryUsageBankSelectorWhenMemoryAllocatedSeveralTimesItIsStoredOnDifferentBanks) { MockLocalMemoryUsageBankSelector selector(5u); diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index e1b1a2b004..9ba05b8883 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -162,5 +162,6 @@ LimitBlitterMaxHeight = -1 FlushAfterEachBlit = -1 UseCommandBufferHeaderSizeForWddmQueueSubmission = 1 OverridePreemptionSurfaceSizeInMb = -1 +OverrideLeastOccupiedBank = -1 UseAsyncDrmExec = -1 EnableMultiStorageResources = -1 \ No newline at end of file diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index e6e2fa5ac6..4920892a47 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -64,6 +64,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, LimitBlitterMaxWidth, -1, "-1: default, >=0: Max DECLARE_DEBUG_VARIABLE(int32_t, LimitBlitterMaxHeight, -1, "-1: default, >=0: Max height") DECLARE_DEBUG_VARIABLE(int32_t, FlushAfterEachBlit, -1, "-1: default, 0: disable, 1: enable") DECLARE_DEBUG_VARIABLE(int32_t, OverridePreemptionSurfaceSizeInMb, -1, "-1: default, >=0 Override preemption surface size with value") +DECLARE_DEBUG_VARIABLE(int32_t, OverrideLeastOccupiedBank, -1, "-1: default, >=0 Override least occupied bank with value") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(bool, PrintDebugSettings, false, "Dump all debug variables settings to text file. Print to stdout if value is different than default.") diff --git a/shared/source/memory_manager/local_memory_usage.cpp b/shared/source/memory_manager/local_memory_usage.cpp index 39dc2888e5..b0527c15b7 100644 --- a/shared/source/memory_manager/local_memory_usage.cpp +++ b/shared/source/memory_manager/local_memory_usage.cpp @@ -7,6 +7,8 @@ #include "shared/source/memory_manager/local_memory_usage.h" +#include "shared/source/debug_settings/debug_settings_manager.h" + #include #include #include @@ -23,6 +25,10 @@ LocalMemoryUsageBankSelector::LocalMemoryUsageBankSelector(uint32_t banksCount) } uint32_t LocalMemoryUsageBankSelector::getLeastOccupiedBank() { + if (DebugManager.flags.OverrideLeastOccupiedBank.get() != -1) { + return static_cast(DebugManager.flags.OverrideLeastOccupiedBank.get()); + } + auto leastOccupiedBankIterator = std::min_element(memorySizes.get(), memorySizes.get() + banksCount); return static_cast(std::distance(memorySizes.get(), leastOccupiedBankIterator)); }