From 0b34ed67934302a990695cff29d2011ff7465f1c Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Thu, 20 Feb 2025 18:06:50 +0000 Subject: [PATCH] fix: disable copy offload for dcFlush platforms Signed-off-by: Bartosz Dunajski --- .../core/source/cmdlist/cmdlist_imp.cpp | 9 ++- .../cmdlist/test_in_order_cmdlist_2.cpp | 55 +++++++++++++------ 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_imp.cpp b/level_zero/core/source/cmdlist/cmdlist_imp.cpp index 73288a409d..fbb532ae08 100644 --- a/level_zero/core/source/cmdlist/cmdlist_imp.cpp +++ b/level_zero/core/source/cmdlist/cmdlist_imp.cpp @@ -209,8 +209,9 @@ CommandList *CommandList::createImmediate(uint32_t productFamily, Device *device commandList->isSyncModeQueue |= true; } + auto &productHelper = device->getProductHelper(); + if (!internalUsage) { - auto &productHelper = device->getProductHelper(); commandList->isFlushTaskSubmissionEnabled = gfxCoreHelper.isPlatformFlushTaskEnabled(productHelper); if (NEO::debugManager.flags.EnableFlushTaskSubmission.get() != -1) { commandList->isFlushTaskSubmissionEnabled = !!NEO::debugManager.flags.EnableFlushTaskSubmission.get(); @@ -258,9 +259,11 @@ CommandList *CommandList::createImmediate(uint32_t productFamily, Device *device commandList->isBcsSplitNeeded = deviceImp->bcsSplit.setupDevice(productFamily, internalUsage, &cmdQdesc, csr); - commandList->copyThroughLockedPtrEnabled = gfxCoreHelper.copyThroughLockedPtrEnabled(hwInfo, device->getProductHelper()); + commandList->copyThroughLockedPtrEnabled = gfxCoreHelper.copyThroughLockedPtrEnabled(hwInfo, productHelper); - if ((NEO::debugManager.flags.ForceCopyOperationOffloadForComputeCmdList.get() == 1 || queueProperties.copyOffloadHint) && !commandList->isCopyOnly(false) && commandList->isInOrderExecutionEnabled()) { + const bool cmdListSupportsCopyOffload = !commandList->isCopyOnly(false) && commandList->isInOrderExecutionEnabled() && !productHelper.isDcFlushAllowed(); + + if ((NEO::debugManager.flags.ForceCopyOperationOffloadForComputeCmdList.get() == 1 || queueProperties.copyOffloadHint) && cmdListSupportsCopyOffload) { commandList->enableCopyOperationOffload(productFamily, device, desc); } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_2.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_2.cpp index 629f118173..b9af0f83a1 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_2.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_2.cpp @@ -56,17 +56,26 @@ HWTEST2_F(CopyOffloadInOrderTests, givenDebugFlagSetWhenCreatingCmdListThenEnabl cmdQueueDesc.flags = ZE_COMMAND_QUEUE_FLAG_IN_ORDER; cmdQueueDesc.mode = ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS; + auto dcFlushRequired = device->getProductHelper().isDcFlushAllowed(); + { 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); - auto queue = static_cast *>(cmdList->cmdQImmediateCopyOffload); - EXPECT_EQ(cmdQueueDesc.priority, queue->desc.priority); - EXPECT_EQ(cmdQueueDesc.mode, queue->desc.mode); - EXPECT_TRUE(queue->peekIsCopyOnlyCommandQueue()); - EXPECT_TRUE(NEO::EngineHelpers::isBcs(queue->getCsr()->getOsContext().getEngineType())); + if (dcFlushRequired) { + EXPECT_FALSE(cmdList->copyOperationOffloadEnabled); + EXPECT_EQ(nullptr, cmdList->cmdQImmediateCopyOffload); + } else { + + EXPECT_TRUE(cmdList->copyOperationOffloadEnabled); + EXPECT_NE(nullptr, cmdList->cmdQImmediateCopyOffload); + + auto queue = static_cast *>(cmdList->cmdQImmediateCopyOffload); + EXPECT_EQ(cmdQueueDesc.priority, queue->desc.priority); + EXPECT_EQ(cmdQueueDesc.mode, queue->desc.mode); + EXPECT_TRUE(queue->peekIsCopyOnlyCommandQueue()); + EXPECT_TRUE(NEO::EngineHelpers::isBcs(queue->getCsr()->getOsContext().getEngineType())); + } zeCommandListDestroy(cmdListHandle); } @@ -77,14 +86,20 @@ HWTEST2_F(CopyOffloadInOrderTests, givenDebugFlagSetWhenCreatingCmdListThenEnabl 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); - auto queue = static_cast *>(cmdList->cmdQImmediateCopyOffload); - EXPECT_EQ(cmdQueueDesc.priority, queue->desc.priority); - EXPECT_EQ(cmdQueueDesc.mode, queue->desc.mode); - EXPECT_TRUE(queue->peekIsCopyOnlyCommandQueue()); - EXPECT_TRUE(NEO::EngineHelpers::isBcs(queue->getCsr()->getOsContext().getEngineType())); + if (dcFlushRequired) { + EXPECT_FALSE(cmdList->copyOperationOffloadEnabled); + EXPECT_EQ(nullptr, cmdList->cmdQImmediateCopyOffload); + } else { + EXPECT_TRUE(cmdList->copyOperationOffloadEnabled); + EXPECT_NE(nullptr, cmdList->cmdQImmediateCopyOffload); + + auto queue = static_cast *>(cmdList->cmdQImmediateCopyOffload); + EXPECT_EQ(cmdQueueDesc.priority, queue->desc.priority); + EXPECT_EQ(cmdQueueDesc.mode, queue->desc.mode); + EXPECT_TRUE(queue->peekIsCopyOnlyCommandQueue()); + EXPECT_TRUE(NEO::EngineHelpers::isBcs(queue->getCsr()->getOsContext().getEngineType())); + } zeCommandListDestroy(cmdListHandle); @@ -145,11 +160,19 @@ HWTEST2_F(CopyOffloadInOrderTests, givenQueueDescriptorWhenCreatingCmdListThenEn cmdQueueDesc.pNext = ©OffloadDesc; + auto dcFlushRequired = device->getProductHelper().isDcFlushAllowed(); + { 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); + + if (dcFlushRequired) { + EXPECT_FALSE(cmdList->copyOperationOffloadEnabled); + EXPECT_EQ(nullptr, cmdList->cmdQImmediateCopyOffload); + } else { + EXPECT_TRUE(cmdList->copyOperationOffloadEnabled); + EXPECT_NE(nullptr, cmdList->cmdQImmediateCopyOffload); + } zeCommandListDestroy(cmdListHandle); }