feature: add support for ForceBcsEngineIndex flag

Related-To: NEO-8356

Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz 2023-11-22 16:10:41 +00:00 committed by Compute-Runtime-Automation
parent 24a32b97c8
commit d9b3fd0623
2 changed files with 59 additions and 0 deletions

View File

@ -1526,6 +1526,10 @@ ze_result_t DeviceImp::getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
}
if ((NEO::DebugManager.flags.ForceBcsEngineIndex.get() != -1) && NEO::EngineHelper::isCopyOnlyEngineType(getEngineGroupTypeForOrdinal(ordinal))) {
index = static_cast<uint32_t>(NEO::DebugManager.flags.ForceBcsEngineIndex.get());
}
if (ordinal < numEngineGroups) {
auto &engines = engineGroups[ordinal].engines;
if (index >= engines.size()) {

View File

@ -117,6 +117,61 @@ HWTEST2_F(CommandQueueCommandsXeHpc, givenCommandQueueWhenExecutingCommandListsF
commandQueue->destroy();
}
HWTEST2_F(CommandQueueCommandsXeHpc, givenDebugFlagSetWhenCreatingCommandQueueThenOverrideEngineIndex, IsXeHpcCore) {
DebugManagerStateRestore restore;
uint32_t newIndex = 2;
DebugManager.flags.ForceBcsEngineIndex.set(newIndex);
ze_result_t returnValue;
auto hwInfo = *NEO::defaultHwInfo;
hwInfo.featureTable.ftrBcsInfo = 0b111111111;
hwInfo.capabilityTable.blitterOperationsSupported = true;
auto testNeoDevice = NEO::MockDevice::createWithNewExecutionEnvironment<NEO::MockDevice>(&hwInfo);
auto testL0Device = std::unique_ptr<L0::Device>(L0::Device::create(driverHandle.get(), testNeoDevice, false, &returnValue));
auto &engineGroups = testNeoDevice->getRegularEngineGroups();
bool queueCreated = false;
bool hasMultiInstancedEngine = false;
for (uint32_t ordinal = 0; ordinal < engineGroups.size(); ordinal++) {
for (uint32_t index = 0; index < engineGroups[ordinal].engines.size(); index++) {
bool copyOrdinal = NEO::EngineHelper::isCopyOnlyEngineType(engineGroups[ordinal].engineGroupType);
if (engineGroups[ordinal].engines.size() > 1 && copyOrdinal) {
hasMultiInstancedEngine = true;
}
ze_command_queue_handle_t commandQueue = {};
ze_command_queue_desc_t desc = {};
desc.ordinal = ordinal;
desc.index = index;
ze_result_t res = context->createCommandQueue(testL0Device.get(), &desc, &commandQueue);
if (newIndex < engineGroups[ordinal].engines.size() || !copyOrdinal) {
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
EXPECT_NE(nullptr, commandQueue);
auto queue = whiteboxCast(L0::CommandQueue::fromHandle(commandQueue));
if (copyOrdinal) {
EXPECT_EQ(engineGroups[ordinal].engines[newIndex].commandStreamReceiver, queue->csr);
} else {
EXPECT_EQ(engineGroups[ordinal].engines[index].commandStreamReceiver, queue->csr);
}
queue->destroy();
queueCreated = true;
} else {
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, res);
EXPECT_EQ(nullptr, commandQueue);
}
}
}
EXPECT_EQ(hasMultiInstancedEngine, queueCreated);
}
HWTEST2_F(CommandQueueCommandsXeHpc, givenLinkedCopyEngineOrdinalWhenCreatingThenSetAsCopyOnly, IsXeHpcCore) {
ze_result_t returnValue;
auto hwInfo = *NEO::defaultHwInfo;