Skip to content

Commit 218205c

Browse files
jchodorCompute-Runtime-Automation
authored andcommitted
Add debug key for limitting hw threads
Change-Id: I5770b9b0ecdfb98d96265b76b8a6404cc4abfa4c
1 parent 5c029b4 commit 218205c

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

opencl/test/unit_test/test_files/igdrcl.config

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,5 @@ UseMaxSimdSizeToDeduceMaxWorkgroupSize = 0
150150
ReturnRawGpuTimestamps = 0
151151
ForcePerDssBackedBufferProgramming = 0
152152
DisableAtomicForPostSyncs = 0
153+
MaxHwThreadsPercent = 0
154+
MinHwThreadsUnoccupied = 0

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ DECLARE_DEBUG_VARIABLE(bool, DisableZeroCopyForUseHostPtr, false, "When active a
110110
DECLARE_DEBUG_VARIABLE(bool, DisableZeroCopyForBuffers, false, "When active all buffer allocations will not share memory with CPU.")
111111
DECLARE_DEBUG_VARIABLE(bool, DisableDcFlushInEpilogue, false, "Disable DC flush in epilogue")
112112
DECLARE_DEBUG_VARIABLE(int32_t, EnableHostPtrTracking, -1, "Enable host ptr tracking: -1 - default platform setting, 0 - disabled, 1 - enabled")
113+
DECLARE_DEBUG_VARIABLE(int32_t, MaxHwThreadsPercent, 0, "If not zero then maximum number of used HW threads is capped to max * MaxHwThreadsPercent / 100")
114+
DECLARE_DEBUG_VARIABLE(int32_t, MinHwThreadsUnoccupied, 0, "If not zero then maximum number of used HW threads is reduced by MinHwThreadsUnoccupied")
113115

114116
/*FEATURE FLAGS*/
115117
DECLARE_DEBUG_VARIABLE(bool, EnableNV12, true, "Enables NV12 extension")

shared/source/helpers/hw_helper.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,15 @@ bool HwHelper::cacheFlushAfterWalkerSupported(const HardwareInfo &hwInfo) {
4242

4343
uint32_t HwHelper::getMaxThreadsForVfe(const HardwareInfo &hwInfo) {
4444
uint32_t threadsPerEU = (hwInfo.gtSystemInfo.ThreadCount / hwInfo.gtSystemInfo.EUCount) + hwInfo.capabilityTable.extraQuantityThreadsPerEU;
45-
return hwInfo.gtSystemInfo.EUCount * threadsPerEU;
45+
auto maxHwThreadsCapable = hwInfo.gtSystemInfo.EUCount * threadsPerEU;
46+
auto maxHwThreadsReturned = maxHwThreadsCapable;
47+
if (DebugManager.flags.MaxHwThreadsPercent.get() != 0) {
48+
maxHwThreadsReturned = int(maxHwThreadsCapable * (DebugManager.flags.MaxHwThreadsPercent.get() / 100.0f));
49+
}
50+
if (DebugManager.flags.MinHwThreadsUnoccupied.get() != 0) {
51+
maxHwThreadsReturned = std::min(maxHwThreadsReturned, maxHwThreadsCapable - DebugManager.flags.MinHwThreadsUnoccupied.get());
52+
}
53+
return maxHwThreadsReturned;
4654
}
4755

4856
uint32_t HwHelper::getMaxThreadsForWorkgroup(const HardwareInfo &hwInfo, uint32_t maxNumEUsPerSubSlice) const {

shared/test/unit_test/preamble/preamble_tests.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/source/command_stream/preemption.h"
9+
#include "shared/source/debug_settings/debug_settings_manager.h"
910
#include "shared/source/gen_common/reg_configs/reg_configs_common.h"
1011
#include "shared/source/helpers/flat_batch_buffer_helper_hw.h"
1112
#include "shared/source/helpers/preamble.h"
@@ -191,6 +192,28 @@ HWTEST_F(PreambleTest, givenDefaultPreambleWhenGetThreadsMaxNumberIsCalledThenMa
191192
EXPECT_EQ(expected, value);
192193
}
193194

195+
HWTEST_F(PreambleTest, givenMaxHwThreadsPercentDebugVariableWhenGetThreadsMaxNumberIsCalledThenMaximumNumberOfThreadsIsCappedToRequestedNumber) {
196+
const HardwareInfo &hwInfo = *defaultHwInfo;
197+
uint32_t threadsPerEU = (hwInfo.gtSystemInfo.ThreadCount / hwInfo.gtSystemInfo.EUCount) + hwInfo.capabilityTable.extraQuantityThreadsPerEU;
198+
DebugManagerStateRestore debugManagerStateRestore;
199+
DebugManager.flags.MaxHwThreadsPercent.set(80);
200+
uint32_t value = HwHelper::getMaxThreadsForVfe(hwInfo);
201+
202+
uint32_t expected = int(hwInfo.gtSystemInfo.EUCount * threadsPerEU * 80 / 100.0f);
203+
EXPECT_EQ(expected, value);
204+
}
205+
206+
HWTEST_F(PreambleTest, givenMinHwThreadsUnoccupiedDebugVariableWhenGetThreadsMaxNumberIsCalledThenMaximumNumberOfThreadsIsCappedToMatchRequestedNumber) {
207+
const HardwareInfo &hwInfo = *defaultHwInfo;
208+
uint32_t threadsPerEU = (hwInfo.gtSystemInfo.ThreadCount / hwInfo.gtSystemInfo.EUCount) + hwInfo.capabilityTable.extraQuantityThreadsPerEU;
209+
DebugManagerStateRestore debugManagerStateRestore;
210+
DebugManager.flags.MinHwThreadsUnoccupied.set(2);
211+
uint32_t value = HwHelper::getMaxThreadsForVfe(hwInfo);
212+
213+
uint32_t expected = hwInfo.gtSystemInfo.EUCount * threadsPerEU - 2;
214+
EXPECT_EQ(expected, value);
215+
}
216+
194217
HWCMDTEST_F(IGFX_GEN8_CORE, PreambleTest, givenPreambleHelperWhenMediaVfeStateIsProgrammedThenOffsetToCommandIsReturned) {
195218
char buffer[64];
196219
MockGraphicsAllocation graphicsAllocation(buffer, sizeof(buffer));

0 commit comments

Comments
 (0)