From 473b8921325889f6325f5ce53c6a1dc5a9b15296 Mon Sep 17 00:00:00 2001 From: Michal Mrozek Date: Thu, 25 Jan 2024 14:25:15 +0000 Subject: [PATCH] fix: choose proper csr for low priority immediate command lists Resolves: NEO-10168 Signed-off-by: Michal Mrozek --- level_zero/core/source/device/device_imp.cpp | 9 +++++++- level_zero/core/source/device/device_imp.h | 3 ++- .../sources/cmdqueue/test_cmdqueue_1.cpp | 22 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index eb8268605f..ec137256ac 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -303,7 +303,7 @@ ze_result_t DeviceImp::createCommandQueue(const ze_command_queue_desc_t *desc, bool isCopyOnly = NEO::EngineHelper::isCopyOnlyEngineType( getEngineGroupTypeForOrdinal(commandQueueDesc.ordinal)); - if (commandQueueDesc.priority == ZE_COMMAND_QUEUE_PRIORITY_PRIORITY_LOW && !isCopyOnly) { + if (isSuitableForLowPriority(commandQueueDesc.priority, isCopyOnly)) { getCsrForLowPriority(&csr); } else { auto ret = getCsrForOrdinalAndIndexWithPriority(&csr, commandQueueDesc.ordinal, commandQueueDesc.index, commandQueueDesc.priority); @@ -1676,6 +1676,9 @@ ze_result_t DeviceImp::getCsrForOrdinalAndIndexWithPriority(NEO::CommandStreamRe } } } + } else if (isSuitableForLowPriority(priority, NEO::EngineHelper::isCopyOnlyEngineType( + getEngineGroupTypeForOrdinal(ordinal)))) { + return getCsrForLowPriority(csr); } return getCsrForOrdinalAndIndex(csr, ordinal, index); @@ -1700,6 +1703,10 @@ ze_result_t DeviceImp::getCsrForLowPriority(NEO::CommandStreamReceiver **csr) { return ZE_RESULT_ERROR_UNKNOWN; } +bool DeviceImp::isSuitableForLowPriority(ze_command_queue_priority_t priority, bool copyOnly) { + return (priority == ZE_COMMAND_QUEUE_PRIORITY_PRIORITY_LOW && !copyOnly); +} + DebugSession *DeviceImp::getDebugSession(const zet_debug_config_t &config) { return debugSession.get(); } diff --git a/level_zero/core/source/device/device_imp.h b/level_zero/core/source/device/device_imp.h index 89bb892e5f..43967112de 100644 --- a/level_zero/core/source/device/device_imp.h +++ b/level_zero/core/source/device/device_imp.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -114,6 +114,7 @@ struct DeviceImp : public Device, NEO::NonCopyableOrMovableClass { ze_result_t getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) override; ze_result_t getCsrForOrdinalAndIndexWithPriority(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index, ze_command_queue_priority_t priority) override; ze_result_t getCsrForLowPriority(NEO::CommandStreamReceiver **csr) override; + bool isSuitableForLowPriority(ze_command_queue_priority_t priority, bool copyOnly); NEO::GraphicsAllocation *obtainReusableAllocation(size_t requiredSize, NEO::AllocationType type) override; void storeReusableAllocation(NEO::GraphicsAllocation &alloc) override; NEO::Device *getActiveDevice() const; diff --git a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp index 4bd72ab2a3..2e60eee795 100644 --- a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp @@ -879,6 +879,28 @@ TEST_F(DeferredContextCreationDeviceCreateCommandQueueTest, givenLowPriorityEngi commandQueue->destroy(); } +using DeviceCreateCommandQueueTest = Test; +TEST_F(DeviceCreateCommandQueueTest, givenLowPriorityDescWhenCreateImmediateCommandListThenLowPriorityCsrIsAssigned) { + ze_command_queue_desc_t desc{}; + desc.ordinal = 0u; + desc.index = 0u; + desc.priority = ZE_COMMAND_QUEUE_PRIORITY_PRIORITY_LOW; + + ze_command_list_handle_t commandListHandle = {}; + + ze_result_t res = device->createCommandListImmediate(&desc, &commandListHandle); + + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + auto commandList = static_cast(L0::CommandList::fromHandle(commandListHandle)); + + EXPECT_NE(commandList, nullptr); + EXPECT_TRUE(commandList->getCsr()->getOsContext().isLowPriority()); + NEO::CommandStreamReceiver *csr = nullptr; + device->getCsrForLowPriority(&csr); + EXPECT_EQ(commandList->getCsr(), csr); + commandList->destroy(); +} + TEST_F(DeviceCreateCommandQueueTest, givenNormalPriorityDescWhenCreateCommandQueueIsCalledWithValidArgumentThenCsrIsAssignedWithOrdinalAndIndex) { ze_command_queue_desc_t desc{}; desc.ordinal = 0u;