Skip to content

Commit 85eb6d7

Browse files
[CP-1] Extend CLOS cache mechanism for DRM allocation
Signed-off-by: Daniel Chabrowski [email protected] Related-To: NEO-6591
1 parent b60d963 commit 85eb6d7

25 files changed

+532
-123
lines changed

opencl/test/unit_test/os_interface/linux/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ set(IGDRCL_SRCS_tests_os_interface_linux
1414
${CMAKE_CURRENT_SOURCE_DIR}/device_os_tests.cpp
1515
${CMAKE_CURRENT_SOURCE_DIR}/driver_info_tests.cpp
1616
${CMAKE_CURRENT_SOURCE_DIR}/drm_buffer_object_tests.cpp
17-
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_cache_info_tests.cpp
1817
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_mm_tests.cpp
1918
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_tests_1.cpp
2019
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_tests_2.cpp
@@ -54,6 +53,7 @@ if(NEO_ENABLE_i915_PRELIM_DETECTION)
5453
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
5554
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_prelim.cpp
5655
${CMAKE_CURRENT_SOURCE_DIR}/prelim_helper_func.cpp
56+
${CMAKE_CURRENT_SOURCE_DIR}/drm_cache_info_tests.cpp
5757
)
5858

5959
if(TESTS_DG1 AND "${BRANCH_TYPE}" STREQUAL "")
Lines changed: 161 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,174 @@
11
/*
2-
* Copyright (C) 2021 Intel Corporation
2+
* Copyright (C) 2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

8+
#include "shared/source/helpers/constants.h"
89
#include "shared/source/os_interface/linux/cache_info_impl.h"
10+
#include "shared/test/common/helpers/debug_manager_state_restore.h"
11+
#include "shared/test/common/helpers/default_hw_info.h"
12+
#include "shared/test/common/libult/linux/drm_query_mock.h"
13+
#include "shared/test/common/os_interface/linux/drm_mock_cache_info.h"
914

10-
#include "gtest/gtest.h"
15+
#include "opencl/test/unit_test/helpers/gtest_helpers.h"
16+
17+
#include "gmock/gmock.h"
1118

1219
using namespace NEO;
1320

14-
TEST(DrmCacheInfoTest, givenCacheInfoCreatedWhenCallingGetCacheRegionThenReturnZero) {
15-
CacheInfoImpl cacheInfo;
21+
TEST(DrmCacheInfoTest, givenCacheRegionsExistsWhenCallingSetUpCacheInfoThenCacheInfoIsCreatedAndReturnsMaxReservationCacheLimits) {
22+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
23+
executionEnvironment->prepareRootDeviceEnvironments(1);
24+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
25+
26+
auto &hwHelper = HwHelper::get(drm.context.hwInfo->platform.eRenderCoreFamily);
27+
28+
drm.setupCacheInfo(*defaultHwInfo.get());
29+
EXPECT_NE(nullptr, drm.getCacheInfo());
30+
auto cacheInfo = static_cast<CacheInfoImpl *>(drm.getCacheInfo());
31+
32+
if (hwHelper.getNumCacheRegions() == 0) {
33+
EXPECT_EQ(0u, cacheInfo->getMaxReservationCacheSize());
34+
EXPECT_EQ(0u, cacheInfo->getMaxReservationNumCacheRegions());
35+
EXPECT_EQ(0u, cacheInfo->getMaxReservationNumWays());
36+
} else {
37+
const GT_SYSTEM_INFO *gtSysInfo = &defaultHwInfo->gtSystemInfo;
38+
constexpr uint16_t maxNumWays = 32;
39+
constexpr uint16_t globalReservationLimit = 16;
40+
constexpr uint16_t clientReservationLimit = 8;
41+
constexpr uint16_t maxReservationNumWays = std::min(globalReservationLimit, clientReservationLimit);
42+
const size_t totalCacheSize = gtSysInfo->L3CacheSizeInKb * MemoryConstants::kiloByte;
43+
const size_t maxReservationCacheSize = (totalCacheSize * maxReservationNumWays) / maxNumWays;
44+
const size_t maxReservationNumCacheRegions = hwHelper.getNumCacheRegions() - 1;
45+
46+
EXPECT_EQ(maxReservationCacheSize, cacheInfo->getMaxReservationCacheSize());
47+
EXPECT_EQ(maxReservationNumCacheRegions, cacheInfo->getMaxReservationNumCacheRegions());
48+
EXPECT_EQ(maxReservationNumWays, cacheInfo->getMaxReservationNumWays());
49+
}
50+
}
51+
52+
TEST(DrmCacheInfoTest, givenDebugFlagSetWhenCallingSetUpCacheInfoThenCacheInfoIsCreatedWithoutValues) {
53+
DebugManagerStateRestore restorer;
54+
DebugManager.flags.ClosEnabled.set(0);
55+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
56+
executionEnvironment->prepareRootDeviceEnvironments(1);
57+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
58+
59+
drm.setupCacheInfo(*defaultHwInfo.get());
60+
EXPECT_NE(nullptr, drm.getCacheInfo());
61+
auto cacheInfo = static_cast<CacheInfoImpl *>(drm.getCacheInfo());
62+
63+
EXPECT_EQ(0u, cacheInfo->getMaxReservationCacheSize());
64+
EXPECT_EQ(0u, cacheInfo->getMaxReservationNumCacheRegions());
65+
EXPECT_EQ(0u, cacheInfo->getMaxReservationNumWays());
66+
}
67+
68+
TEST(DrmCacheInfoTest, givenCacheInfoCreatedWhenGetCacheRegionSucceedsToReserveCacheRegionThenReturnTrue) {
69+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
70+
executionEnvironment->prepareRootDeviceEnvironments(1);
71+
72+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
73+
CacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, 32);
74+
size_t cacheReservationSize = cacheInfo.getMaxReservationCacheSize();
75+
76+
EXPECT_TRUE(cacheInfo.getCacheRegion(cacheReservationSize, CacheRegion::Region1));
77+
78+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.freeCacheRegion(CacheRegion::Region1));
79+
}
80+
81+
TEST(DrmCacheInfoTest, givenCacheInfoCreatedWhenGetCacheRegionFailsToReserveCacheRegionThenReturnFalse) {
82+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
83+
executionEnvironment->prepareRootDeviceEnvironments(1);
84+
85+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
86+
CacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, 32);
87+
size_t cacheReservationSize = cacheInfo.getMaxReservationCacheSize();
88+
89+
drm.context.closIndex = 0xFFFF;
90+
EXPECT_FALSE(cacheInfo.getCacheRegion(cacheReservationSize, CacheRegion::Region1));
91+
92+
EXPECT_EQ(CacheRegion::None, cacheInfo.freeCacheRegion(CacheRegion::Region1));
93+
}
94+
95+
TEST(DrmCacheInfoTest, givenCacheInfoWithReservedCacheRegionWhenGetCacheRegionIsCalledForReservedCacheRegionThenReturnTrue) {
96+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
97+
executionEnvironment->prepareRootDeviceEnvironments(1);
98+
99+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
100+
CacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, 32);
101+
size_t cacheReservationSize = cacheInfo.getMaxReservationCacheSize();
102+
103+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.reserveCacheRegion(cacheReservationSize));
104+
105+
EXPECT_TRUE(cacheInfo.getCacheRegion(cacheReservationSize, CacheRegion::Region1));
106+
107+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.freeCacheRegion(CacheRegion::Region1));
108+
}
109+
110+
TEST(DrmCacheInfoTest, givenCacheInfoCreatedWhenGetCacheRegionIsCalledForReservableRegionsWithRegionSizesInverselyProportionalToNumCacheRegionsThenReturnTrue) {
111+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
112+
executionEnvironment->prepareRootDeviceEnvironments(1);
113+
114+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
115+
CacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, 32);
116+
size_t regionSize = cacheInfo.getMaxReservationCacheSize() / cacheInfo.getMaxReservationNumCacheRegions();
117+
118+
EXPECT_TRUE(cacheInfo.getCacheRegion(regionSize, CacheRegion::Region1));
119+
EXPECT_TRUE(cacheInfo.getCacheRegion(regionSize, CacheRegion::Region2));
120+
121+
EXPECT_EQ(CacheRegion::Region2, cacheInfo.freeCacheRegion(CacheRegion::Region2));
122+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.freeCacheRegion(CacheRegion::Region1));
123+
}
124+
125+
TEST(DrmCacheInfoTest, givenCacheInfoWhenSpecificNumCacheWaysIsRequestedThenReserveAppropriateCacheSize) {
126+
constexpr uint16_t maxNumCacheWays = 32;
127+
128+
DebugManagerStateRestore restorer;
129+
DebugManager.flags.ClosNumCacheWays.set(maxNumCacheWays / 2);
130+
131+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
132+
executionEnvironment->prepareRootDeviceEnvironments(1);
133+
134+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
135+
MockCacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, maxNumCacheWays);
136+
size_t maxReservationCacheSize = cacheInfo.getMaxReservationCacheSize();
137+
138+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.reserveCacheRegion(maxReservationCacheSize));
139+
EXPECT_TRUE(cacheInfo.isRegionReserved(CacheRegion::Region1, maxReservationCacheSize));
140+
141+
auto cacheRegion = cacheInfo.cacheRegionsReserved.begin();
142+
EXPECT_EQ(CacheRegion::Region1, cacheRegion->first);
143+
EXPECT_EQ(maxReservationCacheSize / 2, cacheRegion->second);
144+
145+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.freeCacheRegion(CacheRegion::Region1));
146+
}
147+
148+
TEST(DrmCacheInfoTest, givenCacheInfoWhenNumCacheWaysIsExceededThenDontReserveCacheRegion) {
149+
constexpr uint16_t maxNumCacheWays = 32;
150+
151+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
152+
executionEnvironment->prepareRootDeviceEnvironments(1);
153+
154+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
155+
MockCacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, maxNumCacheWays);
156+
size_t maxReservationCacheSize = cacheInfo.getMaxReservationCacheSize();
157+
158+
EXPECT_EQ(CacheRegion::Region1, cacheInfo.reserveCacheRegion(maxReservationCacheSize));
159+
EXPECT_TRUE(cacheInfo.isRegionReserved(CacheRegion::Region1, maxReservationCacheSize));
160+
161+
EXPECT_EQ(CacheRegion::None, cacheInfo.reserveCacheRegion(maxReservationCacheSize));
162+
EXPECT_FALSE(cacheInfo.isRegionReserved(CacheRegion::Region2, maxReservationCacheSize));
163+
}
164+
165+
TEST(DrmCacheInfoTest, givenCacheInfoCreatedWhenFreeCacheRegionIsCalledForNonReservedRegionThenItFails) {
166+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
167+
executionEnvironment->prepareRootDeviceEnvironments(1);
168+
169+
DrmQueryMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
170+
MockCacheInfoImpl cacheInfo(drm, 32 * MemoryConstants::kiloByte, 2, 32);
16171

17-
EXPECT_FALSE(cacheInfo.getCacheRegion(1024, CacheRegion::Default));
172+
cacheInfo.cacheRegionsReserved.insert({CacheRegion::Region1, MemoryConstants::kiloByte});
173+
EXPECT_EQ(CacheRegion::None, cacheInfo.freeCacheRegion(CacheRegion::Region1));
18174
}

opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "shared/test/common/mocks/mock_allocation_properties.h"
3737
#include "shared/test/common/mocks/mock_gfx_partition.h"
3838
#include "shared/test/common/mocks/mock_gmm.h"
39+
#include "shared/test/common/os_interface/linux/drm_mock_cache_info.h"
3940
#include "shared/test/common/test_macros/matchers.h"
4041
#include "shared/test/common/test_macros/test.h"
4142

@@ -46,7 +47,6 @@
4647
#include "opencl/test/unit_test/mocks/mock_cl_device.h"
4748
#include "opencl/test/unit_test/mocks/mock_context.h"
4849
#include "opencl/test/unit_test/mocks/mock_platform.h"
49-
#include "opencl/test/unit_test/os_interface/linux/drm_mock_cache_info.h"
5050

5151
#include "drm/i915_drm.h"
5252
#include "gmock/gmock.h"
@@ -4471,7 +4471,7 @@ TEST(DrmAllocationTest, givenDrmAllocationWhenCacheRegionIsNotSetThenReturnFalse
44714471
executionEnvironment->prepareRootDeviceEnvironments(1);
44724472

44734473
DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
4474-
drm.cacheInfo.reset(new MockCacheInfo());
4474+
drm.cacheInfo.reset(new MockCacheInfoImpl(drm, 32 * MemoryConstants::kiloByte, 2, 32));
44754475

44764476
MockDrmAllocation allocation(AllocationType::BUFFER, MemoryPool::LocalMemory);
44774477

@@ -4483,7 +4483,7 @@ TEST(DrmAllocationTest, givenDrmAllocationWhenCacheRegionIsSetSuccessfullyThenRe
44834483
executionEnvironment->prepareRootDeviceEnvironments(1);
44844484

44854485
DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
4486-
drm.cacheInfo.reset(new MockCacheInfo());
4486+
drm.cacheInfo.reset(new MockCacheInfoImpl(drm, 32 * MemoryConstants::kiloByte, 2, 32));
44874487

44884488
MockDrmAllocation allocation(AllocationType::BUFFER, MemoryPool::LocalMemory);
44894489

@@ -4495,7 +4495,7 @@ TEST(DrmAllocationTest, givenDrmAllocationWhenCacheRegionIsSetSuccessfullyThenSe
44954495
executionEnvironment->prepareRootDeviceEnvironments(1);
44964496

44974497
DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
4498-
drm.cacheInfo.reset(new MockCacheInfo());
4498+
drm.cacheInfo.reset(new MockCacheInfoImpl(drm, 32 * MemoryConstants::kiloByte, 2, 32));
44994499

45004500
MockBufferObject bo(&drm, 0, 0, 1);
45014501
MockDrmAllocation allocation(AllocationType::BUFFER, MemoryPool::LocalMemory);
@@ -4591,7 +4591,7 @@ TEST(DrmAllocationTest, givenBoWhenMarkingForCaptureThenBosAreMarked) {
45914591
TEST_F(DrmMemoryManagerTest, givenDrmAllocationWithHostPtrWhenItIsCreatedWithCacheRegionThenSetRegionInBufferObject) {
45924592
mock->ioctl_expected.total = -1;
45934593
auto drm = static_cast<DrmMockCustom *>(executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->getDriverModel()->as<Drm>());
4594-
drm->cacheInfo.reset(new MockCacheInfo());
4594+
drm->cacheInfo.reset(new MockCacheInfoImpl(*drm, 32 * MemoryConstants::kiloByte, 2, 32));
45954595

45964596
auto ptr = reinterpret_cast<void *>(0x1000);
45974597
auto size = MemoryConstants::pageSize;

opencl/test/unit_test/os_interface/linux/drm_mock_cache_info.h

Lines changed: 0 additions & 24 deletions
This file was deleted.

opencl/test/unit_test/test_files/igdrcl.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ ProgramGlobalFenceAsKernelInstructionInEUKernel = -1
359359
DoNotReportTile1BscWaActive = -1
360360
ForceTile0PlacementForTile1ResourcesWaActive = -1
361361
ClosEnabled = -1
362+
ClosNumCacheWays = -1
362363
EngineUsageHint = -1
363364
AddStatePrefetchCmdToMemoryPrefetchAPI = -1
364365
UpdateCrossThreadDataSize = 0

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ProgramGlobalFenceAsKernelInstructionInEUKernel,
174174
DECLARE_DEBUG_VARIABLE(int32_t, DoNotReportTile1BscWaActive, -1, "-1: default, 0: WA Disabled, 1: WA enabled")
175175
DECLARE_DEBUG_VARIABLE(int32_t, ForceTile0PlacementForTile1ResourcesWaActive, -1, "-1: default, 0: WA Disabled, 1: WA enabled")
176176
DECLARE_DEBUG_VARIABLE(int32_t, ClosEnabled, -1, "-1: default, 0: disabled, 1: enabled. Enable CLOS based cache reservation")
177+
DECLARE_DEBUG_VARIABLE(int32_t, ClosNumCacheWays, -1, "-1: default, >= 0 Number of cache ways to allocate within previously reserved CLOS regions (0-32)")
177178
DECLARE_DEBUG_VARIABLE(int32_t, EngineUsageHint, -1, "-1: default, >=0: engine usage value to use when creating command queue on user selected engine")
178179
DECLARE_DEBUG_VARIABLE(int32_t, ForceBcsEngineIndex, -1, "-1: default, >=0 Copy Engine index")
179180
DECLARE_DEBUG_VARIABLE(int32_t, Force2dImageAsArray, -1, "-1: default, 0: WA Disabled, 1: Forces surface state of 2dImage to array")

shared/source/os_interface/linux/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ set(NEO_CORE_OS_INTERFACE_LINUX
88
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
99
${CMAKE_CURRENT_SOURCE_DIR}/allocator_helper.h
1010
${CMAKE_CURRENT_SOURCE_DIR}/cache_info.h
11-
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}cache_info_impl.h
11+
${CMAKE_CURRENT_SOURCE_DIR}/cache_info_impl.h
12+
${CMAKE_CURRENT_SOURCE_DIR}/clos_cache.cpp
13+
${CMAKE_CURRENT_SOURCE_DIR}/clos_cache.h
1214
${CMAKE_CURRENT_SOURCE_DIR}/device_command_stream.inl
1315
${CMAKE_CURRENT_SOURCE_DIR}/device_time_drm.cpp
1416
${CMAKE_CURRENT_SOURCE_DIR}/device_time_drm.h

0 commit comments

Comments
 (0)