diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.cpp b/projects/clr/rocclr/device/rocm/rocvirtual.cpp index f853a700b9..9876996eb2 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.cpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.cpp @@ -504,6 +504,7 @@ std::vector& VirtualGPU::HwQueueTracker::WaitingSignal(HwQueueEngi } external_signals_.clear(); } + // Return the array of waiting HSA signals return waiting_signals_; } @@ -1003,7 +1004,7 @@ void VirtualGPU::ResetQueueStates() { // ================================================================================================ bool VirtualGPU::releaseGpuMemoryFence(bool skip_cpu_wait) { - if (hasPendingDispatch_) { + if (hasPendingDispatch_ || !Barriers().IsExternalSignalListEmpty()) { // Dispatch barrier packet into the queue dispatchBarrierPacket(kBarrierPacketHeader); hasPendingDispatch_ = false; @@ -1276,6 +1277,7 @@ void VirtualGPU::profilingBegin(amd::Command& command, bool drmProfiling) { } if (AMD_DIRECT_DISPATCH) { + Barriers().ClearExternalSignals(); for (auto it = command.eventWaitList().begin(); it < command.eventWaitList().end(); ++it) { void* hw_event = ((*it)->NotifyEvent() != nullptr) ? (*it)->NotifyEvent()->HwEvent() : (*it)->HwEvent(); @@ -1302,6 +1304,7 @@ void VirtualGPU::profilingEnd(amd::Command& command) { if (!timestamp_->HwProfiling()) { timestamp_->end(); } + assert(Barriers().IsExternalSignalListEmpty()); command.setData(timestamp_); timestamp_ = nullptr; } diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.hpp b/projects/clr/rocclr/device/rocm/rocvirtual.hpp index e21e38ffef..5301da8d1c 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.hpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.hpp @@ -243,6 +243,12 @@ class VirtualGPU : public device::VirtualDevice { //! Get the last active signal on the queue ProfilingSignal* GetLastSignal() const { return signal_list_[current_id_]; } + //! Clear external signals + void ClearExternalSignals() { external_signals_.clear(); } + + //! Empty check for external signals + bool IsExternalSignalListEmpty() const { return external_signals_.empty(); } + private: //! Wait for the next active signal void WaitNext() {