From 54fb82f689e8b06c1a20dc77056edb0f78bd4174 Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Fri, 20 Dec 2024 13:11:47 +0000 Subject: [PATCH] fix: improve event timestamp completion tracking Related-To: HSD-18041011542 Signed-off-by: Bartosz Dunajski --- level_zero/core/source/event/event_imp.h | 1 + level_zero/core/source/event/event_impl.inl | 6 ++--- .../cmdlist/test_in_order_cmdlist_1.cpp | 22 ++++++++++++------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/level_zero/core/source/event/event_imp.h b/level_zero/core/source/event/event_imp.h index d8685fb7e7..7b9bc21ea2 100644 --- a/level_zero/core/source/event/event_imp.h +++ b/level_zero/core/source/event/event_imp.h @@ -78,6 +78,7 @@ struct EventImp : public Event { const uint32_t count, const ze_kernel_timestamp_result_t *pKernelTimestampsBuffer); void copyDataToEventAlloc(void *dstHostAddr, uint64_t dstGpuVa, size_t copySize, const void *copyData); void copyTbxData(uint64_t dstGpuVa, size_t copySize); + bool isTimestampPopulated() const { return (contextEndTS != Event::STATE_CLEARED || globalEndTS != Event::STATE_CLEARED); } void synchronizeCounterBasedTimestampCompletionWithTimeout(); }; diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 8e53fa3618..8bf8e131ec 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -772,8 +772,8 @@ void EventImp::synchronizeCounterBasedTimestampCompletionWithTimeout() calculateProfilingData(); timeDiff = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startTime).count(); - } while ((contextEndTS == Event::STATE_CLEARED || contextEndTS == 0) && (timeDiff < timeoutMs)); - DEBUG_BREAK_IF(contextEndTS == Event::STATE_CLEARED || contextEndTS == 0); + } while (!isTimestampPopulated() && (timeDiff < timeoutMs)); + DEBUG_BREAK_IF(!isTimestampPopulated()); } template @@ -787,7 +787,7 @@ ze_result_t EventImp::queryKernelTimestamp(ze_kernel_timestamp_result_ assignKernelEventCompletionData(getHostAddress()); calculateProfilingData(); - if (isCounterBased() && (contextEndTS == Event::STATE_CLEARED || contextEndTS == 0)) { + if (isCounterBased() && !isTimestampPopulated()) { synchronizeCounterBasedTimestampCompletionWithTimeout(); } 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 ec7f59b194..8b7daef3b0 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 @@ -457,10 +457,12 @@ HWTEST2_F(InOrderCmdListTests, givenCounterBasedTimestampEventWhenQueryingTimest uint32_t assignKernelEventCompletionDataCalled = 0; uint32_t assignKernelEventCompletionDataFailCounter = 0; - uint64_t notReadyData = Event::STATE_CLEARED; + const uint64_t notReadyData = Event::STATE_CLEARED; + bool useContextEndForVerification = true; void assignKernelEventCompletionData(void *address) override { - auto completionAddress = reinterpret_cast(getCompletionFieldHostAddress()); + auto offset = useContextEndForVerification ? NEO::TimestampPackets::getContextEndOffset() : NEO::TimestampPackets::getGlobalEndOffset(); + auto completionAddress = reinterpret_cast(ptrOffset(getHostAddress(), offset)); assignKernelEventCompletionDataCalled++; if (assignKernelEventCompletionDataCalled <= assignKernelEventCompletionDataFailCounter) { *completionAddress = notReadyData; @@ -481,17 +483,21 @@ HWTEST2_F(InOrderCmdListTests, givenCounterBasedTimestampEventWhenQueryingTimest event1->enableCounterBasedMode(true, ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE); event1->assignKernelEventCompletionDataFailCounter = 2; event1->setUsingContextEndOffset(true); + event1->setEventTimestampFlag(true); + event1->useContextEndForVerification = true; event2->enableCounterBasedMode(true, ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE); event2->assignKernelEventCompletionDataFailCounter = 2; event2->setUsingContextEndOffset(true); - event2->notReadyData = 0; + event2->setEventTimestampFlag(true); + event2->useContextEndForVerification = false; cmdList->appendLaunchKernel(kernel->toHandle(), groupCount, event1->toHandle(), 0, nullptr, launchParams, false); - cmdList->appendLaunchKernel(kernel->toHandle(), groupCount, event2->toHandle(), 0, nullptr, launchParams, false); + event1->hostEventSetValue(Event::STATE_CLEARED); + + cmdList->appendLaunchKernel(kernel->toHandle(), groupCount, event2->toHandle(), 0, nullptr, launchParams, false); + event2->hostEventSetValue(Event::STATE_CLEARED); - *reinterpret_cast(event1->getCompletionFieldHostAddress()) = Event::STATE_CLEARED; - *reinterpret_cast(event2->getCompletionFieldHostAddress()) = 0; event1->getInOrderExecInfo()->setLastWaitedCounterValue(2); event2->getInOrderExecInfo()->setLastWaitedCounterValue(2); @@ -500,8 +506,8 @@ HWTEST2_F(InOrderCmdListTests, givenCounterBasedTimestampEventWhenQueryingTimest ze_kernel_timestamp_result_t kernelTimestamps = {}; - EXPECT_EQ(0u, event1->assignKernelEventCompletionDataCalled); - EXPECT_EQ(0u, event2->assignKernelEventCompletionDataCalled); + event1->assignKernelEventCompletionDataCalled = 0; + event2->assignKernelEventCompletionDataCalled = 0; event1->queryKernelTimestamp(&kernelTimestamps); event2->queryKernelTimestamp(&kernelTimestamps);