performance: reduce ULLS controller timeout to 1ms

Currently scope limited to Windows only

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2025-01-28 13:18:46 +00:00
committed by Compute-Runtime-Automation
parent 80dc4fb43a
commit 0db7128503
8 changed files with 67 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2024 Intel Corporation
* Copyright (C) 2019-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -22,6 +22,8 @@
namespace NEO {
DirectSubmissionController::DirectSubmissionController() {
timeout = DirectSubmissionController::getDefaultTimeout();
maxTimeout = DirectSubmissionController::getDefaultTimeout();
if (debugManager.flags.DirectSubmissionControllerTimeout.get() != -1) {
timeout = std::chrono::microseconds{debugManager.flags.DirectSubmissionControllerTimeout.get()};
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2024 Intel Corporation
* Copyright (C) 2019-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -49,7 +49,6 @@ enum class TimeoutElapsedMode {
class DirectSubmissionController {
public:
static constexpr size_t defaultTimeout = 5'000;
static constexpr size_t timeToPollTagUpdateNS = 20'000;
DirectSubmissionController();
virtual ~DirectSubmissionController();
@@ -63,6 +62,7 @@ class DirectSubmissionController {
void stopThread();
static bool isSupported();
static std::chrono::microseconds getDefaultTimeout();
void enqueueWaitForPagingFence(CommandStreamReceiver *csr, uint64_t pagingFenceValue);
void drainPagingFenceQueue();
@@ -97,7 +97,6 @@ class DirectSubmissionController {
bool isDirectSubmissionIdle(CommandStreamReceiver *csr, std::unique_lock<std::recursive_mutex> &csrLock);
MOCKABLE_VIRTUAL bool sleep(std::unique_lock<std::mutex> &lock);
MOCKABLE_VIRTUAL SteadyClock::time_point getCpuTimestamp();
void adjustTimeout(CommandStreamReceiver *csr);
void recalculateTimeout();
void applyTimeoutForAcLineStatusAndThrottle(bool acLineConnected);
@@ -120,8 +119,8 @@ class DirectSubmissionController {
SteadyClock::time_point timeSinceLastCheck{};
SteadyClock::time_point lastTerminateCpuTimestamp{};
HighResolutionClock::time_point lastHangCheckTime{};
std::chrono::microseconds maxTimeout{defaultTimeout};
std::chrono::microseconds timeout{defaultTimeout};
std::chrono::microseconds maxTimeout;
std::chrono::microseconds timeout;
int32_t timeoutDivisor = 1;
int32_t bcsTimeoutDivisor = 1;
std::unordered_map<size_t, TimeoutParams> timeoutParamsMap;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -13,4 +13,9 @@ namespace NEO {
bool DirectSubmissionController::sleep(std::unique_lock<std::mutex> &lock) {
return NEO::waitOnConditionWithPredicate(condVar, lock, getSleepValue(), [&] { return !pagingFenceRequests.empty(); });
}
std::chrono::microseconds DirectSubmissionController::getDefaultTimeout() {
return std::chrono::microseconds{5'000};
}
} // namespace NEO

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -17,4 +17,9 @@ bool DirectSubmissionController::sleep(std::unique_lock<std::mutex> &lock) {
SysCalls::timeEndPeriod(1u);
return returnValue;
}
std::chrono::microseconds DirectSubmissionController::getDefaultTimeout() {
return std::chrono::microseconds{1'000};
}
} // namespace NEO

View File

@@ -389,8 +389,8 @@ bool ProductHelperHw<gfxProduct>::isAdjustDirectSubmissionTimeoutOnThrottleAndAc
template <PRODUCT_FAMILY gfxProduct>
TimeoutParams ProductHelperHw<gfxProduct>::getDirectSubmissionControllerTimeoutParams(bool acLineConnected, QueueThrottle queueThrottle) const {
TimeoutParams params{};
params.maxTimeout = std::chrono::microseconds{DirectSubmissionController::defaultTimeout};
params.timeout = std::chrono::microseconds{DirectSubmissionController::defaultTimeout};
params.maxTimeout = DirectSubmissionController::getDefaultTimeout();
params.timeout = DirectSubmissionController::getDefaultTimeout();
params.timeoutDivisor = 1;
params.directSubmissionEnabled = true;
return params;

View File

@@ -40,5 +40,10 @@ bool ProductHelperHw<gfxProduct>::isDisableScratchPagesSupported() const {
return true;
}
template <>
bool ProductHelperHw<gfxProduct>::isAdjustDirectSubmissionTimeoutOnThrottleAndAcLineStatusEnabled() const {
return true;
}
template class ProductHelperHw<gfxProduct>;
} // namespace NEO

View File

@@ -45,11 +45,6 @@ bool ProductHelperHw<gfxProduct>::isCachingOnCpuAvailable() const {
return false;
}
template <>
bool ProductHelperHw<gfxProduct>::isAdjustDirectSubmissionTimeoutOnThrottleAndAcLineStatusEnabled() const {
return true;
}
template <>
TimeoutParams ProductHelperHw<gfxProduct>::getDirectSubmissionControllerTimeoutParams(bool acLineConnected, QueueThrottle queueThrottle) const {
TimeoutParams params{};
@@ -64,8 +59,8 @@ TimeoutParams ProductHelperHw<gfxProduct>::getDirectSubmissionControllerTimeoutP
params.timeout = std::chrono::microseconds{4'500};
break;
case NEO::HIGH:
params.maxTimeout = std::chrono::microseconds{DirectSubmissionController::defaultTimeout};
params.timeout = std::chrono::microseconds{DirectSubmissionController::defaultTimeout};
params.maxTimeout = DirectSubmissionController::getDefaultTimeout();
params.timeout = DirectSubmissionController::getDefaultTimeout();
break;
default:
break;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2024 Intel Corporation
* Copyright (C) 2019-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -193,12 +193,12 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerAndDivisorD
EXPECT_EQ(controller.directSubmissions[&csr].taskCount, 1u);
auto previousTimestamp = controller.lastTerminateCpuTimestamp;
controller.cpuTimestamp += std::chrono::microseconds(5'000);
controller.cpuTimestamp += DirectSubmissionController::getDefaultTimeout();
controller.checkNewSubmissions();
EXPECT_EQ(std::chrono::duration_cast<std::chrono::microseconds>(controller.lastTerminateCpuTimestamp - previousTimestamp).count(), 5'000);
EXPECT_EQ(std::chrono::duration_cast<std::chrono::microseconds>(controller.lastTerminateCpuTimestamp - previousTimestamp).count(), DirectSubmissionController::getDefaultTimeout().count());
EXPECT_TRUE(controller.directSubmissions[&csr].isStopped);
EXPECT_EQ(controller.directSubmissions[&csr].taskCount, 1u);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), DirectSubmissionController::getDefaultTimeout().count());
EXPECT_EQ(controller.maxTimeout.count(), 200'000);
}
{
@@ -440,23 +440,23 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegiste
csr4.setupContext(*osContext4.get());
DirectSubmissionControllerMock controller;
EXPECT_EQ(controller.timeout.count(), 5'000);
auto timeout = DirectSubmissionController::getDefaultTimeout().count();
EXPECT_EQ(controller.timeout.count(), timeout);
controller.registerDirectSubmission(&csr);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), timeout);
controller.registerDirectSubmission(&csr3);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), timeout);
controller.registerDirectSubmission(&csr1);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), timeout);
controller.registerDirectSubmission(&csr2);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), timeout);
controller.registerDirectSubmission(&csr4);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), timeout);
controller.unregisterDirectSubmission(&csr);
controller.unregisterDirectSubmission(&csr1);
@@ -472,8 +472,9 @@ TEST(DirectSubmissionControllerTests, givenPowerSavingUintWhenCallingGetThrottle
}
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegisterCsrsFromDifferentSubdevicesThenTimeoutIsAdjusted) {
static constexpr size_t divisor = 4;
DebugManagerStateRestore restorer;
debugManager.flags.DirectSubmissionControllerDivisor.set(4);
debugManager.flags.DirectSubmissionControllerDivisor.set(divisor);
MockExecutionEnvironment executionEnvironment;
executionEnvironment.prepareRootDeviceEnvironments(1);
executionEnvironment.initializeMemoryManager();
@@ -547,38 +548,41 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegiste
csr10.setupContext(*osContext10.get());
DirectSubmissionControllerMock controller;
EXPECT_EQ(controller.timeout.count(), 5'000);
auto defaultTimeout = DirectSubmissionController::getDefaultTimeout().count();
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr5);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr1);
EXPECT_EQ(controller.timeout.count(), 1'250);
int64_t newTimeout = defaultTimeout / divisor;
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr2);
EXPECT_EQ(controller.timeout.count(), 312);
newTimeout /= divisor;
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr4);
EXPECT_EQ(controller.timeout.count(), 312);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr6);
EXPECT_EQ(controller.timeout.count(), 312);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr7);
EXPECT_EQ(controller.timeout.count(), 312);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr9);
EXPECT_EQ(controller.timeout.count(), 312);
EXPECT_EQ(controller.timeout.count(), newTimeout);
newTimeout /= divisor;
controller.registerDirectSubmission(&csr8);
EXPECT_EQ(controller.timeout.count(), 78);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr10);
EXPECT_EQ(controller.timeout.count(), 78);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.unregisterDirectSubmission(&csr);
controller.unregisterDirectSubmission(&csr1);
@@ -588,8 +592,9 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegiste
}
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerDirectSubmissionControllerDivisorSetWhenRegisterCsrsThenTimeoutIsAdjusted) {
static constexpr size_t divisor = 5;
DebugManagerStateRestore restorer;
debugManager.flags.DirectSubmissionControllerDivisor.set(5);
debugManager.flags.DirectSubmissionControllerDivisor.set(divisor);
MockExecutionEnvironment executionEnvironment;
executionEnvironment.prepareRootDeviceEnvironments(1);
@@ -627,23 +632,25 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerDirectSubmi
csr4.setupContext(*osContext4.get());
DirectSubmissionControllerMock controller;
EXPECT_EQ(controller.timeout.count(), 5'000);
auto defaultTimeout = DirectSubmissionController::getDefaultTimeout().count();
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr3);
EXPECT_EQ(controller.timeout.count(), 5'000);
EXPECT_EQ(controller.timeout.count(), defaultTimeout);
controller.registerDirectSubmission(&csr1);
EXPECT_EQ(controller.timeout.count(), 1'000);
int64_t newTimeout = defaultTimeout / divisor;
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr2);
EXPECT_EQ(controller.timeout.count(), 200);
newTimeout /= divisor;
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.registerDirectSubmission(&csr4);
EXPECT_EQ(controller.timeout.count(), 200);
EXPECT_EQ(controller.timeout.count(), newTimeout);
controller.unregisterDirectSubmission(&csr);
controller.unregisterDirectSubmission(&csr1);