1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
/*
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "level_zero/tools/source/metrics/metric.h"
#include <map>
#include <vector>
using MetricsLibraryApi::ClientCallbacks_1_0;
using MetricsLibraryApi::ClientGen;
using MetricsLibraryApi::ClientOptionsData_1_0;
using MetricsLibraryApi::CommandBufferData_1_0;
using MetricsLibraryApi::ConfigurationHandle_1_0;
using MetricsLibraryApi::ContextCreateData_1_0;
using MetricsLibraryApi::ContextCreateFunction_1_0;
using MetricsLibraryApi::ContextDeleteFunction_1_0;
using MetricsLibraryApi::ContextHandle_1_0;
using MetricsLibraryApi::Interface_1_0;
using MetricsLibraryApi::QueryHandle_1_0;
namespace L0 {
struct Device;
struct CommandList;
struct MetricGroup;
class OaMetricSourceImp;
} // namespace L0
namespace NEO {
class OsLibrary;
class GraphicsAllocation;
} // namespace NEO
namespace L0 {
struct MetricsLibrary {
public:
MetricsLibrary(OaMetricSourceImp &metricSource);
virtual ~MetricsLibrary();
// Initialization.
virtual bool load();
bool isInitialized();
ze_result_t getInitializationState();
void enableWorkloadPartition();
void getSubDeviceClientOptions(ClientOptionsData_1_0 &subDevice,
ClientOptionsData_1_0 &subDeviceIndex,
ClientOptionsData_1_0 &subDeviceCount,
ClientOptionsData_1_0 &workloadPartition);
static const char *getFilename();
// Deinitialization.
void release();
// Metric query.
uint32_t getQueryReportGpuSize();
bool createMetricQuery(const uint32_t slotsCount, QueryHandle_1_0 &query,
NEO::GraphicsAllocation *&pAllocation);
uint32_t getMetricQueryCount();
bool getMetricQueryReport(QueryHandle_1_0 &query, const uint32_t slot, const size_t rawDataSize, uint8_t *pData);
virtual bool getMetricQueryReportSize(size_t &rawDataSize);
bool destroyMetricQuery(QueryHandle_1_0 &query);
// Command buffer.
bool getGpuCommands(CommandList &commandList, CommandBufferData_1_0 &commandBuffer);
bool getGpuCommands(CommandBufferData_1_0 &commandBuffer);
uint32_t getGpuCommandsSize(CommandBufferData_1_0 &commandBuffer);
// Metric group configuration.
ConfigurationHandle_1_0 getConfiguration(const zet_metric_group_handle_t metricGroup);
bool activateConfiguration(const ConfigurationHandle_1_0 configurationHandle);
bool deactivateConfiguration(const ConfigurationHandle_1_0 configurationHandle);
void cacheConfiguration(zet_metric_group_handle_t metricGroup, ConfigurationHandle_1_0 configurationHandle);
void deleteAllConfigurations();
protected:
void initialize();
bool createContext();
virtual bool getContextData(Device &device, ContextCreateData_1_0 &contextData);
ConfigurationHandle_1_0 createConfiguration(const zet_metric_group_handle_t metricGroup,
const zet_metric_group_properties_t &properties);
ConfigurationHandle_1_0 addConfiguration(const zet_metric_group_handle_t metricGroup);
ClientGen getGenType(const uint32_t gen) const;
protected:
NEO::OsLibrary *handle = nullptr;
OaMetricSourceImp &metricSource;
ze_result_t initializationState = ZE_RESULT_ERROR_UNINITIALIZED;
bool isWorkloadPartitionEnabled = false;
std::mutex mutex;
// Metrics library types.
Interface_1_0 api = {};
ClientCallbacks_1_0 callbacks = {};
ContextHandle_1_0 context = {};
ContextCreateFunction_1_0 contextCreateFunction = nullptr;
ContextDeleteFunction_1_0 contextDeleteFunction = nullptr;
std::map<zet_metric_group_handle_t, ConfigurationHandle_1_0> configurations;
std::vector<QueryHandle_1_0> queries;
};
struct OaMetricQueryImp : MetricQuery {
public:
OaMetricQueryImp(OaMetricSourceImp &metricSource, struct OaMetricQueryPoolImp &pool,
const uint32_t slot);
ze_result_t appendBegin(CommandList &commandList) override;
ze_result_t appendEnd(CommandList &commandList, ze_event_handle_t hSignalEvent,
uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) override;
ze_result_t getData(size_t *pRawDataSize, uint8_t *pRawData) override;
ze_result_t reset() override;
ze_result_t destroy() override;
std::vector<zet_metric_query_handle_t> &getMetricQueries();
protected:
ze_result_t writeMetricQuery(CommandList &commandList, ze_event_handle_t hSignalEvent,
uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents,
const bool begin);
ze_result_t writeSkipExecutionQuery(CommandList &commandList, ze_event_handle_t hSignalEvent,
uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents,
const bool begin);
protected:
OaMetricSourceImp &metricSource;
MetricsLibrary &metricsLibrary;
OaMetricQueryPoolImp &pool;
uint32_t slot;
std::vector<zet_metric_query_handle_t> metricQueries;
};
struct OaMetricQueryPoolImp : MetricQueryPool {
public:
OaMetricQueryPoolImp(OaMetricSourceImp &metricSource, zet_metric_group_handle_t hEventMetricGroup, const zet_metric_query_pool_desc_t &poolDescription);
bool create();
ze_result_t destroy() override;
ze_result_t metricQueryCreate(uint32_t index, zet_metric_query_handle_t *phMetricQuery) override;
bool allocateGpuMemory();
std::vector<zet_metric_query_pool_handle_t> &getMetricQueryPools();
static ze_result_t metricQueryPoolCreate(zet_context_handle_t hContext, zet_device_handle_t hDevice, zet_metric_group_handle_t hMetricGroup,
const zet_metric_query_pool_desc_t *pDesc, zet_metric_query_pool_handle_t *phMetricQueryPool);
protected:
bool createMetricQueryPool();
bool createSkipExecutionQueryPool();
public:
OaMetricSourceImp &metricSource;
MetricsLibrary &metricsLibrary;
std::vector<OaMetricQueryImp> pool;
NEO::GraphicsAllocation *pAllocation = nullptr;
uint32_t allocationSize = 0;
zet_metric_query_pool_desc_t description = {};
zet_metric_group_handle_t hMetricGroup = nullptr;
QueryHandle_1_0 query = {};
protected:
std::vector<zet_metric_query_pool_handle_t> metricQueryPools;
};
} // namespace L0
|