mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Track TSP OOQ ownership
Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
0d973aaaa3
commit
c4a936d864
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -27,20 +27,6 @@ void TimestampPacketContainer::swapNodes(TimestampPacketContainer ×tampPack
|
||||
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 ×tampPacketContainer) {
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(cacheFlushNodes);
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(previousEnqueueNodes);
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(barrierNodes);
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(auxToNonAuxNodes);
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(nonAuxToAuxNodes);
|
||||
void TimestampPacketContainer::moveNodesToNewContainer(TimestampPacketContainer ×tampPacketContainer) {
|
||||
TimestampPacketContainer tempContainer;
|
||||
swapNodes(tempContainer);
|
||||
|
||||
timestampPacketContainer.assignAndIncrementNodesRefCounts(tempContainer);
|
||||
}
|
||||
|
||||
void TimestampPacketDependencies::moveNodesToNewContainer(TimestampPacketContainer ×tampPacketContainer) {
|
||||
cacheFlushNodes.moveNodesToNewContainer(timestampPacketContainer);
|
||||
previousEnqueueNodes.moveNodesToNewContainer(timestampPacketContainer);
|
||||
barrierNodes.moveNodesToNewContainer(timestampPacketContainer);
|
||||
auxToNonAuxNodes.moveNodesToNewContainer(timestampPacketContainer);
|
||||
nonAuxToAuxNodes.moveNodesToNewContainer(timestampPacketContainer);
|
||||
}
|
||||
|
@ -115,8 +115,8 @@ class TimestampPacketContainer : public NonCopyableClass {
|
||||
void add(TagNodeBase *timestampPacketNode);
|
||||
void swapNodes(TimestampPacketContainer ×tampPacketContainer);
|
||||
void assignAndIncrementNodesRefCounts(const TimestampPacketContainer &inputTimestampPacketContainer);
|
||||
void resolveDependencies(bool clearAllDependencies);
|
||||
void makeResident(CommandStreamReceiver &commandStreamReceiver);
|
||||
void moveNodesToNewContainer(TimestampPacketContainer ×tampPacketContainer);
|
||||
|
||||
protected:
|
||||
std::vector<TagNodeBase *> timestampPacketNodes;
|
||||
|
Reference in New Issue
Block a user