From 1b9f3f11a0b0eebe840a4d37aba4cbd78709010a Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Fri, 23 Feb 2024 19:23:23 +0000 Subject: [PATCH] fix: disable CB Event implicit conversion if dcFlush is required Related-To: NEO-8145 Signed-off-by: Dunajski, Bartosz --- level_zero/core/source/cmdlist/cmdlist_hw.inl | 17 ++- .../sources/cmdlist/test_in_order_cmdlist.cpp | 136 ++++++++++++++---- 2 files changed, 122 insertions(+), 31 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 5e335958d4..c60a781941 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -3691,13 +3691,16 @@ bool CommandListCoreFamily::handleCounterBasedEventOperations(Eve return true; } - if ((NEO::debugManager.flags.EnableImplicitConvertionToCounterBasedEvents.get() != 0)) { - if (!signalEvent->isCounterBasedExplicitlyEnabled()) { - if (isInOrderExecutionEnabled() && isImmediateType()) { - signalEvent->enableCounterBasedMode(false, ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE); - } else { - signalEvent->disableImplicitCounterBasedMode(); - } + bool implicitCounterBasedEventConversionEnable = !this->dcFlushSupport; + if (NEO::debugManager.flags.EnableImplicitConvertionToCounterBasedEvents.get() != -1) { + implicitCounterBasedEventConversionEnable = !!NEO::debugManager.flags.EnableImplicitConvertionToCounterBasedEvents.get(); + } + + if (implicitCounterBasedEventConversionEnable && !signalEvent->isCounterBasedExplicitlyEnabled()) { + if (isInOrderExecutionEnabled() && isImmediateType()) { + signalEvent->enableCounterBasedMode(false, ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE); + } else { + signalEvent->disableImplicitCounterBasedMode(); } } 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 25343fb58d..6dcf6ce6b0 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 @@ -802,39 +802,67 @@ HWTEST2_F(InOrderCmdListTests, givenImplicitEventConvertionEnabledWhenUsingImmed debugManager.flags.EnableImplicitConvertionToCounterBasedEvents.set(-1); + bool dcFlushRequired = immCmdList->getDcFlushRequired(true); + immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); - EXPECT_EQ(static_cast(ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE), events[0]->counterBasedFlags); - EXPECT_TRUE(events[0]->isCounterBased()); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + EXPECT_EQ(0u, events[0]->counterBasedFlags); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + EXPECT_EQ(static_cast(ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE), events[0]->counterBasedFlags); + } + EXPECT_NE(dcFlushRequired, events[0]->isCounterBased()); regularCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[1]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[1]->counterBasedMode); + + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[1]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[1]->counterBasedMode); + } EXPECT_EQ(0u, events[1]->counterBasedFlags); EXPECT_FALSE(events[1]->isCounterBased()); outOfOrderImmCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[2]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[2]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[2]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[2]->counterBasedMode); + } EXPECT_EQ(0u, events[2]->counterBasedFlags); EXPECT_FALSE(events[2]->isCounterBased()); // Reuse on Regular = disable regularCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + } EXPECT_EQ(0u, events[0]->counterBasedFlags); EXPECT_FALSE(events[0]->isCounterBased()); // Reuse on non-inOrder = disable events[0]->counterBasedMode = Event::CounterBasedMode::implicitlyEnabled; regularCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + } EXPECT_EQ(0u, events[0]->counterBasedFlags); - EXPECT_FALSE(events[0]->isCounterBased()); + EXPECT_EQ(dcFlushRequired, events[0]->isCounterBased()); // Reuse on already disabled immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyDisabled, events[0]->counterBasedMode); + } EXPECT_EQ(0u, events[0]->counterBasedFlags); - EXPECT_FALSE(events[0]->isCounterBased()); + EXPECT_EQ(dcFlushRequired, events[0]->isCounterBased()); // On explicitly enabled events[0]->counterBasedMode = Event::CounterBasedMode::explicitlyEnabled; @@ -976,6 +1004,8 @@ HWTEST2_F(InOrderCmdListTests, givenImmediateCmdListWhenDispatchingWithRegularEv auto result = context->allocDeviceMem(device->toHandle(), &deviceDesc, 16384u, 4096u, &alloc); ASSERT_EQ(result, ZE_RESULT_SUCCESS); + bool dcFlushRequired = immCmdList->getDcFlushRequired(true); + NEO::MockGraphicsAllocation mockAllocation(0, NEO::AllocationType::internalHostMemory, reinterpret_cast(0x1234), 0x1000, 0, sizeof(uint32_t), MemoryPool::system4KBPages, MemoryManager::maxOsContextCount); @@ -984,55 +1014,104 @@ HWTEST2_F(InOrderCmdListTests, givenImmediateCmdListWhenDispatchingWithRegularEv events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, eventHandle, 0, nullptr, launchParams, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendLaunchCooperativeKernel(kernel->toHandle(), groupCount, eventHandle, 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendLaunchKernelIndirect(kernel->toHandle(), *static_cast(alloc), eventHandle, 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } size_t rangeSizes = 1; const void **ranges = reinterpret_cast(©Data[0]); events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendMemoryRangesBarrier(1, &rangeSizes, ranges, eventHandle, 0, nullptr); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); copyOnlyCmdList->appendMemoryCopyBlitRegion(&allocationData, &allocationData, region, region, {0, 0, 0}, 0, 0, 0, 0, {0, 0, 0}, {0, 0, 0}, events[0].get(), 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendMemoryCopy(©Data, ©Data, 1, eventHandle, 0, nullptr, false, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendMemoryFill(alloc, ©Data, 1, 16, eventHandle, 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); copyOnlyCmdList->appendBlitFill(alloc, ©Data, 1, 16, events[0].get(), 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendSignalEvent(eventHandle); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendWriteGlobalTimestamp(reinterpret_cast(copyData), eventHandle, 0, nullptr); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendBarrier(eventHandle, 0, nullptr, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } zex_wait_on_mem_desc_t desc; desc.actionFlag = ZEX_WAIT_ON_MEMORY_FLAG_NOT_EQUAL; events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendWaitOnMemory(reinterpret_cast(&desc), copyData, 1, eventHandle, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } auto hostAddress = static_cast(immCmdList->inOrderExecInfo->getDeviceCounterAllocation()->getUnderlyingBuffer()); *hostAddress = immCmdList->inOrderExecInfo->getCounterValue(); @@ -1040,7 +1119,11 @@ HWTEST2_F(InOrderCmdListTests, givenImmediateCmdListWhenDispatchingWithRegularEv immCmdList->copyThroughLockedPtrEnabled = true; events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendMemoryCopy(alloc, ©Data, 1, eventHandle, 0, nullptr, false, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + if (dcFlushRequired) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } context->freeMem(alloc); } @@ -4842,7 +4925,12 @@ HWTEST2_F(BcsSplitInOrderCmdListTests, givenImmediateCmdListWhenDispatchingWithR events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendMemoryCopy(©Data, ©Data, copySize, eventHandle, 0, nullptr, false, false); - EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + + if (immCmdList->getDcFlushRequired(true)) { + EXPECT_EQ(Event::CounterBasedMode::initiallyDisabled, events[0]->counterBasedMode); + } else { + EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode); + } EXPECT_TRUE(verifySplit(1)); }