From 55e3c896aa3d68c879700f62f991ec44140f8c5e Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 18 Oct 2018 06:41:29 -0400 Subject: [PATCH] P4 to Git Change 1619186 by gandryey@gera-w8 on 2018/10/15 13:38:18 SWDEV-155434 - Add SQTT instrumentation tokens for OpenCL dispatches for RGP support - Fix SQTT tockets update when multiple queues are captured Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#113 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palgpuopen.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palgpuopen.hpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#56 edit --- rocclr/runtime/device/pal/paldevice.cpp | 21 +++++++++- rocclr/runtime/device/pal/palgpuopen.cpp | 50 ++++++++++++++---------- rocclr/runtime/device/pal/palgpuopen.hpp | 16 +++++--- rocclr/runtime/device/pal/palvirtual.hpp | 5 +++ 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/rocclr/runtime/device/pal/paldevice.cpp b/rocclr/runtime/device/pal/paldevice.cpp index d904fb49af..11431c6e33 100644 --- a/rocclr/runtime/device/pal/paldevice.cpp +++ b/rocclr/runtime/device/pal/paldevice.cpp @@ -1008,12 +1008,29 @@ void PAL_STDCALL Device::PalDeveloperCallback( Device* device = static_cast(pPrivateData); const auto& barrier = *static_cast(pCbData); + const auto* pBarrierData = reinterpret_cast(pCbData); + + VirtualGPU* gpu = nullptr; + if (pBarrierData->pCmdBuffer != nullptr) { + // Find which queue the current command buffer belongs + for (const auto& it: device->vgpus()) { + if (it->isActiveCmd(pBarrierData->pCmdBuffer)) { + gpu = it; + break; + } + } + } + + if (gpu == nullptr) { + return; + } + switch (type) { case Pal::Developer::CallbackType::BarrierBegin: - device->rgpCaptureMgr()->WriteBarrierStartMarker(barrier); + device->rgpCaptureMgr()->WriteBarrierStartMarker(gpu, barrier); break; case Pal::Developer::CallbackType::BarrierEnd: - device->rgpCaptureMgr()->WriteBarrierEndMarker(barrier); + device->rgpCaptureMgr()->WriteBarrierEndMarker(gpu, barrier); break; case Pal::Developer::CallbackType::ImageBarrier: assert(false); diff --git a/rocclr/runtime/device/pal/palgpuopen.cpp b/rocclr/runtime/device/pal/palgpuopen.cpp index b98b0231a1..86980f90ee 100644 --- a/rocclr/runtime/device/pal/palgpuopen.cpp +++ b/rocclr/runtime/device/pal/palgpuopen.cpp @@ -253,8 +253,13 @@ void RgpCaptureMgr::PostDispatch(VirtualGPU* gpu) amd::ScopedLock traceLock(&trace_mutex_); trace_.sqtt_disp_count_++; if (trace_.sqtt_disp_count_ >= device_.settings().rgpSqttDispCount_) { - trace_.sqtt_disp_count_ = 0; - if (EndRGPHardwareTrace(gpu) != Pal::Result::Success) { + Pal::Result res = EndRGPHardwareTrace(gpu); + if (Pal::Result::ErrorIncompatibleQueue == res) { + // continue until we find the right queue... + } + else if (Pal::Result::Success == res) { + trace_.sqtt_disp_count_ = 0; + } else { FinishRGPTrace(gpu, true); } } @@ -408,9 +413,9 @@ void RgpCaptureMgr::PreDispatch(VirtualGPU* gpu, const HSAILKernel& kernel, } } } - WriteUserEventMarker(RgpSqttMarkerUserEventObjectName, kernel.name()); + WriteUserEventMarker(gpu, RgpSqttMarkerUserEventObjectName, kernel.name()); // Write disaptch marker - WriteEventWithDimsMarker(apiEvent, + WriteEventWithDimsMarker(gpu, apiEvent, static_cast(x), static_cast(y), static_cast(z)); } } @@ -711,31 +716,33 @@ void RgpCaptureMgr::PreDeviceDestroy() // ================================================================================================ // Sets up an Event marker's basic data. -RgpSqttMarkerEvent RgpCaptureMgr::BuildEventMarker(RgpSqttMarkerEventType api_type) const +RgpSqttMarkerEvent RgpCaptureMgr::BuildEventMarker( + const VirtualGPU* gpu, RgpSqttMarkerEventType api_type) const { RgpSqttMarkerEvent marker = {}; marker.identifier = RgpSqttMarkerIdentifierEvent; marker.apiType = static_cast(api_type); marker.cmdID = trace_.current_event_id_++; - marker.cbID = trace_.begin_queue_->queue(MainEngine).cmdBufId(); + marker.cbID = gpu->queue(MainEngine).cmdBufId(); return marker; } // ================================================================================================ -void RgpCaptureMgr::WriteMarker(const void* data, size_t data_size) const +void RgpCaptureMgr::WriteMarker(const VirtualGPU* gpu, const void* data, size_t data_size) const { assert((data_size % sizeof(uint32_t)) == 0); assert((data_size / sizeof(uint32_t)) > 0); - trace_.begin_queue_->queue(MainEngine).iCmd()->CmdInsertRgpTraceMarker( + gpu->queue(MainEngine).iCmd()->CmdInsertRgpTraceMarker( static_cast(data_size / sizeof(uint32_t)), data); } -// ===================================================================================================================== +// ================================================================================================ // Inserts an RGP pre-dispatch marker void RgpCaptureMgr::WriteEventWithDimsMarker( + const VirtualGPU* gpu, RgpSqttMarkerEventType apiType, uint32_t x, uint32_t y, @@ -745,17 +752,18 @@ void RgpCaptureMgr::WriteEventWithDimsMarker( RgpSqttMarkerEventWithDims eventWithDims = {}; - eventWithDims.event = BuildEventMarker(apiType); + eventWithDims.event = BuildEventMarker(gpu, apiType); eventWithDims.event.hasThreadDims = 1; eventWithDims.threadX = x; eventWithDims.threadY = y; eventWithDims.threadZ = z; - WriteMarker(&eventWithDims, sizeof(eventWithDims)); + WriteMarker(gpu, &eventWithDims, sizeof(eventWithDims)); } -// ===================================================================================================================== -void RgpCaptureMgr::WriteBarrierStartMarker(const Pal::Developer::BarrierData& data) const +// ================================================================================================ +void RgpCaptureMgr::WriteBarrierStartMarker( + const VirtualGPU* gpu, const Pal::Developer::BarrierData& data) const { if (rgp_server_->TracesEnabled() && (trace_.status_ == TraceStatus::Running)) { amd::ScopedLock traceLock(&trace_mutex_); @@ -766,12 +774,13 @@ void RgpCaptureMgr::WriteBarrierStartMarker(const Pal::Developer::BarrierData& d marker.dword02 = 0xFFFFFFFF; //data.reason; marker.internal = true; - WriteMarker(&marker, sizeof(marker)); + WriteMarker(gpu, &marker, sizeof(marker)); } } -// ===================================================================================================================== -void RgpCaptureMgr::WriteBarrierEndMarker(const Pal::Developer::BarrierData& data) const +// ================================================================================================ +void RgpCaptureMgr::WriteBarrierEndMarker( + const VirtualGPU* gpu, const Pal::Developer::BarrierData& data) const { if (rgp_server_->TracesEnabled() && (trace_.status_ == TraceStatus::Running)) { amd::ScopedLock traceLock(&trace_mutex_); @@ -806,13 +815,14 @@ void RgpCaptureMgr::WriteBarrierEndMarker(const Pal::Developer::BarrierData& dat marker.numLayoutTransitions = 0; - WriteMarker(&marker, sizeof(marker)); + WriteMarker(gpu, &marker, sizeof(marker)); } } -// ===================================================================================================================== +// ================================================================================================ // Inserts a user event string marker -void RgpCaptureMgr::WriteUserEventMarker(RgpSqttMarkerUserEventType eventType, const std::string& name) const +void RgpCaptureMgr::WriteUserEventMarker( + const VirtualGPU* gpu, RgpSqttMarkerUserEventType eventType, const std::string& name) const { memset(user_event_, 0, sizeof(RgpSqttMarkerUserEventWithString)); @@ -836,7 +846,7 @@ void RgpCaptureMgr::WriteUserEventMarker(RgpSqttMarkerUserEventType eventType, c markerSize += sizeof(uint32_t) * ((strLength + sizeof(uint32_t) - 1) / sizeof(uint32_t)); } - WriteMarker(user_event_, markerSize); + WriteMarker(gpu, user_event_, markerSize); } diff --git a/rocclr/runtime/device/pal/palgpuopen.hpp b/rocclr/runtime/device/pal/palgpuopen.hpp index 9b8051fbe9..7fec0063bf 100644 --- a/rocclr/runtime/device/pal/palgpuopen.hpp +++ b/rocclr/runtime/device/pal/palgpuopen.hpp @@ -310,8 +310,10 @@ public: bool IsQueueTimingActive() const; - void WriteBarrierStartMarker(const Pal::Developer::BarrierData& data) const; - void WriteBarrierEndMarker(const Pal::Developer::BarrierData& data) const; + void WriteBarrierStartMarker( + const VirtualGPU* gpu, const Pal::Developer::BarrierData& data) const; + void WriteBarrierEndMarker( + const VirtualGPU* gpu, const Pal::Developer::BarrierData& data) const; bool RegisterTimedQueue(uint32_t queue_id, Pal::IQueue* iQueue, bool* debug_vmid) const; Pal::Result TimedQueueSubmit( Pal::IQueue* queue, uint64_t cmdId, const Pal::SubmitInfo& submitInfo) const; @@ -359,10 +361,12 @@ private: void DestroyRGPTracing(); Pal::Result CheckForTraceResults(); static bool GpuSupportsTracing(const Pal::DeviceProperties& props, const Settings& settings); - RgpSqttMarkerEvent BuildEventMarker(RgpSqttMarkerEventType api_type) const; - void WriteMarker(const void* data, size_t data_size) const; - void WriteEventWithDimsMarker(RgpSqttMarkerEventType apiType, uint32_t x, uint32_t y, uint32_t z) const; - void WriteUserEventMarker(RgpSqttMarkerUserEventType eventType, const std::string& name) const; + RgpSqttMarkerEvent BuildEventMarker(const VirtualGPU* gpu, RgpSqttMarkerEventType api_type) const; + void WriteMarker(const VirtualGPU* gpu, const void* data, size_t data_size) const; + void WriteEventWithDimsMarker(const VirtualGPU* gpu, RgpSqttMarkerEventType apiType, + uint32_t x, uint32_t y, uint32_t z) const; + void WriteUserEventMarker(const VirtualGPU* gpu, RgpSqttMarkerUserEventType eventType, + const std::string& name) const; const Device& device_; DevDriver::DevDriverServer* dev_driver_server_; diff --git a/rocclr/runtime/device/pal/palvirtual.hpp b/rocclr/runtime/device/pal/palvirtual.hpp index 85fc889e6f..4692d4a28e 100644 --- a/rocclr/runtime/device/pal/palvirtual.hpp +++ b/rocclr/runtime/device/pal/palvirtual.hpp @@ -437,6 +437,11 @@ class VirtualGPU : public device::VirtualDevice { return queue->iCmd(); } + //! Returns true if the provided command buffer is the active one + bool isActiveCmd(Pal::ICmdBuffer* iCmd) const { + return (queues_[engineID_] != nullptr) && (iCmd == queues_[engineID_]->iCmd()) ? true : false; + } + //! Returns queue, associated with VirtualGPU Queue& queue(EngineType id) const { return *queues_[id]; }