mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
fix: use condition variables instead of busy waits in worker threads
Resolves: NEO-16085, GSD-11678, HSD-14025819208 Signed-off-by: Igor Venevtsev <igor.venevtsev@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
49293fcac6
commit
452475a0b9
@@ -13,7 +13,6 @@ namespace NEO {
|
||||
struct DirectSubmissionControllerMock : public DirectSubmissionController {
|
||||
using DirectSubmissionController::bcsTimeoutDivisor;
|
||||
using DirectSubmissionController::checkNewSubmissions;
|
||||
using DirectSubmissionController::condVarMutex;
|
||||
using DirectSubmissionController::directSubmissionControllingThread;
|
||||
using DirectSubmissionController::directSubmissions;
|
||||
using DirectSubmissionController::directSubmissionsMutex;
|
||||
@@ -26,6 +25,7 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
|
||||
using DirectSubmissionController::lowestThrottleSubmitted;
|
||||
using DirectSubmissionController::maxTimeout;
|
||||
using DirectSubmissionController::pagingFenceRequests;
|
||||
using DirectSubmissionController::syncData;
|
||||
using DirectSubmissionController::timeout;
|
||||
using DirectSubmissionController::timeoutDivisor;
|
||||
using DirectSubmissionController::timeSinceLastCheck;
|
||||
@@ -41,6 +41,21 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
|
||||
}
|
||||
}
|
||||
|
||||
bool hasNoWork() override {
|
||||
sleepOnNoWorkConditionVar.store(DirectSubmissionController::hasNoWork());
|
||||
return sleepOnNoWorkConditionVar.load();
|
||||
}
|
||||
|
||||
void handlePagingFenceRequests(std::unique_lock<std::mutex> &lock, bool checkForNewSubmissions) override {
|
||||
handlePagingFenceRequestsCalled.store(true);
|
||||
DirectSubmissionController::handlePagingFenceRequests(lock, checkForNewSubmissions);
|
||||
}
|
||||
|
||||
void checkNewSubmissions() override {
|
||||
checkNewSubmissionCalled.store(true);
|
||||
DirectSubmissionController::checkNewSubmissions();
|
||||
}
|
||||
|
||||
SteadyClock::time_point getCpuTimestamp() override {
|
||||
return cpuTimestamp;
|
||||
}
|
||||
@@ -58,6 +73,9 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
|
||||
std::atomic<bool> sleepReturnValue{false};
|
||||
std::atomic<TimeoutElapsedMode> timeoutElapsedReturnValue{TimeoutElapsedMode::notElapsed};
|
||||
std::atomic<bool> timeoutElapsedCallBase{false};
|
||||
std::atomic<bool> sleepOnNoWorkConditionVar{false};
|
||||
std::atomic<bool> checkNewSubmissionCalled{false};
|
||||
std::atomic<bool> handlePagingFenceRequestsCalled{false};
|
||||
bool callBaseSleepMethod = false;
|
||||
};
|
||||
} // namespace NEO
|
||||
} // namespace NEO
|
||||
|
||||
@@ -1033,7 +1033,7 @@ TEST(DirectSubmissionControllerWindowsTest, givenDirectSubmissionControllerWhenC
|
||||
|
||||
DirectSubmissionControllerMock controller;
|
||||
controller.callBaseSleepMethod = true;
|
||||
std::unique_lock<std::mutex> lock(controller.condVarMutex);
|
||||
std::unique_lock<std::mutex> lock(controller.syncData.mutex);
|
||||
controller.sleep(lock);
|
||||
EXPECT_TRUE(controller.sleepCalled);
|
||||
EXPECT_EQ(1u, SysCalls::timeBeginPeriodCalled);
|
||||
|
||||
Reference in New Issue
Block a user