SWDEV-301667 - Refactor graph code

- Remove Last graph node optimization and instead submit a barrier NOP
packet always. This simplifies the code.

Change-Id: Ied443173ba47a08b6df148ac7e3ead712acda11c
This commit is contained in:
Saleel Kudchadker
2024-05-09 19:13:34 +00:00
committed by Maneesh Gupta
vanhempi 3d540ec113
commit badf2b0880
3 muutettua tiedostoa jossa 14 lisäystä ja 48 poistoa
+8 -25
Näytä tiedosto
@@ -576,21 +576,17 @@ hipError_t GraphExec::Run(hipStream_t stream) {
repeatLaunch_ = true;
}
if (parallelLists_.size() == 1 &&
instantiateDeviceId_ == hip_stream->DeviceId()) {
if (parallelLists_.size() == 1 && instantiateDeviceId_ == hip_stream->DeviceId()) {
// Accumulate command tracks all the AQL packet batch that we submit to the HW. For now
// we track only kernel nodes.
amd::AccumulateCommand* accumulate = nullptr;
bool isLastKernelWithoutHiddenHeap =
((topoOrder_.back()->GetType() == hipGraphNodeTypeKernel) &&
!reinterpret_cast<hip::GraphKernelNode*>(topoOrder_.back())->HasHiddenHeap());
if (DEBUG_CLR_GRAPH_PACKET_CAPTURE) {
uint8_t* lastCapturedPacket =
isLastKernelWithoutHiddenHeap ? topoOrder_.back()->GetAqlPacket() : nullptr;
if (topoOrder_.back()->GetEnabled()) {
accumulate = new amd::AccumulateCommand(*hip_stream, {}, nullptr, lastCapturedPacket);
}
accumulate = new amd::AccumulateCommand(*hip_stream, {}, nullptr);
}
for (int i = 0; i < topoOrder_.size() - 1; i++) {
if (DEBUG_CLR_GRAPH_PACKET_CAPTURE && topoOrder_[i]->GetType() == hipGraphNodeTypeKernel &&
for (int i = 0; i < topoOrder_.size(); i++) {
if (DEBUG_CLR_GRAPH_PACKET_CAPTURE &&
topoOrder_[i]->GetType() == hipGraphNodeTypeKernel &&
!reinterpret_cast<hip::GraphKernelNode*>(topoOrder_[i])->HasHiddenHeap()) {
if (topoOrder_[i]->GetEnabled()) {
hip_stream->vdev()->dispatchAqlPacket(topoOrder_[i]->GetAqlPacket(), accumulate);
@@ -603,19 +599,6 @@ hipError_t GraphExec::Run(hipStream_t stream) {
}
}
// If last captured packet is kernel, optimize to detect completion of last kernel
// This saves on extra packet submitted to determine end of graph
if (DEBUG_CLR_GRAPH_PACKET_CAPTURE && isLastKernelWithoutHiddenHeap) {
// Add the last kernel node name to the accumulate command
if (topoOrder_.back()->GetEnabled()) {
accumulate->addKernelName(topoOrder_.back()->GetKernelName());
}
} else {
topoOrder_.back()->SetStream(hip_stream, this);
status = topoOrder_.back()->CreateCommand(topoOrder_.back()->GetQueue());
topoOrder_.back()->EnqueueCommands(stream);
}
if (DEBUG_CLR_GRAPH_PACKET_CAPTURE) {
accumulate->enqueue();
accumulate->release();
+4 -16
Näytä tiedosto
@@ -3477,23 +3477,11 @@ void VirtualGPU::submitAccumulate(amd::AccumulateCommand& vcmd) {
amd::ScopedLock lock(execution());
profilingBegin(vcmd, true);
uint8_t* aqlPacket = vcmd.getLastPacket();
if (aqlPacket != nullptr) {
dispatchBlockingWait();
auto packet = reinterpret_cast<hsa_kernel_dispatch_packet_t*>(aqlPacket);
dispatchGenericAqlPacket(packet, packet->header, packet->setup, false);
// We need to set fence_dirty_ flag as we would use a dispatch packet with a completion signal
// to track graph finish for the last. The sync logic assumes HW event to a barrier packet that
// has a system scope release. This would cause isFenceDirty() check at top level to insert
// barrier packet wherever needed
fence_dirty_ = true;
const Settings& settings = dev().settings();
if (settings.barrier_value_packet_) {
dispatchBarrierValuePacket(kBarrierVendorPacketNopScopeHeader, true);
} else {
const Settings& settings = dev().settings();
if (settings.barrier_value_packet_) {
dispatchBarrierValuePacket(kBarrierVendorPacketNopScopeHeader, true);
} else {
dispatchBarrierPacket(kNopPacketHeader, false);
}
dispatchBarrierPacket(kNopPacketHeader, false);
}
profilingEnd(vcmd);
+2 -7
Näytä tiedosto
@@ -1251,8 +1251,6 @@ class Marker : public Command {
class AccumulateCommand : public Command {
private:
uint8_t* lastPacket_;
//! Kernel names and timestamps list for activity profiling
std::vector<std::string> kernelNames_;
std::vector<std::pair<uint64_t, uint64_t>> tsList_;
@@ -1260,12 +1258,9 @@ class AccumulateCommand : public Command {
public:
//! Create a new Marker
AccumulateCommand(HostQueue& queue, const EventWaitList& eventWaitList = nullWaitList,
const Event* waitingEvent = nullptr, uint8_t* lastPacket = nullptr)
: Command(queue, CL_COMMAND_TASK, eventWaitList, 0, waitingEvent),
lastPacket_(lastPacket)
const Event* waitingEvent = nullptr)
: Command(queue, CL_COMMAND_TASK, eventWaitList, 0, waitingEvent)
{}
//! Return last packet
uint8_t* getLastPacket() const { return lastPacket_; }
//! Add kernel name to the list if available
void addKernelName(const std::string& kernelName) {