From ff494d5c50b6930864317900a56538278d9e1399 Mon Sep 17 00:00:00 2001 From: Maciej Bielski Date: Thu, 25 Apr 2024 17:29:57 +0000 Subject: [PATCH] feature: add tile-to-lmem-region map in MemoryInfo Arguments names refreshed to be more explanatory. Related-To: NEO-9754 Signed-off-by: Maciej Bielski --- .../source/os_interface/linux/CMakeLists.txt | 1 + .../source/os_interface/linux/memory_info.cpp | 26 +++++++++++-------- .../source/os_interface/linux/memory_info.h | 8 +++--- ..._info_populate_tile_to_lmem_region_map.cpp | 17 ++++++++++++ .../linux/xe/ioctl_helper_xe_tests.h | 2 +- 5 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 shared/source/os_interface/linux/memory_info_populate_tile_to_lmem_region_map.cpp diff --git a/shared/source/os_interface/linux/CMakeLists.txt b/shared/source/os_interface/linux/CMakeLists.txt index a4f5b91e9b..b8e2dfc754 100644 --- a/shared/source/os_interface/linux/CMakeLists.txt +++ b/shared/source/os_interface/linux/CMakeLists.txt @@ -60,6 +60,7 @@ set(NEO_CORE_OS_INTERFACE_LINUX ${CMAKE_CURRENT_SOURCE_DIR}/engine_info.cpp ${CMAKE_CURRENT_SOURCE_DIR}/memory_info.h ${CMAKE_CURRENT_SOURCE_DIR}/memory_info.cpp + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}memory_info_populate_tile_to_lmem_region_map.cpp ${CMAKE_CURRENT_SOURCE_DIR}/numa_library.h ${CMAKE_CURRENT_SOURCE_DIR}/numa_library.cpp ${CMAKE_CURRENT_SOURCE_DIR}/os_context_linux.cpp diff --git a/shared/source/os_interface/linux/memory_info.cpp b/shared/source/os_interface/linux/memory_info.cpp index 91078daafa..ed7ae75666 100644 --- a/shared/source/os_interface/linux/memory_info.cpp +++ b/shared/source/os_interface/linux/memory_info.cpp @@ -31,6 +31,8 @@ MemoryInfo::MemoryInfo(const RegionContainer ®ionInfo, const Drm &inputDrm) return (memoryRegionInfo.region.memoryClass == memoryClassDevice); }); + populateTileToLocalMemoryRegionIndexMap(); + memPolicySupported = false; if (debugManager.flags.EnableHostAllocationMemPolicy.get()) { memPolicySupported = Linux::NumaLibrary::init(); @@ -78,35 +80,37 @@ int MemoryInfo::createGemExt(const MemRegionsVec &memClassInstances, size_t allo } } -uint32_t MemoryInfo::getTileIndex(uint32_t memoryBank) const { +uint32_t MemoryInfo::getLocalMemoryRegionIndex(DeviceBitfield deviceBitfield) const { + UNRECOVERABLE_IF(deviceBitfield.count() != 1u); auto &hwInfo = *this->drm.getRootDeviceEnvironment().getHardwareInfo(); auto &gfxCoreHelper = this->drm.getRootDeviceEnvironment().getHelper(); auto &productHelper = this->drm.getRootDeviceEnvironment().getHelper(); + bool bankOverrideRequired{gfxCoreHelper.isBankOverrideRequired(hwInfo, productHelper)}; - auto tileIndex = Math::log2(memoryBank); - tileIndex = gfxCoreHelper.isBankOverrideRequired(hwInfo, productHelper) ? 0 : tileIndex; + uint32_t tileIndex{bankOverrideRequired ? 0u : Math::log2(deviceBitfield.to_ulong())}; if (debugManager.flags.OverrideDrmRegion.get() != -1) { tileIndex = debugManager.flags.OverrideDrmRegion.get(); } - return tileIndex; + UNRECOVERABLE_IF(tileIndex >= tileToLocalMemoryRegionIndexMap.size()); + return tileToLocalMemoryRegionIndexMap[tileIndex]; } -MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo) { +MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(DeviceBitfield deviceBitfield, const HardwareInfo &hwInfo) { auto &gfxCoreHelper = this->drm.getRootDeviceEnvironment().getHelper(); if (!gfxCoreHelper.getEnableLocalMemory(hwInfo)) { - memoryBank = 0; + deviceBitfield = 0u; } - return getMemoryRegion(memoryBank).region; + return getMemoryRegion(deviceBitfield).region; } -const MemoryRegion &MemoryInfo::getMemoryRegion(uint32_t memoryBank) const { - if (memoryBank == 0) { +const MemoryRegion &MemoryInfo::getMemoryRegion(DeviceBitfield deviceBitfield) const { + if (deviceBitfield.count() == 0) { return systemMemoryRegion; } - auto index = getTileIndex(memoryBank); + auto index = getLocalMemoryRegionIndex(deviceBitfield); UNRECOVERABLE_IF(index >= localMemoryRegions.size()); return localMemoryRegions[index]; @@ -134,7 +138,7 @@ int MemoryInfo::createGemExtWithSingleRegion(uint32_t memoryBanks, size_t allocS std::optional vmId; if (!this->drm.isPerContextVMRequired()) { if (memoryBanks != 0 && debugManager.flags.EnablePrivateBO.get()) { - auto tileIndex = getTileIndex(memoryBanks); + auto tileIndex = getLocalMemoryRegionIndex(memoryBanks); vmId = this->drm.getVirtualMemoryAddressSpace(tileIndex); } } diff --git a/shared/source/os_interface/linux/memory_info.h b/shared/source/os_interface/linux/memory_info.h index b330713861..11a38e5983 100644 --- a/shared/source/os_interface/linux/memory_info.h +++ b/shared/source/os_interface/linux/memory_info.h @@ -28,19 +28,20 @@ class MemoryInfo { MOCKABLE_VIRTUAL int createGemExt(const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint64_t patIndex, std::optional vmId, int32_t pairHandle, bool isChunked, uint32_t numOfChunks, bool isUSMHostAllocation); - MemoryClassInstance getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo); + MemoryClassInstance getMemoryRegionClassAndInstance(DeviceBitfield deviceBitfield, const HardwareInfo &hwInfo); MOCKABLE_VIRTUAL size_t getMemoryRegionSize(uint32_t memoryBank) const; - const MemoryRegion &getMemoryRegion(uint32_t memoryBank) const; + const MemoryRegion &getMemoryRegion(DeviceBitfield deviceBitfield) const; void printRegionSizes() const; - uint32_t getTileIndex(uint32_t memoryBank) const; + uint32_t getLocalMemoryRegionIndex(DeviceBitfield deviceBitfield) const; MOCKABLE_VIRTUAL int createGemExtWithSingleRegion(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, int32_t pairHandle, bool isUSMHostAllocation); MOCKABLE_VIRTUAL int createGemExtWithMultipleRegions(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, bool isUSMHostAllocation); MOCKABLE_VIRTUAL int createGemExtWithMultipleRegions(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, int32_t pairHandle, bool isChunked, uint32_t numOfChunks, bool isUSMHostAllocation); + void populateTileToLocalMemoryRegionIndexMap(); const RegionContainer &getLocalMemoryRegions() const { return localMemoryRegions; } const RegionContainer &getDrmRegionInfos() const { return drmQueryRegions; } @@ -54,6 +55,7 @@ class MemoryInfo { bool memPolicySupported; int memPolicyMode; RegionContainer localMemoryRegions; + std::array tileToLocalMemoryRegionIndexMap{}; }; } // namespace NEO diff --git a/shared/source/os_interface/linux/memory_info_populate_tile_to_lmem_region_map.cpp b/shared/source/os_interface/linux/memory_info_populate_tile_to_lmem_region_map.cpp new file mode 100644 index 0000000000..5c7c269bf1 --- /dev/null +++ b/shared/source/os_interface/linux/memory_info_populate_tile_to_lmem_region_map.cpp @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/os_interface/linux/memory_info.h" + +namespace NEO { + +void MemoryInfo::populateTileToLocalMemoryRegionIndexMap() { + for (uint32_t i{0u}; i < tileToLocalMemoryRegionIndexMap.size(); i++) { + tileToLocalMemoryRegionIndexMap[i] = i; + } +} +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h index adcd44eb34..9e5b15573a 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h @@ -342,7 +342,7 @@ class DrmMockXe : public DrmMockCustom { static_assert(sizeof(drm_xe_mem_region) == 11 * sizeof(uint64_t), ""); uint64_t queryMemUsage[34]{}; // 1 qword for num regions and 11 qwords per region static_assert(sizeof(drm_xe_gt) == 12 * sizeof(uint64_t), ""); - StackVec queryGtList{}; // 1 qword for num gts and 12 qwords per gt + StackVec queryGtList{}; // 1 qword for num gts and 12 qwords per gt alignas(64) std::vector queryTopology; static_assert(sizeof(drm_xe_query_engine_cycles) == 5 * sizeof(uint64_t), ""); uint64_t queryEngineCycles[5]{}; // 1 qword for eci and 4 qwords