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]; }