Track TSP OOQ ownership

Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
Bartosz Dunajski
2021-06-23 11:04:10 +00:00
committed by Compute-Runtime-Automation
parent 0d973aaaa3
commit c4a936d864
4 changed files with 33 additions and 51 deletions

View File

@ -629,7 +629,9 @@ void CommandQueue::obtainNewTimestampPacketNodes(size_t numberOfNodes, Timestamp
clearAllDependencies = false;
}
previousNodes.resolveDependencies(clearAllDependencies);
if (clearAllDependencies) {
previousNodes.moveNodesToNewContainer(*deferredTimestampPackets);
}
DEBUG_BREAK_IF(timestampPacketContainer->peekNodes().size() > 0);

View File

@ -903,6 +903,22 @@ HWTEST_F(TimestampPacketTests, givenTimestampPacketWriteEnabledWhenEnqueueingThe
EXPECT_EQ(0u, deferredTimestampPackets->peekNodes().size());
}
HWTEST_F(TimestampPacketTests, givenTimestampPacketWriteEnabledWhenEnqueueingToOoqThenMoveToDeferredList) {
device->getUltCommandStreamReceiver<FamilyType>().timestampPacketWriteEnabled = true;
auto cmdQ = std::make_unique<MockCommandQueueHw<FamilyType>>(context, device.get(), nullptr);
cmdQ->setOoqEnabled();
TimestampPacketContainer *deferredTimestampPackets = cmdQ->deferredTimestampPackets.get();
cmdQ->enqueueKernel(kernel->mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, nullptr);
EXPECT_EQ(0u, deferredTimestampPackets->peekNodes().size());
cmdQ->enqueueKernel(kernel->mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, nullptr);
EXPECT_EQ(1u, deferredTimestampPackets->peekNodes().size());
}
HWTEST_F(TimestampPacketTests, givenTimestampPacketWriteEnabledWhenEnqueueingBlockingThenTrackOwnershipUntilQueueIsCompleted) {
DebugManager.flags.MakeEachEnqueueBlocking.set(true);
@ -1403,35 +1419,6 @@ HWTEST_F(TimestampPacketTests, givenAlreadyAssignedNodeWhenEnqueueingBlockedThen
cmdQ->isQueueBlocked();
}
HWTEST_F(TimestampPacketTests, givenAlreadyAssignedNodeWhenEnqueueingThenDontKeepDependencyOnPreviousNodeIfItsReady) {
device->getUltCommandStreamReceiver<FamilyType>().timestampPacketWriteEnabled = true;
MockCommandQueueHw<FamilyType> cmdQ(context, device.get(), nullptr);
TimestampPacketContainer previousNodes;
cmdQ.obtainNewTimestampPacketNodes(1, previousNodes, false, false);
auto firstNode = cmdQ.timestampPacketContainer->peekNodes().at(0);
setTagToReadyState(firstNode);
cmdQ.enqueueKernel(kernel->mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, nullptr);
HardwareParse hwParser;
hwParser.parseCommands<FamilyType>(*cmdQ.commandStream, 0);
uint32_t semaphoresFound = 0;
uint32_t atomicsFound = 0;
for (auto it = hwParser.cmdList.begin(); it != hwParser.cmdList.end(); it++) {
if (genCmdCast<typename FamilyType::MI_SEMAPHORE_WAIT *>(*it)) {
semaphoresFound++;
}
if (genCmdCast<typename FamilyType::MI_ATOMIC *>(*it)) {
atomicsFound++;
}
}
uint32_t expectedSemaphoresCount = (UnitTestHelper<FamilyType>::isAdditionalMiSemaphoreWaitRequired(device->getHardwareInfo()) ? 2 : 0);
EXPECT_EQ(expectedSemaphoresCount, semaphoresFound);
EXPECT_EQ(0u, atomicsFound);
}
HWTEST_F(TimestampPacketTests, givenAlreadyAssignedNodeWhenEnqueueingThenKeepDependencyOnPreviousNodeIfItsNotReady) {
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
using MI_ATOMIC = typename FamilyType::MI_ATOMIC;

View File

@ -27,20 +27,6 @@ void TimestampPacketContainer::swapNodes(TimestampPacketContainer &timestampPack
timestampPacketNodes.swap(timestampPacketContainer.timestampPacketNodes);
}
void TimestampPacketContainer::resolveDependencies(bool clearAllDependencies) {
std::vector<TagNodeBase *> pendingNodes;
for (auto node : timestampPacketNodes) {
if (node->canBeReleased() || clearAllDependencies) {
node->returnTag();
} else {
pendingNodes.push_back(node);
}
}
std::swap(timestampPacketNodes, pendingNodes);
}
void TimestampPacketContainer::assignAndIncrementNodesRefCounts(const TimestampPacketContainer &inputTimestampPacketContainer) {
auto &inputNodes = inputTimestampPacketContainer.peekNodes();
std::copy(inputNodes.begin(), inputNodes.end(), std::back_inserter(timestampPacketNodes));
@ -56,10 +42,17 @@ void TimestampPacketContainer::makeResident(CommandStreamReceiver &commandStream
}
}
void TimestampPacketDependencies::moveNodesToNewContainer(TimestampPacketContainer &timestampPacketContainer) {
timestampPacketContainer.assignAndIncrementNodesRefCounts(cacheFlushNodes);
timestampPacketContainer.assignAndIncrementNodesRefCounts(previousEnqueueNodes);
timestampPacketContainer.assignAndIncrementNodesRefCounts(barrierNodes);
timestampPacketContainer.assignAndIncrementNodesRefCounts(auxToNonAuxNodes);
timestampPacketContainer.assignAndIncrementNodesRefCounts(nonAuxToAuxNodes);
void TimestampPacketContainer::moveNodesToNewContainer(TimestampPacketContainer &timestampPacketContainer) {
TimestampPacketContainer tempContainer;
swapNodes(tempContainer);
timestampPacketContainer.assignAndIncrementNodesRefCounts(tempContainer);
}
void TimestampPacketDependencies::moveNodesToNewContainer(TimestampPacketContainer &timestampPacketContainer) {
cacheFlushNodes.moveNodesToNewContainer(timestampPacketContainer);
previousEnqueueNodes.moveNodesToNewContainer(timestampPacketContainer);
barrierNodes.moveNodesToNewContainer(timestampPacketContainer);
auxToNonAuxNodes.moveNodesToNewContainer(timestampPacketContainer);
nonAuxToAuxNodes.moveNodesToNewContainer(timestampPacketContainer);
}

View File

@ -115,8 +115,8 @@ class TimestampPacketContainer : public NonCopyableClass {
void add(TagNodeBase *timestampPacketNode);
void swapNodes(TimestampPacketContainer &timestampPacketContainer);
void assignAndIncrementNodesRefCounts(const TimestampPacketContainer &inputTimestampPacketContainer);
void resolveDependencies(bool clearAllDependencies);
void makeResident(CommandStreamReceiver &commandStreamReceiver);
void moveNodesToNewContainer(TimestampPacketContainer &timestampPacketContainer);
protected:
std::vector<TagNodeBase *> timestampPacketNodes;