fix: correct maxOsContextCount with multiple subdevices and context group

Related-To: NEO-12257

Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2024-08-07 15:42:42 +00:00
committed by Compute-Runtime-Automation
parent bca8478bd4
commit 4c172a406d
3 changed files with 81 additions and 11 deletions

View File

@@ -3296,10 +3296,32 @@ HWTEST_F(EventTests, GivenEventWhenHostSynchronizeCalledThenExpectDownloadEventA
event->destroy();
}
HWTEST_F(EventTests, givenSecondaryCsrWhenDownloadingAllocationThenUseCorrectCsr) {
DebugManagerStateRestore restore;
debugManager.flags.ContextGroupSize.set(2);
struct EventContextGroupFixture : public EventFixture<1, 0> {
using BaseClass = EventFixture<1, 0>;
void setUp() {
HardwareInfo hwInfo = *defaultHwInfo;
if (hwInfo.capabilityTable.defaultEngineType != aub_stream::EngineType::ENGINE_CCS) {
skipped = true;
GTEST_SKIP();
}
debugManager.flags.ContextGroupSize.set(2);
BaseClass::setUp();
}
void tearDown() {
if (!skipped) {
BaseClass::tearDown();
}
}
DebugManagerStateRestore restore;
bool skipped = false;
};
using EventContextGroupTests = Test<EventContextGroupFixture>;
HWTEST_F(EventContextGroupTests, givenSecondaryCsrWhenDownloadingAllocationThenUseCorrectCsr) {
neoDevice->getExecutionEnvironment()->calculateMaxOsContextCount();
neoDevice->getUltCommandStreamReceiver<FamilyType>().commandStreamReceiverType = CommandStreamReceiverType::tbx;
@@ -3318,9 +3340,10 @@ HWTEST_F(EventTests, givenSecondaryCsrWhenDownloadingAllocationThenUseCorrectCsr
*eventAddress = Event::STATE_INITIAL;
auto ultCsr = new UltCommandStreamReceiver<FamilyType>(*neoDevice->getExecutionEnvironment(), 0, 1);
neoDevice->secondaryCsrs.push_back(std::unique_ptr<UltCommandStreamReceiver<FamilyType>>(ultCsr));
OsContext osContext(0, static_cast<uint32_t>(neoDevice->getAllEngines().size() + 1), EngineDescriptorHelper::getDefaultDescriptor());
OsContext osContext(0, static_cast<uint32_t>(neoDevice->getAllEngines().size()), EngineDescriptorHelper::getDefaultDescriptor());
ultCsr->setupContext(osContext);

View File

@@ -108,13 +108,14 @@ void ExecutionEnvironment::calculateMaxOsContextCount() {
}
}
uint32_t numSecondaryContexts = 0;
if (gfxCoreHelper.getContextGroupContextsCount() > 0) {
MemoryManager::maxOsContextCount += numRegularEngines * gfxCoreHelper.getContextGroupContextsCount();
MemoryManager::maxOsContextCount += numHpEngines * gfxCoreHelper.getContextGroupContextsCount();
MemoryManager::maxOsContextCount += static_cast<uint32_t>(hwInfo->featureTable.ftrBcsInfo.count()); // LP contexts
numSecondaryContexts += numRegularEngines * gfxCoreHelper.getContextGroupContextsCount();
numSecondaryContexts += numHpEngines * gfxCoreHelper.getContextGroupContextsCount();
osContextCount -= (numRegularEngines + numHpEngines);
}
MemoryManager::maxOsContextCount += osContextCount * subDevicesCount + hasRootCsr;
MemoryManager::maxOsContextCount += (numSecondaryContexts + osContextCount) * subDevicesCount + hasRootCsr;
if (ccsCount > 1 && debugManager.flags.EngineInstancedSubDevices.get()) {
MemoryManager::maxOsContextCount += ccsCount * subDevicesCount;

View File

@@ -5548,10 +5548,56 @@ HWTEST_F(CommandStreamReceiverContextGroupTest, givenContextGroupWhenCreatingEng
}
}
auto osContextCount = static_cast<uint32_t>(engineInstances.size()) +
auto nonGroupCount = static_cast<uint32_t>(engineInstances.size()) - numRegularEngines - numHpEngines;
auto osContextCount = nonGroupCount +
(numRegularEngines * device->getGfxCoreHelper().getContextGroupContextsCount()) +
(numHpEngines * device->getGfxCoreHelper().getContextGroupContextsCount()) +
static_cast<uint32_t>(hwInfo.featureTable.ftrBcsInfo.count());
(numHpEngines * device->getGfxCoreHelper().getContextGroupContextsCount());
EXPECT_EQ(osContextCount, MemoryManager::maxOsContextCount);
}
HWTEST_F(CommandStreamReceiverContextGroupTest, givenMultipleSubDevicesAndContextGroupWhenCreatingEnginesThenSetCorrectMaxOsContextCount) {
HardwareInfo hwInfo = *defaultHwInfo;
if (hwInfo.capabilityTable.defaultEngineType != aub_stream::EngineType::ENGINE_CCS) {
GTEST_SKIP();
}
DebugManagerStateRestore dbgRestorer;
debugManager.flags.ContextGroupSize.set(8);
debugManager.flags.CreateMultipleSubDevices.set(2);
hwInfo.featureTable.flags.ftrCCSNode = true;
hwInfo.featureTable.ftrBcsInfo = 0b110;
hwInfo.capabilityTable.blitterOperationsSupported = true;
hwInfo.capabilityTable.defaultEngineType = aub_stream::ENGINE_CCS;
hwInfo.gtSystemInfo.CCSInfo.NumberOfCCSEnabled = 1;
hwInfo.capabilityTable.defaultPreemptionMode = PreemptionMode::MidThread;
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(&hwInfo));
device->getExecutionEnvironment()->calculateMaxOsContextCount();
auto &engineInstances = device->getGfxCoreHelper().getGpgpuEngineInstances(*device->getExecutionEnvironment()->rootDeviceEnvironments[0]);
uint32_t numRegularEngines = 0;
uint32_t numHpEngines = 0;
for (const auto &engine : engineInstances) {
if (engine.second == EngineUsage::regular) {
numRegularEngines++;
}
if (engine.second == EngineUsage::highPriority) {
numHpEngines++;
}
}
auto nonGroupCount = static_cast<uint32_t>(engineInstances.size()) - numRegularEngines - numHpEngines;
auto osContextCount = nonGroupCount +
(numRegularEngines * device->getGfxCoreHelper().getContextGroupContextsCount()) +
(numHpEngines * device->getGfxCoreHelper().getContextGroupContextsCount());
osContextCount = osContextCount * 2 + 1;
EXPECT_EQ(osContextCount, MemoryManager::maxOsContextCount);
}