diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index a03041204f..a4a1d6fbd3 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -2242,7 +2242,7 @@ inline ze_result_t CommandListCoreFamily::addEventsToCmdList(uint if (numWaitEvents > 0) { if (phWaitEvents) { - CommandListCoreFamily::appendWaitOnEvents(numWaitEvents, phWaitEvents, relaxedOrderingAllowed, trackDependencies, false); + return CommandListCoreFamily::appendWaitOnEvents(numWaitEvents, phWaitEvents, relaxedOrderingAllowed, trackDependencies, false); } else { return ZE_RESULT_ERROR_INVALID_ARGUMENT; } @@ -2372,6 +2372,9 @@ ze_result_t CommandListCoreFamily::appendWaitOnEvents(uint32_t nu if (event->isInOrderExecEvent()) { UNRECOVERABLE_IF(this->cmdListType != TYPE_IMMEDIATE); + if (!event->getInOrderExecDataAllocation()) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; // in-order event not signaled yet + } if (isInOrderEventWaitRequired(*event)) { CommandListCoreFamily::appendWaitOnInOrderDependency(event->getInOrderExecDataAllocation(), event->getInOrderExecSignalValue(), event->getInOrderAllocationOffset(), relaxedOrderingAllowed); } diff --git a/level_zero/core/source/event/event.h b/level_zero/core/source/event/event.h index 735855fe2b..35e1a35a15 100644 --- a/level_zero/core/source/event/event.h +++ b/level_zero/core/source/event/event.h @@ -217,6 +217,7 @@ struct Event : _ze_event_handle_t { } void updateInOrderExecState(NEO::GraphicsAllocation &inOrderDependenciesAllocation, uint64_t signalValue, uint32_t allocationOffset); bool isInOrderExecEvent() const { return inOrderExecEvent; } + void enableInOrderMode() { this->inOrderExecEvent = true; } NEO::GraphicsAllocation *getInOrderExecDataAllocation() const { return inOrderExecDataAllocation; } uint64_t getInOrderExecSignalValue() const { return inOrderExecSignalValue; } uint32_t getInOrderAllocationOffset() const { return inOrderAllocationOffset; } diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 9433b61b75..be4a121627 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -81,6 +81,10 @@ Event *Event::create(EventPool *eventPool, const ze_event_desc_t *desc, Device * event->timestampRefreshIntervalInNanoSec = refreshTime * milliSecondsToNanoSeconds; } + if (NEO::DebugManager.flags.ForceInOrderEvents.get() == 1) { + event->enableInOrderMode(); + } + return event; } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp index 455d85a755..5b06620163 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp @@ -816,6 +816,31 @@ HWTEST2_F(InOrderCmdListTests, givenQueueFlagWhenCreatingCmdListThenEnableRelaxe EXPECT_EQ(ZE_RESULT_SUCCESS, zeCommandListDestroy(cmdList)); } +HWTEST2_F(InOrderCmdListTests, givenNotSignaledInOrderEventWhenAddedToWaitListThenReturnError, IsAtLeastSkl) { + DebugManager.flags.ForceInOrderEvents.set(1); + + auto immCmdList = createImmCmdList(); + + ze_event_pool_desc_t eventPoolDesc = {}; + eventPoolDesc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE; + eventPoolDesc.count = 1; + + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + + ze_event_desc_t eventDesc = {}; + eventDesc.signal = ZE_EVENT_SCOPE_FLAG_HOST; + + eventDesc.index = 0; + auto event = std::unique_ptr(static_cast(Event::create(eventPool.get(), &eventDesc, device))); + EXPECT_TRUE(event->inOrderExecEvent); + + auto handle = event->toHandle(); + + returnValue = immCmdList->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 1, &handle, launchParams, false); + + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, returnValue); +} + HWTEST2_F(InOrderCmdListTests, givenCmdListsWhenDispatchingThenUseInternalTaskCountForWaits, IsAtLeastSkl) { auto immCmdList0 = createImmCmdList(); auto immCmdList1 = createImmCmdList(); diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index e4d6541065..43704dadae 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -240,6 +240,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, OptimizeIoqBarriersHandling, -1, "-1: default, 0 DECLARE_DEBUG_VARIABLE(int32_t, ExitOnSubmissionNumber, -1, "Call exit(0) on X submission. >=0: submission count (start from 0)") DECLARE_DEBUG_VARIABLE(int32_t, ExitOnSubmissionMode, 0, "Exit on X submission mode. 0: Any context type, 1: Compute context only, 2: Copy context only ") DECLARE_DEBUG_VARIABLE(int32_t, ForceInOrderImmediateCmdListExecution, -1, "-1: default, 0: disabled, 1: all Immediate Command Lists are switched to in-order execution") +DECLARE_DEBUG_VARIABLE(int32_t, ForceInOrderEvents, -1, "-1: default, 0: disabled, 1: Enable all Events as in-order, to rely on command list counter value") DECLARE_DEBUG_VARIABLE(int64_t, OverrideEventSynchronizeTimeout, -1, "-1: default - user provided timeout value, >0: timeout in nanoseconds") DECLARE_DEBUG_VARIABLE(int32_t, ForceTlbFlush, -1, "-1: default, 0: Tlb flush disabled, 1: Tlb Flush enabled") DECLARE_DEBUG_VARIABLE(int32_t, DebugSetMemoryDiagnosticsDelay, -1, "-1: default, >=0: delay time in minutes necessary for completion of Memory diagnostics") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 8c7940617c..5793b123f8 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -548,4 +548,5 @@ WaitForUserFenceOnEventHostSynchronize = -1 ProgramUserInterruptOnResolvedDependency = -1 DisableSystemPointerKernelArgument = -1 DoNotValidateDriverPath = 0 +ForceInOrderEvents = -1 # Please don't edit below this line