Files
rocm-systems/rocclr/runtime/device/pal/palgpuopen.hpp
T
foreman dfb5e1b844 P4 to Git Change 1517959 by gandryey@gera-lnx-rcf on 2018/02/21 17:24:16
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
2018-02-21 17:35:38 -05:00

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