From fec738208a872f9dd15a28e9de08d084cbaf0087 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Tue, 22 Mar 2022 10:53:44 +0000 Subject: [PATCH] Assign data to overwritten bcs barrier timestamps Signed-off-by: Lukasz Jobczyk --- opencl/source/command_queue/command_queue.cpp | 9 +++++++ .../command_queue/command_queue_tests.cpp | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index d63730dc59..1a1e5932ac 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -1062,6 +1062,15 @@ void CommandQueue::setupBarrierTimestampForBcsEngines(aub_stream::EngineType eng } // Save latest timestamp (override previous, if any). + if (!bcsTimestampPacketContainers[currentBcsIndex].lastBarrierToWaitFor.peekNodes().empty()) { + std::array timestampData; + timestampData.fill(std::numeric_limits::max()); + for (auto &node : bcsTimestampPacketContainers[currentBcsIndex].lastBarrierToWaitFor.peekNodes()) { + for (uint32_t i = 0; i < node->getPacketsUsed(); i++) { + node->assignDataToAllTimestamps(i, timestampData.data()); + } + } + } TimestampPacketContainer newContainer{}; newContainer.assignAndIncrementNodesRefCounts(timestampPacketDependencies.barrierNodes); bcsTimestampPacketContainers[currentBcsIndex].lastBarrierToWaitFor.swapNodes(newContainer); diff --git a/opencl/test/unit_test/command_queue/command_queue_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_tests.cpp index 8a58704518..aff8ca2588 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -2116,6 +2116,30 @@ TEST_F(CommandQueueWithTimestampPacketTests, givenOutOfOrderQueueWhenSetupBarrie EXPECT_EQ(queue.bcsTimestampPacketContainers.size(), barrierNode->refCountFetchSub(0)); } +TEST_F(CommandQueueWithTimestampPacketTests, givenOutOfOrderQueueWhenSetupBarrierTimestampForBcsEnginesAndOverwritePreviousOneThenEnsureBarrierNodeHasDataAssigned) { + const cl_queue_properties props[3] = {CL_QUEUE_PROPERTIES, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, 0}; + MockContext context{}; + MockCommandQueue queue{&context, context.getDevice(0), props, false}; + TimestampPacketDependencies dependencies{}; + queue.getGpgpuCommandStreamReceiver().requestStallingCommandsOnNextFlush(); + for (auto &containers : queue.bcsTimestampPacketContainers) { + EXPECT_TRUE(containers.lastBarrierToWaitFor.peekNodes().empty()); + } + + queue.setupBarrierTimestampForBcsEngines(aub_stream::EngineType::ENGINE_BCS, dependencies); + EXPECT_EQ(1u, dependencies.barrierNodes.peekNodes().size()); + auto barrierNode = dependencies.barrierNodes.peekNodes()[0]; + EXPECT_EQ(1u, barrierNode->getContextEndValue(0u)); + dependencies.moveNodesToNewContainer(*queue.getDeferredTimestampPackets()); + queue.getGpgpuCommandStreamReceiver().requestStallingCommandsOnNextFlush(); + + queue.setupBarrierTimestampForBcsEngines(aub_stream::EngineType::ENGINE_BCS, dependencies); + EXPECT_NE(1u, barrierNode->getContextEndValue(0u)); + EXPECT_EQ(1u, dependencies.barrierNodes.peekNodes().size()); + barrierNode = dependencies.barrierNodes.peekNodes()[0]; + EXPECT_EQ(1u, barrierNode->getContextEndValue(0u)); +} + TEST_F(CommandQueueWithTimestampPacketTests, givenOutOfOrderQueueWhenSetupBarrierTimestampForBcsEnginesCalledOnNonBcsEngineThenEnsureBarrierNodeIsPresentAndSaveItForBcses) { const cl_queue_properties props[3] = {CL_QUEUE_PROPERTIES, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, 0}; MockContext context{};