PAPI 7.1.0.0
Loading...
Searching...
No Matches
GPUMetricHandler.h
Go to the documentation of this file.
1/*
2 * GPUMetricHandler.h: IntelĀ® Graphics Component for PAPI
3 *
4 * Copyright (c) 2020 Intel Corp. All rights reserved
5 * Contributed by Peinan Zhang <peinan.zhang@intel.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
11 * of the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
18 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
19 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
22 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25#ifndef _GPUMETRICHANDLER_H
26#define _GPUMETRICHANDLER_H
27
28#pragma once
29
30#include <stdio.h>
31#include <string.h>
32#include <list>
33#include <string>
34#include <fstream>
35#include <vector>
36#include <atomic>
37#include <map>
38#include <mutex>
39
40#include "level_zero/zet_api.h"
41
42#include "GPUMetricInterface.h"
43
44/* collection status */
45#define COLLECTION_IDLE 0
46#define COLLECTION_INIT 1
47#define COLLECTION_CONFIGED 2
48#define COLLECTION_ENABLED 3
49#define COLLECTION_DISABLED 4
50#define COLLECTION_COMPLETED 5
51
52using namespace std;
54
55typedef struct TMetricNode_S
56{
57 uint32_t code; // 0 mean invalid
58 uint32_t metricId;
59 uint32_t metricGroupId;
62 zet_metric_properties_t props;
63 zet_metric_handle_t handle;
65
66typedef struct TMetricGroupNode_S
67{
68 uint32_t code; // 0 mean invalid
69 uint32_t numMetrics;
71 int *opList; // list of metric operation
72 zet_metric_group_properties_t props;
73 zet_metric_group_handle_t handle;
75
76
77typedef struct TMetricGroupInfo_S {
79 uint32_t numMetrics;
81 uint32_t domainId;
84
85
86typedef struct QueryData_S {
87 string kernName;
88 zet_metric_query_handle_t metricQuery;
89 ze_event_handle_t event;
90} QueryData;
91
92typedef struct QueryState_S {
93 atomic<uint32_t> kernelId{0};
94 std::mutex lock;
95 std::map<ze_kernel_handle_t, string> nameMap;
96 zet_metric_query_pool_handle_t queryPool;
97 ze_event_pool_handle_t eventPool;
99 vector<QueryData> queryList;
100} QueryState;
101
102typedef struct InstanceData {
103 uint32_t kernelId;
105 zet_metric_query_handle_t metricQuery;
107
108
110{
111public:
112 static int InitMetricDevices(DeviceInfo **deviceInfoList, uint32_t *numDeviceInfo,
113 uint32_t *totalDevices);
114 static GPUMetricHandler* GetInstance(uint32_t driverId, uint32_t deviceId,
115 uint32_t subdeviceId);
118 int EnableMetricGroup(uint32_t metricGroupCode, uint32_t mtype, int *status);
119 int EnableMetricGroup(const char *metricGroupName, uint32_t mtype, int *status);
120 int EnableTimeBasedStream(uint32_t timePeriod, uint32_t numReports);
123 int GetMetricInfo(int type, MetricInfo *data);
124 int GetMetricInfo(const char * name, int type, MetricInfo *data);
125 int GetMetricCode(const char *mGroupName, const char *metricName, uint32_t mtype,
126 uint32_t *mGroupCode, uint32_t *metricCode);
127 MetricData *GetMetricData(uint32_t mode, uint32_t *numReports);
128 int SetControl(uint32_t mode);
129 uint32_t GetCurGroupCode();
130
131
132private:
133 GPUMetricHandler(uint32_t driverid, uint32_t deviceid, uint32_t subdeviceid);
135 void operator=(GPUMetricHandler const&);
136 static int InitMetricGroups(ze_device_handle_t device, TMetricGroupInfo *mgroups);
137 string GetDeviceName(ze_device_handle_t device);
138 uint8_t *ReadStreamData(size_t *rawDataSize);
139 uint8_t *ReadQueryData(QueryData &data, size_t *rawDataSize, ze_result_t *retStatus);
140 void GenerateMetricData(uint8_t *rawData, size_t rawDataSize, uint32_t mode);
141 void ProcessMetricDataSet(uint32_t dataSetId, zet_typed_value_t* typedDataList,
142 uint32_t startIdx, uint32_t dataSize,
143 uint32_t metricCount, uint32_t mode);
144
145private: // Fields
146 static GPUMetricHandler* m_handlerInstance;
147 static vector<int> driverList;
148 static vector<ze_device_handle_t> m_deviceList;
149 static vector<GPUMetricHandler> handlerList;
150
151 int m_driverId;
152 int m_deviceId;
153 int m_subdeviceId;
154
155 std::mutex m_lock;
156 string m_dataDumpFileName;
157 string m_dataDumpFilePath;
158 fstream m_dataDump;
159
160 // current state
161 ze_driver_handle_t m_driver;
162 ze_context_handle_t m_context;
163 ze_device_handle_t m_device;
164 TMetricGroupInfo *m_groupInfo;
165 uint32_t m_domainId;
166 int m_groupId;
167 uint32_t m_groupType;
168 QueryState *m_queryState;
169
170 ze_event_pool_handle_t m_eventPool;
171 ze_event_handle_t m_event;
172
173 zet_metric_streamer_handle_t m_metricStreamer;
174 zet_metric_query_pool_handle_t m_queryPool;
175 zet_tracer_exp_handle_t m_tracer;
176
177 volatile int m_status;
178 uint32_t m_numDevices;
179 uint32_t m_numDataSet;
180 MetricData *m_reportData;
181 uint32_t *m_reportCount;
182};
183
184/* this struct maintains the <driver, device> information */
185typedef struct TMetricDevice_S {
186 uint32_t driverId;
187 uint32_t deviceId;
191 char *devName;
192 ze_driver_handle_t *ze_driver;
193 ze_device_handle_t *ze_device;
195
196/* This struct maintains the <driver, device, subdevice> information
197 * This is the based to access the GPUMetricHandler method
198 */
199typedef struct TMetricDeviceHandler_S {
200 uint32_t driverId;
201 uint32_t deviceId;
202 uint32_t subdeviceId;
206
207#endif
208
void DestroyMetricDevice()
int GetMetricInfo(const char *name, int type, MetricInfo *data)
int EnableMetricGroup(uint32_t metricGroupCode, uint32_t mtype, int *status)
int EnableEventBasedQuery()
int EnableTimeBasedStream(uint32_t timePeriod, uint32_t numReports)
static GPUMetricHandler * GetInstance(uint32_t driverId, uint32_t deviceId, uint32_t subdeviceId)
uint32_t GetCurGroupCode()
void DisableMetricGroup()
int EnableMetricGroup(const char *metricGroupName, uint32_t mtype, int *status)
int SetControl(uint32_t mode)
int GetMetricInfo(int type, MetricInfo *data)
int GetMetricCode(const char *mGroupName, const char *metricName, uint32_t mtype, uint32_t *mGroupCode, uint32_t *metricCode)
static int InitMetricDevices(DeviceInfo **deviceInfoList, uint32_t *numDeviceInfo, uint32_t *totalDevices)
MetricData * GetMetricData(uint32_t mode, uint32_t *numReports)
uint16_t type
const char * name
Definition: rocs.c:225
zet_metric_query_handle_t metricQuery
QueryState * queryState
string kernName
ze_event_handle_t event
zet_metric_query_handle_t metricQuery
std::map< ze_kernel_handle_t, string > nameMap
zet_metric_query_pool_handle_t queryPool
ze_event_pool_handle_t eventPool
GPUMetricHandler * handle
vector< QueryData > queryList
std::mutex lock
GPUMetricHandler * handler
uint32_t numSubdevices
uint32_t metricHandlerIndex
ze_device_handle_t * ze_device
TMetricGroupInfo * groupList
ze_driver_handle_t * ze_driver
uint32_t numMetricGroups
TMetricGroupNode * metricGroupList
uint32_t maxMetricsPerGroup
zet_metric_group_properties_t props
zet_metric_group_handle_t handle
TMetricNode * metricList
uint32_t metricGroupId
zet_metric_properties_t props
uint32_t metricId
uint32_t metricDomainId
zet_metric_handle_t handle