diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index d4c0bf1f80..a8179ae095 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -3062,11 +3062,16 @@ inline ze_result_t CommandListCoreFamily::addEventsToCmdList(uint template ze_result_t CommandListCoreFamily::appendSignalEvent(ze_event_handle_t hEvent, bool relaxedOrderingDispatch) { + auto event = Event::fromHandle(hEvent); + + if (event->isCounterBased()) { + return appendBarrier(hEvent, 0, nullptr, relaxedOrderingDispatch); + } + if (this->isInOrderExecutionEnabled()) { handleInOrderImplicitDependencies(relaxedOrderingDispatch, false); } - auto event = Event::fromHandle(hEvent); event->resetKernelCountAndPacketUsedCount(); if (!handleCounterBasedEventOperations(event, false)) { @@ -4246,8 +4251,10 @@ ze_result_t CommandListCoreFamily::appendBarrier(ze_event_handle_ appendSynchronizedDispatchInitializationSection(); Event *signalEvent = nullptr; + bool hostVisibleEvent = false; if (hSignalEvent) { signalEvent = Event::fromHandle(hSignalEvent); + hostVisibleEvent = signalEvent->isSignalScope(ZE_EVENT_SCOPE_FLAG_HOST); } if (!handleCounterBasedEventOperations(signalEvent, false)) { @@ -4276,7 +4283,10 @@ ze_result_t CommandListCoreFamily::appendBarrier(ze_event_handle_ } addToMappedEventList(signalEvent); - appendSignalEventPostWalker(signalEvent, nullptr, nullptr, this->isInOrderExecutionEnabled(), false, isCopyOnly(false)); + + bool skipPipeControl = this->isInOrderExecutionEnabled() && !getDcFlushRequired(hostVisibleEvent); + + appendSignalEventPostWalker(signalEvent, nullptr, nullptr, skipPipeControl, false, isCopyOnly(false)); if (isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent, false, false, false); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp index 129d638ea8..1d1f4cefab 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp @@ -1154,7 +1154,7 @@ HWTEST_F(InOrderCmdListTests, givenDependencyFromDifferentRootDeviceWhenAppendCa auto immCmdList0 = createCmdList(device0); auto immCmdList1 = createCmdList(device1); - immCmdList0->appendSignalEvent(eventH, false); + immCmdList0->appendLaunchKernel(kernel->toHandle(), groupCount, eventH, 0, nullptr, launchParams); auto &cmdContainer1 = immCmdList1->getCmdContainer(); auto cmdStream = cmdContainer1.getCommandStream(); @@ -1195,6 +1195,7 @@ HWTEST_F(InOrderCmdListTests, givenTimestmapEventWhenProgrammingBarrierThenDontA auto eventPool = createEvents(1, true); auto eventHandle = events[0]->toHandle(); + events[0]->signalScope = 0; auto immCmdList = createImmCmdList(); @@ -2244,7 +2245,7 @@ HWTEST2_F(InOrderCmdListTests, givenRelaxedOrderingEnabledWhenSignalEventCalledT auto immCmdList1 = createImmCmdList(); auto immCmdList2 = createImmCmdList(); - auto eventPool = createEvents(2, false); + auto eventPool = createEvents(2, true); events[1]->makeCounterBasedInitiallyDisabled(eventPool->getAllocation()); auto nonCbEvent = events[1]->toHandle(); @@ -2965,6 +2966,32 @@ HWTEST2_F(InOrderCmdListTests, givenRelaxedOrderingWhenProgrammingTimestampEvent } } +HWTEST_F(InOrderCmdListTests, givenCbEventWhenAppendSignalEventCalledThenFallbackToAppendBarrier) { + class MyMockCmdList : public WhiteBox> { + public: + using BaseClass = WhiteBox>; + using BaseClass::BaseClass; + + ze_result_t appendBarrier(ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents, bool relaxedOrderingDispatch) override { + appendBarrierCalled++; + return BaseClass::appendBarrier(hSignalEvent, numWaitEvents, phWaitEvents, relaxedOrderingDispatch); + } + + uint32_t appendBarrierCalled = 0; + }; + + auto immCmdList = createImmCmdListImpl(false); + + auto eventPool = createEvents(2, true); + events[0]->makeCounterBasedInitiallyDisabled(eventPool->getAllocation()); + + immCmdList->appendSignalEvent(events[0]->toHandle(), false); + EXPECT_EQ(0u, immCmdList->appendBarrierCalled); + + immCmdList->appendSignalEvent(events[1]->toHandle(), false); + EXPECT_EQ(1u, immCmdList->appendBarrierCalled); +} + HWTEST2_F(InOrderCmdListTests, givenRelaxedOrderingWhenProgrammingTimestampEventCbThenClearOnHstAndChainWithSyncAllocSignalingAsTwoSeparateSubmissions, IsAtLeastXeHpcCore) { class MyMockCmdList : public WhiteBox> { public: 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 37634bbafc..276969bcd6 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 @@ -2441,11 +2441,11 @@ struct StandaloneInOrderTimestampAllocationTests : public InOrderCmdListFixture HWTEST_F(StandaloneInOrderTimestampAllocationTests, givenSignalScopeEventWhenSignalEventIsCalledThenProgramPipeControl) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; - auto eventPool = createEvents(2, false); + auto eventPool = createEvents(2, true); auto cmdList = createImmCmdList(); - events[0]->signalScope = true; + events[0]->signalScope = ZE_EVENT_SCOPE_FLAG_HOST; events[1]->signalScope = false; auto cmdStream = cmdList->getCmdContainer().getCommandStream();