diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index 809df7376a..49fbf13e90 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -2012,6 +2012,7 @@ cl_int CL_API_CALL clGetEventInfo(cl_event event, } GetInfoHelper info(paramValue, paramValueSize, paramValueSizeRet); + auto flushEvents = true; switch (paramName) { default: { @@ -2041,7 +2042,13 @@ cl_int CL_API_CALL clGetEventInfo(cl_event event, TRACING_EXIT(clGetEventInfo, &retVal); return retVal; case CL_EVENT_COMMAND_EXECUTION_STATUS: - neoEvent->tryFlushEvent(); + if (DebugManager.flags.SkipFlushingEventsOnGetStatusCalls.get()) { + flushEvents = false; + } + if (flushEvents) { + neoEvent->tryFlushEvent(); + } + if (neoEvent->isUserEvent()) { auto executionStatus = neoEvent->peekExecutionStatus(); //Spec requires initial state to be queued diff --git a/opencl/test/unit_test/event/user_events_tests.cpp b/opencl/test/unit_test/event/user_events_tests.cpp index 00c086ccf7..4218bbe2ca 100644 --- a/opencl/test/unit_test/event/user_events_tests.cpp +++ b/opencl/test/unit_test/event/user_events_tests.cpp @@ -539,6 +539,32 @@ TEST_F(MockEventTests, GivenAbortedUserEventWhenEnqueingNdrThenDoNotFlushToCsr) EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(MockEventTests, givenDebugVariableWhenStatusIsQueriedThenNoFlushHappens) { + DebugManagerStateRestore restorer; + DebugManager.flags.SkipFlushingEventsOnGetStatusCalls.set(1); + DebugManager.flags.PerformImplicitFlushForNewResource.set(0); + DebugManager.flags.PerformImplicitFlushForIdleGpu.set(0); + + auto &csr = pCmdQ->getGpgpuCommandStreamReceiver(); + csr.overrideDispatchPolicy(DispatchMode::BatchedDispatch); + csr.postInitFlagsSetup(); + + cl_event retEvent = nullptr; + + auto latestFlushed = csr.peekLatestFlushedTaskCount(); + retVal = callOneWorkItemNDRKernel(nullptr, 0u, &retEvent); + EXPECT_EQ(CL_SUCCESS, retVal); + + cl_int eventStatus = 0; + retVal = clGetEventInfo(retEvent, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &eventStatus, NULL); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_EQ(csr.peekLatestFlushedTaskCount(), latestFlushed); + + retVal = clReleaseEvent(retEvent); + EXPECT_EQ(CL_SUCCESS, retVal); +} + TEST_F(MockEventTests, GivenAbortedParentWhenDestroyingChildEventThenDoNotProcessBlockedCommands) { uEvent = make_releaseable(context); diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index bfaa187523..7f2a9d472a 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -308,4 +308,5 @@ OverrideCmdQueueSynchronousMode = -1 HBMSizePerTileInGigabytes = 0 OverrideSystolicPipelineSelect = -1 OverrideSystolicInComputeWalker = -1 -OverrideKernelSizeLimitForSmallDispatch = -1 \ No newline at end of file +OverrideKernelSizeLimitForSmallDispatch = -1 +SkipFlushingEventsOnGetStatusCalls = 0 \ No newline at end of file diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index ee346c2b1b..17c8286492 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -326,3 +326,4 @@ DECLARE_DEBUG_VARIABLE(bool, ForcePerDssBackedBufferProgramming, false, "Always DECLARE_DEBUG_VARIABLE(bool, UseCommandBufferHeaderSizeForWddmQueueSubmission, true, "0: Page size (4096), 1: sizeof(COMMAND_BUFFER_HEADER)") DECLARE_DEBUG_VARIABLE(bool, DisableDeepBind, false, "Disable passing RTLD_DEEPBIND flag to all dlopen calls.") DECLARE_DEBUG_VARIABLE(bool, UseUmKmDataTranslator, false, "Use helper library for UMD<->KMD (WDDM) struct layout compatibility") +DECLARE_DEBUG_VARIABLE(bool, SkipFlushingEventsOnGetStatusCalls, false, "When set to 1, events are not causing internal flush when querying for CL_EVENT_COMMAND_EXECUTION_STATUS") \ No newline at end of file