From 2f9135a4e61c2fb5290fb0bed5167fefa3fa849e Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 27 Apr 2023 15:42:17 +0000 Subject: [PATCH] fix: change type of container with registered engines per root device use StackVec instead of unordered map resize container at MemoryManager's creation time Related-To: NEO-7925 Signed-off-by: Mateusz Jablonski --- .../test/unit_test/memory_manager/memory_manager_tests.cpp | 2 +- .../os_interface/windows/wddm_memory_manager_tests.cpp | 2 ++ shared/source/helpers/common_types.h | 5 +++-- shared/source/memory_manager/memory_manager.cpp | 7 ++++--- shared/source/memory_manager/memory_manager.h | 2 +- shared/source/os_interface/windows/wddm/wddm.cpp | 6 +++--- shared/source/os_interface/windows/wddm_memory_manager.cpp | 2 +- shared/test/common/mocks/mock_device.cpp | 2 +- .../os_interface/linux/drm_memory_manager_fixture.cpp | 2 +- .../common/os_interface/windows/mock_wddm_memory_manager.h | 1 + .../command_stream/aub_command_stream_receiver_3_tests.cpp | 3 +-- .../unit_test/command_stream/tbx_command_stream_tests.cpp | 3 +-- .../linux/drm_residency_handler_prelim_tests.cpp | 4 ++-- 13 files changed, 22 insertions(+), 19 deletions(-) diff --git a/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp b/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp index f7e944fd77..729160106e 100644 --- a/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp +++ b/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp @@ -2165,7 +2165,7 @@ TEST(ResidencyDataTest, givenTwoOsContextsWhenTheyAreRegisteredFromHigherToLower PreemptionHelper::getDefaultPreemptionMode(*defaultHwInfo))); memoryManager->createAndRegisterOsContext(csr1.get(), EngineDescriptorHelper::getDefaultDescriptor(gfxCoreHelper.getGpgpuEngineInstances(*executionEnvironment.rootDeviceEnvironments[0])[0], PreemptionHelper::getDefaultPreemptionMode(*defaultHwInfo))); - EXPECT_EQ(2u, memoryManager->allRegisteredEngines.size()); + EXPECT_EQ(3u, memoryManager->allRegisteredEngines.size()); EXPECT_EQ(1u, memoryManager->allRegisteredEngines[0].size()); EXPECT_EQ(1u, memoryManager->allRegisteredEngines[1].size()); EXPECT_EQ(1, memoryManager->allRegisteredEngines[0][0].osContext->getRefInternalCount()); diff --git a/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index 06fc6fd068..b96f6190cc 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -1980,6 +1980,7 @@ TEST_F(WddmMemoryManagerTest, givenWddmMemoryManagerWithRegisteredOsContextWhenC executionEnvironment->rootDeviceEnvironments[i]->initGmm(); } executionEnvironment->initializeMemoryManager(); + memoryManager->allRegisteredEngines.resize(3); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->osInterface.reset(); auto wddm = static_cast(Wddm::createWddm(nullptr, *executionEnvironment->rootDeviceEnvironments[i].get())); @@ -2005,6 +2006,7 @@ TEST_F(WddmMemoryManagerTest, givenWddmMemoryManagerWithRegisteredOsContextWithE executionEnvironment->rootDeviceEnvironments[i]->initGmm(); } executionEnvironment->initializeMemoryManager(); + memoryManager->allRegisteredEngines.resize(3); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->osInterface.reset(); auto wddm = static_cast(Wddm::createWddm(nullptr, *executionEnvironment->rootDeviceEnvironments[i].get())); diff --git a/shared/source/helpers/common_types.h b/shared/source/helpers/common_types.h index e2a5e501e9..ad8e3cb20f 100644 --- a/shared/source/helpers/common_types.h +++ b/shared/source/helpers/common_types.h @@ -6,15 +6,16 @@ */ #pragma once +#include "shared/source/utilities/stackvec.h" + #include #include -#include #include namespace NEO { struct EngineControl; using EngineControlContainer = std::vector; -using MultiDeviceEngineControlContainer = std::unordered_map; +using MultiDeviceEngineControlContainer = StackVec; class Device; using DeviceVector = std::vector>; diff --git a/shared/source/memory_manager/memory_manager.cpp b/shared/source/memory_manager/memory_manager.cpp index 5655391a59..13509b6f0f 100644 --- a/shared/source/memory_manager/memory_manager.cpp +++ b/shared/source/memory_manager/memory_manager.cpp @@ -54,6 +54,7 @@ MemoryManager::MemoryManager(ExecutionEnvironment &executionEnvironment) : execu defaultEngineIndex.resize(rootEnvCount); checkIsaPlacementOnceFlags = std::make_unique(rootEnvCount); isaInLocalMemory.resize(rootEnvCount); + allRegisteredEngines.resize(rootEnvCount + 1); for (uint32_t rootDeviceIndex = 0; rootDeviceIndex < rootEnvCount; ++rootDeviceIndex) { auto &rootDeviceEnvironment = *executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]; @@ -82,10 +83,10 @@ MemoryManager::MemoryManager(ExecutionEnvironment &executionEnvironment) : execu MemoryManager::~MemoryManager() { for (auto &engineContainer : allRegisteredEngines) { - for (auto &engine : engineContainer.second) { + for (auto &engine : engineContainer) { engine.osContext->decRefInternal(); } - engineContainer.second.clear(); + engineContainer.clear(); } allRegisteredEngines.clear(); if (reservedMemory) { @@ -825,7 +826,7 @@ bool MemoryManager::allocInUse(GraphicsAllocation &graphicsAllocation) { void MemoryManager::cleanTemporaryAllocationListOnAllEngines(bool waitForCompletion) { for (auto &engineContainer : allRegisteredEngines) { - for (auto &engine : engineContainer.second) { + for (auto &engine : engineContainer) { auto csr = engine.commandStreamReceiver; if (waitForCompletion) { csr->waitForCompletionWithTimeout(WaitParams{false, false, 0}, csr->peekLatestSentTaskCount()); diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index 25bf2666a9..13242c7b48 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -213,7 +213,7 @@ class MemoryManager { MOCKABLE_VIRTUAL OsContext *createAndRegisterOsContext(CommandStreamReceiver *commandStreamReceiver, const EngineDescriptor &engineDescriptor); - EngineControlContainer &getRegisteredEngines(uint32_t rootDeviceIndex) { return allRegisteredEngines[rootDeviceIndex]; } + const EngineControlContainer &getRegisteredEngines(uint32_t rootDeviceIndex) const { return allRegisteredEngines[rootDeviceIndex]; } const MultiDeviceEngineControlContainer &getRegisteredEngines() const { return allRegisteredEngines; } const EngineControl *getRegisteredEngineForCsr(CommandStreamReceiver *commandStreamReceiver); void unregisterEngineForCsr(CommandStreamReceiver *commandStreamReceiver); diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 011200d6fd..d8b4ff7396 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -553,9 +553,9 @@ bool Wddm::mapGpuVirtualAddress(Gmm *gmm, D3DKMT_HANDLE handle, D3DGPU_VIRTUAL_A bool ret = true; auto &productHelper = rootDeviceEnvironment.getHelper(); if (gmm->isCompressionEnabled && productHelper.isPageTableManagerSupported(*rootDeviceEnvironment.getHardwareInfo())) { - for (auto &engineContainer : rootDeviceEnvironment.executionEnvironment.memoryManager->getRegisteredEngines()) { - if (rootDeviceEnvironment.executionEnvironment.rootDeviceEnvironments[engineContainer.first].get() == &rootDeviceEnvironment) { - for (auto &engine : engineContainer.second) { + for (auto rootDeviceIndex = 0u; rootDeviceIndex < rootDeviceEnvironment.executionEnvironment.rootDeviceEnvironments.size(); rootDeviceIndex++) { + if (rootDeviceEnvironment.executionEnvironment.rootDeviceEnvironments[rootDeviceIndex].get() == &rootDeviceEnvironment) { + for (auto &engine : rootDeviceEnvironment.executionEnvironment.memoryManager->getRegisteredEngines(rootDeviceIndex)) { if (engine.commandStreamReceiver->pageTableManager.get()) { ret &= engine.commandStreamReceiver->pageTableManager->updateAuxTable(gpuPtr, gmm, true); } diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 6d121c50e9..d6c3736e2c 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -681,7 +681,7 @@ bool WddmMemoryManager::tryDeferDeletions(const D3DKMT_HANDLE *handles, uint32_t bool WddmMemoryManager::isMemoryBudgetExhausted() const { for (auto &engineContainer : allRegisteredEngines) { - for (auto &engine : engineContainer.second) { + for (auto &engine : engineContainer) { if (static_cast(engine.osContext)->getResidencyController().isMemoryBudgetExhausted()) { return true; } diff --git a/shared/test/common/mocks/mock_device.cpp b/shared/test/common/mocks/mock_device.cpp index 44ccf686a6..c0bb086d45 100644 --- a/shared/test/common/mocks/mock_device.cpp +++ b/shared/test/common/mocks/mock_device.cpp @@ -89,7 +89,7 @@ void MockDevice::resetCommandStreamReceiver(CommandStreamReceiver *newCsr, uint3 registeredEngine.commandStreamReceiver = newCsr; allEngines[engineIndex].commandStreamReceiver = newCsr; - memoryManager->getRegisteredEngines(rootDeviceIndex).emplace_back(registeredEngine); + const_cast(memoryManager->getRegisteredEngines(rootDeviceIndex)).emplace_back(registeredEngine); osContext->incRefInternal(); newCsr->setupContext(*osContext); osContext->ensureContextInitialized(); diff --git a/shared/test/common/os_interface/linux/drm_memory_manager_fixture.cpp b/shared/test/common/os_interface/linux/drm_memory_manager_fixture.cpp index bfd41a298b..14cc8847ff 100644 --- a/shared/test/common/os_interface/linux/drm_memory_manager_fixture.cpp +++ b/shared/test/common/os_interface/linux/drm_memory_manager_fixture.cpp @@ -77,7 +77,7 @@ void DrmMemoryManagerFixture::tearDown() { int enginesCount = 0; for (auto &engineContainer : memoryManager->getRegisteredEngines()) { - enginesCount += engineContainer.second.size(); + enginesCount += engineContainer.size(); } mock->ioctlExpected.contextDestroy = enginesCount; diff --git a/shared/test/common/os_interface/windows/mock_wddm_memory_manager.h b/shared/test/common/os_interface/windows/mock_wddm_memory_manager.h index ab294ecf5c..044d1dc7e2 100644 --- a/shared/test/common/os_interface/windows/mock_wddm_memory_manager.h +++ b/shared/test/common/os_interface/windows/mock_wddm_memory_manager.h @@ -25,6 +25,7 @@ class MockWddmMemoryManager : public MemoryManagerCreate { using BaseClass::allocateMemoryByKMD; using BaseClass::allocatePhysicalDeviceMemory; using BaseClass::allocatePhysicalLocalDeviceMemory; + using BaseClass::allRegisteredEngines; using BaseClass::createGraphicsAllocation; using BaseClass::createPhysicalAllocation; using BaseClass::createWddmAllocation; diff --git a/shared/test/unit_test/command_stream/aub_command_stream_receiver_3_tests.cpp b/shared/test/unit_test/command_stream/aub_command_stream_receiver_3_tests.cpp index ed9de51a8e..21d43a080e 100644 --- a/shared/test/unit_test/command_stream/aub_command_stream_receiver_3_tests.cpp +++ b/shared/test/unit_test/command_stream/aub_command_stream_receiver_3_tests.cpp @@ -578,9 +578,8 @@ HWTEST_F(AubCommandStreamReceiverTests, givenUsmAllocationWhenDumpAllocationIsCa using SimulatedCsrTest = ::testing::Test; HWTEST_F(SimulatedCsrTest, givenAubCsrTypeWhenCreateCommandStreamReceiverThenProperAubCenterIsInitalized) { uint32_t expectedRootDeviceIndex = 10; - MockExecutionEnvironment executionEnvironment; + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get(), true, expectedRootDeviceIndex + 2); executionEnvironment.initializeMemoryManager(); - executionEnvironment.prepareRootDeviceEnvironments(expectedRootDeviceIndex + 2); auto rootDeviceEnvironment = new MockRootDeviceEnvironment(executionEnvironment); executionEnvironment.rootDeviceEnvironments[expectedRootDeviceIndex].reset(rootDeviceEnvironment); diff --git a/shared/test/unit_test/command_stream/tbx_command_stream_tests.cpp b/shared/test/unit_test/command_stream/tbx_command_stream_tests.cpp index d7ee3950a1..d65a558eb4 100644 --- a/shared/test/unit_test/command_stream/tbx_command_stream_tests.cpp +++ b/shared/test/unit_test/command_stream/tbx_command_stream_tests.cpp @@ -617,9 +617,8 @@ HWTEST_F(TbxCommandStreamTests, givenTbxCsrWhenCreatedWithAubDumpThenOpenIsCalle using SimulatedCsrTest = ::testing::Test; HWTEST_F(SimulatedCsrTest, givenTbxCsrTypeWhenCreateCommandStreamReceiverThenProperAubCenterIsInitalized) { uint32_t expectedRootDeviceIndex = 10; - MockExecutionEnvironment executionEnvironment; + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get(), true, expectedRootDeviceIndex + 2); executionEnvironment.initializeMemoryManager(); - executionEnvironment.prepareRootDeviceEnvironments(expectedRootDeviceIndex + 2); auto rootDeviceEnvironment = new MockRootDeviceEnvironment(executionEnvironment); executionEnvironment.rootDeviceEnvironments[expectedRootDeviceIndex].reset(rootDeviceEnvironment); diff --git a/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp index 9901dc0ecc..dbb99345d9 100644 --- a/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_residency_handler_prelim_tests.cpp @@ -103,7 +103,7 @@ struct DrmMemoryOperationsHandlerBindFixture : public ::testing::Test { executionEnvironment->memoryManager.release(); executionEnvironment->memoryManager.reset(memoryManagerBackup); for (auto &engineContainer : memoryManager->allRegisteredEngines) { - engineContainer.second.clear(); + engineContainer.clear(); } } @@ -231,7 +231,7 @@ struct DrmMemoryOperationsHandlerBindFixture2 : public ::testing::Test { executionEnvironment->memoryManager.release(); executionEnvironment->memoryManager.reset(memoryManagerBackup); for (auto &engineContainer : memoryManager->allRegisteredEngines) { - engineContainer.second.clear(); + engineContainer.clear(); } }