mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-18 22:08:53 +08:00
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:
committed by
Compute-Runtime-Automation
parent
80dc4fb43a
commit
0db7128503
@@ -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()};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user