mirror of
https://github.com/intel/compute-runtime.git
synced 2025-11-15 10:14:56 +08:00
Track ccs count per subdevice in direct submission controller
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
52e604a0d4
commit
9761098733
@@ -99,8 +99,14 @@ void DirectSubmissionController::sleep() {
|
||||
|
||||
void DirectSubmissionController::adjustTimeout(CommandStreamReceiver *csr) {
|
||||
if (EngineHelpers::isCcs(csr->getOsContext().getEngineType())) {
|
||||
this->ccsCount++;
|
||||
if (this->ccsCount > 1u) {
|
||||
for (size_t subDeviceIndex = 0u; subDeviceIndex < csr->getOsContext().getDeviceBitfield().size(); ++subDeviceIndex) {
|
||||
if (csr->getOsContext().getDeviceBitfield().test(subDeviceIndex)) {
|
||||
++this->ccsCount[subDeviceIndex];
|
||||
}
|
||||
}
|
||||
auto curentMaxCcsCount = std::max_element(this->ccsCount.begin(), this->ccsCount.end());
|
||||
if (*curentMaxCcsCount > this->maxCcsCount) {
|
||||
this->maxCcsCount = *curentMaxCcsCount;
|
||||
this->timeout /= this->timeoutDivisor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "shared/source/helpers/common_types.h"
|
||||
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
@@ -41,7 +44,8 @@ class DirectSubmissionController {
|
||||
|
||||
void adjustTimeout(CommandStreamReceiver *csr);
|
||||
|
||||
uint32_t ccsCount = 0u;
|
||||
uint32_t maxCcsCount = 1u;
|
||||
std::array<uint32_t, DeviceBitfield().size()> ccsCount = {};
|
||||
std::unordered_map<CommandStreamReceiver *, DirectSubmissionState> directSubmissions;
|
||||
std::mutex directSubmissionsMutex;
|
||||
|
||||
|
||||
@@ -198,6 +198,123 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegiste
|
||||
controller.unregisterDirectSubmission(&csr4);
|
||||
}
|
||||
|
||||
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegisterCsrsFromDifferentSubdevicesThenTimeoutIsAdjusted) {
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
executionEnvironment.prepareRootDeviceEnvironments(1);
|
||||
executionEnvironment.initializeMemoryManager();
|
||||
DeviceBitfield deviceBitfield(1);
|
||||
DeviceBitfield deviceBitfield1(0b10);
|
||||
|
||||
MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield)));
|
||||
csr.setupContext(*osContext.get());
|
||||
|
||||
MockCommandStreamReceiver csr1(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext1(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield)));
|
||||
csr1.setupContext(*osContext1.get());
|
||||
|
||||
MockCommandStreamReceiver csr2(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext2(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield)));
|
||||
csr2.setupContext(*osContext2.get());
|
||||
|
||||
MockCommandStreamReceiver csr3(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext3(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield)));
|
||||
csr3.setupContext(*osContext3.get());
|
||||
|
||||
MockCommandStreamReceiver csr4(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext4(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield)));
|
||||
csr4.setupContext(*osContext4.get());
|
||||
|
||||
MockCommandStreamReceiver csr5(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext5(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr5.setupContext(*osContext5.get());
|
||||
|
||||
MockCommandStreamReceiver csr6(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext6(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr6.setupContext(*osContext6.get());
|
||||
|
||||
MockCommandStreamReceiver csr7(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext7(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr7.setupContext(*osContext7.get());
|
||||
|
||||
MockCommandStreamReceiver csr8(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext8(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr8.setupContext(*osContext8.get());
|
||||
|
||||
MockCommandStreamReceiver csr9(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext9(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr9.setupContext(*osContext9.get());
|
||||
|
||||
MockCommandStreamReceiver csr10(executionEnvironment, 0, deviceBitfield);
|
||||
std::unique_ptr<OsContext> osContext10(OsContext::create(nullptr, 0,
|
||||
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
|
||||
PreemptionMode::ThreadGroup, deviceBitfield1)));
|
||||
csr10.setupContext(*osContext10.get());
|
||||
|
||||
DirectSubmissionControllerMock controller;
|
||||
controller.keepControlling.store(false);
|
||||
controller.directSubmissionControllingThread->join();
|
||||
controller.directSubmissionControllingThread.reset();
|
||||
|
||||
EXPECT_EQ(controller.timeout, 5000);
|
||||
|
||||
controller.registerDirectSubmission(&csr);
|
||||
EXPECT_EQ(controller.timeout, 5000);
|
||||
|
||||
controller.registerDirectSubmission(&csr5);
|
||||
EXPECT_EQ(controller.timeout, 5000);
|
||||
|
||||
controller.registerDirectSubmission(&csr1);
|
||||
EXPECT_EQ(controller.timeout, 1250);
|
||||
|
||||
controller.registerDirectSubmission(&csr2);
|
||||
EXPECT_EQ(controller.timeout, 312);
|
||||
|
||||
controller.registerDirectSubmission(&csr4);
|
||||
EXPECT_EQ(controller.timeout, 312);
|
||||
|
||||
controller.registerDirectSubmission(&csr6);
|
||||
EXPECT_EQ(controller.timeout, 312);
|
||||
|
||||
controller.registerDirectSubmission(&csr7);
|
||||
EXPECT_EQ(controller.timeout, 312);
|
||||
|
||||
controller.registerDirectSubmission(&csr9);
|
||||
EXPECT_EQ(controller.timeout, 312);
|
||||
|
||||
controller.registerDirectSubmission(&csr8);
|
||||
EXPECT_EQ(controller.timeout, 78);
|
||||
|
||||
controller.registerDirectSubmission(&csr10);
|
||||
EXPECT_EQ(controller.timeout, 78);
|
||||
|
||||
controller.unregisterDirectSubmission(&csr);
|
||||
controller.unregisterDirectSubmission(&csr1);
|
||||
controller.unregisterDirectSubmission(&csr2);
|
||||
controller.unregisterDirectSubmission(&csr3);
|
||||
controller.unregisterDirectSubmission(&csr4);
|
||||
}
|
||||
|
||||
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerDirectSubmissionControllerDivisorSetWhenRegisterCsrsThenTimeoutIsAdjusted) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.DirectSubmissionControllerDivisor.set(5);
|
||||
|
||||
Reference in New Issue
Block a user