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 24a7a9f9cd..ba1f541d74 100644 --- a/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp +++ b/opencl/test/unit_test/memory_manager/memory_manager_tests.cpp @@ -2671,6 +2671,10 @@ TEST_F(MemoryManagerMultiRootDeviceTests, WhenAllocatingGlobalSurfaceThenItHasCo } } +TEST_F(MemoryManagerMultiRootDeviceTests, GivenMultipleRootDevicesWhenMemoryManagerInitializedThenIsaLocalMemoryPlacementIsCheckedForEveryRootDevice) { + EXPECT_EQ(3u, mockMemoryManager->isaInLocalMemory.size()); +} + HWTEST_F(MemoryAllocatorTest, givenMemoryManagerWhen64BitAndHostPtrTrackingDisabledThenNonSvmHostPtrUsageIsSet) { DebugManagerStateRestore dbgRestore; diff --git a/opencl/test/unit_test/mocks/mock_memory_manager.h b/opencl/test/unit_test/mocks/mock_memory_manager.h index bbd91dbf27..c2dd948264 100644 --- a/opencl/test/unit_test/mocks/mock_memory_manager.h +++ b/opencl/test/unit_test/mocks/mock_memory_manager.h @@ -50,6 +50,7 @@ class MockMemoryManager : public MemoryManagerCreate { using OsAgnosticMemoryManager::allocateGraphicsMemoryForImageFromHostPtr; using MemoryManagerCreate::MemoryManagerCreate; using MemoryManager::enable64kbpages; + using MemoryManager::isaInLocalMemory; using MemoryManager::isAllocationTypeToCapture; using MemoryManager::isCopyRequired; using MemoryManager::localMemorySupported; diff --git a/shared/source/memory_manager/memory_manager.cpp b/shared/source/memory_manager/memory_manager.cpp index 41c8da9c39..7231a520d6 100644 --- a/shared/source/memory_manager/memory_manager.cpp +++ b/shared/source/memory_manager/memory_manager.cpp @@ -41,9 +41,13 @@ MemoryManager::MemoryManager(ExecutionEnvironment &executionEnvironment) : execu multiContextResourceDestructor(std::make_unique()) { bool anyLocalMemorySupported = false; + const auto rootEnvCount = executionEnvironment.rootDeviceEnvironments.size(); - defaultEngineIndex.resize(executionEnvironment.rootDeviceEnvironments.size()); - for (uint32_t rootDeviceIndex = 0; rootDeviceIndex < executionEnvironment.rootDeviceEnvironments.size(); ++rootDeviceIndex) { + defaultEngineIndex.resize(rootEnvCount); + checkIsaPlacementOnceFlags = std::make_unique(rootEnvCount); + isaInLocalMemory.resize(rootEnvCount); + + for (uint32_t rootDeviceIndex = 0; rootDeviceIndex < rootEnvCount; ++rootDeviceIndex) { auto hwInfo = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->getHardwareInfo(); localMemoryUsageBankSelector.emplace_back(new LocalMemoryUsageBankSelector(HwHelper::getSubDevicesCount(hwInfo))); this->localMemorySupported.push_back(HwHelper::get(hwInfo->platform.eRenderCoreFamily).getEnableLocalMemory(*hwInfo)); @@ -785,14 +789,14 @@ bool MemoryManager::isAllocationTypeToCapture(GraphicsAllocation::AllocationType } bool MemoryManager::isLocalMemoryUsedForIsa(uint32_t rootDeviceIndex) { - std::call_once(checkIsaPlacementOnce, [&] { + std::call_once(checkIsaPlacementOnceFlags[rootDeviceIndex], [&] { AllocationProperties properties = {rootDeviceIndex, 0x1000, GraphicsAllocation::AllocationType::KERNEL_ISA, 1}; AllocationData data; getAllocationData(data, properties, nullptr, StorageInfo()); - isaInLocalMemory = !data.flags.useSystemMemory; + isaInLocalMemory[rootDeviceIndex] = !data.flags.useSystemMemory; }); - return isaInLocalMemory; + return isaInLocalMemory[rootDeviceIndex]; } bool MemoryTransferHelper::transferMemoryToAllocation(bool useBlitter, const Device &device, GraphicsAllocation *dstAllocation, size_t dstOffset, const void *srcMemory, size_t srcSize) { diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index 64890c6791..8ca99ea7fd 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -265,8 +265,8 @@ class MemoryManager { OSMemory::ReservedCpuAddressRange reservedCpuAddressRange; HeapAssigner heapAssigner; AlignmentSelector alignmentSelector = {}; - std::once_flag checkIsaPlacementOnce; - bool isaInLocalMemory = false; + std::unique_ptr checkIsaPlacementOnceFlags; + std::vector isaInLocalMemory; }; std::unique_ptr createDeferredDeleter();