dfb5e1b844
SWDEV-79445 - Add RGP trace capture capability into runtime. - Initial implementation - PAL_RGP_DISP_COUNT controls the number of captured dispatches(default 10). - RD panel and service are required in order to capture the traces and RD Profiler for viewing and SQTT exports Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/build/Makefile.pal#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldefs.hpp#31 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#72 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#23 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palgpuopen.cpp#1 add ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palgpuopen.hpp#1 add ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.cpp#43 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.hpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#73 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#41 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.hpp#283 edit
173 lines
5.8 KiB
C++
173 lines
5.8 KiB
C++
/*
|
|
***********************************************************************************************************************
|
|
*
|
|
* Trade secret of Advanced Micro Devices, Inc.
|
|
* Copyright (c) 2016 Advanced Micro Devices, Inc. (unpublished)
|
|
*
|
|
* All rights reserved. This notice is intended as a precaution against inadvertent publication and
|
|
* does not imply publication or any waiver of confidentiality. The year included in the foregoing
|
|
* notice is the year of creation of the work.
|
|
*
|
|
***********************************************************************************************************************
|
|
*/
|
|
#pragma once
|
|
|
|
#include <queue>
|
|
#include "device/pal/paldefs.hpp"
|
|
#include "platform/commandqueue.hpp"
|
|
#include "protocols/rgpServer.h"
|
|
#include "device/blit.hpp"
|
|
|
|
// PAL headers
|
|
#include "palUtil.h"
|
|
#include "palPlatform.h"
|
|
#include "palCmdBuffer.h"
|
|
#include "palCmdAllocator.h"
|
|
#include "palQueue.h"
|
|
#include "palFence.h"
|
|
#include "palLinearAllocator.h"
|
|
#include "palHashMap.h"
|
|
#include "palQueue.h"
|
|
#include "palUtil.h"
|
|
|
|
// gpuopen headers
|
|
#include "gpuopen.h"
|
|
|
|
// PAL forward declarations
|
|
namespace Pal
|
|
{
|
|
class ICmdBuffer;
|
|
class IFence;
|
|
class IQueueSemaphore;
|
|
struct PalPublicSettings;
|
|
}
|
|
|
|
// GpuUtil forward declarations
|
|
namespace GpuUtil
|
|
{
|
|
class GpaSession;
|
|
};
|
|
|
|
// GPUOpen forward declarations
|
|
namespace DevDriver
|
|
{
|
|
class DevDriverServer;
|
|
class IMsgChannel;
|
|
struct MessageBuffer;
|
|
|
|
namespace DriverControlProtocol
|
|
{
|
|
enum struct DeviceClockMode : uint32_t;
|
|
class HandlerServer;
|
|
}
|
|
|
|
namespace SettingsProtocol
|
|
{
|
|
class HandlerServer;
|
|
}
|
|
|
|
}
|
|
|
|
namespace pal
|
|
{
|
|
class Settings;
|
|
class Device;
|
|
class VirtualGPU;
|
|
|
|
// RGP SQTT Instrumentation Specification version (API-independent)
|
|
constexpr uint32_t RgpSqttInstrumentationSpecVersion = 1;
|
|
|
|
// RGP SQTT Instrumentation Specification version for Vulkan-specific tables
|
|
constexpr uint32_t RgpSqttInstrumentationApiVersion = 0;
|
|
|
|
// =====================================================================================================================
|
|
// This class provides functionality to interact with the GPU Open Developer Mode message passing service and the rest
|
|
// of the driver.
|
|
class RgpCaptureMgr
|
|
{
|
|
public:
|
|
~RgpCaptureMgr();
|
|
|
|
static RgpCaptureMgr* Create(Pal::IPlatform* platform, const Device& device);
|
|
|
|
void Finalize();
|
|
|
|
void PreDispatch(VirtualGPU* pQueue);
|
|
void PostDispatch(VirtualGPU* pQueue);
|
|
void WaitForDriverResume();
|
|
|
|
void PostDeviceCreate();
|
|
void PreDeviceDestroy();
|
|
void FinishRGPTrace(bool aborted);
|
|
|
|
bool IsQueueTimingActive() const;
|
|
|
|
private:
|
|
// Steps that an RGP trace goes through
|
|
enum class TraceStatus
|
|
{
|
|
Idle = 0, // No active trace and none requested
|
|
Preparing, // A trace has been requested but is not active yet because we are
|
|
// currently sampling timing information over some number of lead frames.
|
|
Running, // SQTT and queue timing is currently active for all command buffer submits.
|
|
WaitingForSqtt,
|
|
WaitingForResults // Tracing is no longer active, but all results are not yet ready.
|
|
};
|
|
|
|
// All per-device state to support RGP tracing
|
|
struct TraceState
|
|
{
|
|
TraceStatus status_; // Current trace status (idle, running, etc.)
|
|
|
|
GpuEvent begin_sqtt_event_; // Event that is signaled when a trace-end cmdbuf retires
|
|
GpuEvent end_sqtt_event_; // Event that is signaled when a trace-end cmdbuf retires
|
|
GpuEvent end_event_; // Event that is signaled when a trace-end cmdbuf retires
|
|
|
|
VirtualGPU* trace_prepare_queue_; // The queue that triggered the full start of a trace
|
|
VirtualGPU* trace_begin_queue_; // The queue that triggered starting SQTT
|
|
|
|
GpuUtil::GpaSession* gpa_session_; // GPA session helper object for building RGP data
|
|
uint32_t gpa_sample_id_; // Sample ID associated with the current trace
|
|
bool queue_timing_; // Queue timing is enabled
|
|
|
|
uint32_t prepared_disp_count_; // Number of dispatches counted while preparing for a trace
|
|
uint32_t sqtt_disp_count_; // Number of dispatches counted while SQTT tracing is active
|
|
};
|
|
|
|
RgpCaptureMgr(Pal::IPlatform* platform, const Device& device);
|
|
|
|
bool Init(Pal::IPlatform* platform);
|
|
Pal::Result PrepareRGPTrace(VirtualGPU* pQueue);
|
|
Pal::Result BeginRGPTrace(VirtualGPU* pQueue);
|
|
Pal::Result EndRGPHardwareTrace(VirtualGPU* pQueue);
|
|
Pal::Result EndRGPTrace(VirtualGPU* pQueue);
|
|
void DestroyRGPTracing();
|
|
Pal::Result CheckForTraceResults();
|
|
static bool GpuSupportsTracing(const Pal::DeviceProperties& props, const Settings& settings);
|
|
|
|
const Device& device_;
|
|
DevDriver::DevDriverServer* dev_driver_server_;
|
|
DevDriver::RGPProtocol::RGPServer* rgp_server_;
|
|
amd::Monitor trace_mutex_;
|
|
TraceState trace_;
|
|
uint32_t num_prep_disp_;
|
|
uint32_t trace_gpu_mem_limit_;
|
|
uint32_t global_disp_count_;
|
|
bool trace_enabled_; // True if tracing is currently enabled (master flag)
|
|
bool inst_tracing_enabled_; // Enable instruction-level SQTT tokens
|
|
|
|
PAL_DISALLOW_DEFAULT_CTOR(RgpCaptureMgr);
|
|
PAL_DISALLOW_COPY_AND_ASSIGN(RgpCaptureMgr);
|
|
};
|
|
|
|
// =====================================================================================================================
|
|
// Returns true if queue operations are currently being timed by RGP traces.
|
|
inline bool RgpCaptureMgr::IsQueueTimingActive() const
|
|
{
|
|
return (trace_.queue_timing_ &&
|
|
(trace_.status_ == TraceStatus::Running ||
|
|
trace_.status_ == TraceStatus::Preparing ||
|
|
trace_.status_ == TraceStatus::WaitingForSqtt));
|
|
}
|
|
};
|