From 2e9bb2670869e1372701447e3cbdface5749b3df Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Wed, 12 Jun 2024 09:25:42 +0000 Subject: [PATCH] feature: enable copy offload api Related-To: NEO-11376 Signed-off-by: Bartosz Dunajski --- .../core/source/cmdlist/cmdlist_imp.cpp | 2 +- level_zero/core/source/cmdqueue/cmdqueue.cpp | 2 ++ level_zero/core/source/cmdqueue/cmdqueue.h | 1 + .../sources/cmdlist/test_in_order_cmdlist.cpp | 36 +++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_imp.cpp b/level_zero/core/source/cmdlist/cmdlist_imp.cpp index 8f39d45484..1941b497b4 100644 --- a/level_zero/core/source/cmdlist/cmdlist_imp.cpp +++ b/level_zero/core/source/cmdlist/cmdlist_imp.cpp @@ -251,7 +251,7 @@ CommandList *CommandList::createImmediate(uint32_t productFamily, Device *device commandList->enableSynchronizedDispatch(queueProperties.synchronizedDispatchMode); } - if ((NEO::debugManager.flags.ForceCopyOperationOffloadForComputeCmdList.get() == 1) && !commandList->isCopyOnly() && commandList->isInOrderExecutionEnabled()) { + if ((NEO::debugManager.flags.ForceCopyOperationOffloadForComputeCmdList.get() == 1 || queueProperties.copyOffloadHint) && !commandList->isCopyOnly() && commandList->isInOrderExecutionEnabled()) { commandList->enableCopyOperationOffload(productFamily, device, desc); } diff --git a/level_zero/core/source/cmdqueue/cmdqueue.cpp b/level_zero/core/source/cmdqueue/cmdqueue.cpp index 6b5de0479f..fe040ab425 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue.cpp +++ b/level_zero/core/source/cmdqueue/cmdqueue.cpp @@ -374,6 +374,8 @@ QueueProperties CommandQueue::extractQueueProperties(const ze_command_queue_desc if (syncDispatchMode.has_value()) { queueProperties.synchronizedDispatchMode = syncDispatchMode.value(); } + } else if (baseProperties->stype == ZEX_INTEL_STRUCTURE_TYPE_QUEUE_COPY_OPERATIONS_OFFLOAD_HINT_EXP_PROPERTIES) { + queueProperties.copyOffloadHint = static_cast(desc.pNext)->copyOffloadEnabled; } baseProperties = static_cast(baseProperties->pNext); diff --git a/level_zero/core/source/cmdqueue/cmdqueue.h b/level_zero/core/source/cmdqueue/cmdqueue.h index 54158c7c29..ea732df49d 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue.h +++ b/level_zero/core/source/cmdqueue/cmdqueue.h @@ -35,6 +35,7 @@ struct Device; struct QueueProperties { NEO::SynchronizedDispatchMode synchronizedDispatchMode = NEO::SynchronizedDispatchMode::disabled; bool interruptHint = false; + bool copyOffloadHint = false; }; struct CommandQueue : _ze_command_queue_handle_t { diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp index d4dcc7953e..ad2ddc09bb 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp @@ -6922,6 +6922,42 @@ HWTEST2_F(CopyOffloadInOrderTests, givenDebugFlagSetWhenCreatingCmdListThenEnabl } } +HWTEST2_F(CopyOffloadInOrderTests, givenQueueDescriptorWhenCreatingCmdListThenEnableCopyOffload, IsAtLeastXeHpCore) { + NEO::debugManager.flags.ForceCopyOperationOffloadForComputeCmdList.set(-1); + + ze_command_list_handle_t cmdListHandle; + + zex_intel_queue_copy_operations_offload_hint_exp_desc_t copyOffloadDesc = {ZEX_INTEL_STRUCTURE_TYPE_QUEUE_COPY_OPERATIONS_OFFLOAD_HINT_EXP_PROPERTIES}; + copyOffloadDesc.copyOffloadEnabled = true; + + ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; + cmdQueueDesc.priority = ZE_COMMAND_QUEUE_PRIORITY_NORMAL; + cmdQueueDesc.flags = ZE_COMMAND_QUEUE_FLAG_IN_ORDER; + cmdQueueDesc.mode = ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS; + + cmdQueueDesc.pNext = ©OffloadDesc; + + { + EXPECT_EQ(ZE_RESULT_SUCCESS, zeCommandListCreateImmediate(context, device, &cmdQueueDesc, &cmdListHandle)); + auto cmdList = static_cast> *>(CommandList::fromHandle(cmdListHandle)); + EXPECT_TRUE(cmdList->copyOperationOffloadEnabled); + EXPECT_NE(nullptr, cmdList->cmdQImmediateCopyOffload); + + zeCommandListDestroy(cmdListHandle); + } + + { + copyOffloadDesc.copyOffloadEnabled = false; + + EXPECT_EQ(ZE_RESULT_SUCCESS, zeCommandListCreateImmediate(context, device, &cmdQueueDesc, &cmdListHandle)); + auto cmdList = static_cast> *>(CommandList::fromHandle(cmdListHandle)); + EXPECT_FALSE(cmdList->copyOperationOffloadEnabled); + EXPECT_EQ(nullptr, cmdList->cmdQImmediateCopyOffload); + + zeCommandListDestroy(cmdListHandle); + } +} + HWTEST2_F(CopyOffloadInOrderTests, givenCopyOffloadEnabledWhenProgrammingHwCmdsThenUserCopyCommands, IsAtLeastXeHpCore) { using XY_COPY_BLT = typename std::remove_const::type;