1 /*
2  * Copyright (C) 2020-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 
10 #include "shared/source/os_interface/os_library.h"
11 
12 #include "level_zero/tools/source/metrics/metric.h"
13 
14 #include <vector>
15 
16 namespace L0 {
17 
18 struct MetricEnumeration {
19     MetricEnumeration(MetricContext &metricContext);
20     virtual ~MetricEnumeration();
21 
22     ze_result_t metricGroupGet(uint32_t &count, zet_metric_group_handle_t *phMetricGroups);
23     MetricGroup *getMetricGroupByIndex(const uint32_t index);
24     uint32_t getMetricGroupCount();
25 
26     virtual bool isInitialized();
27 
28     virtual ze_result_t loadMetricsDiscovery();
29     static const char *getMetricsDiscoveryFilename();
30 
31   protected:
32     ze_result_t initialize();
33 
34     virtual ze_result_t openMetricsDiscovery();
35     virtual bool getAdapterId(uint32_t &major, uint32_t &minor);
36     virtual MetricsDiscovery::IAdapter_1_9 *getMetricsAdapter();
37     ze_result_t cleanupMetricsDiscovery();
38 
39     ze_result_t cacheMetricInformation();
40     ze_result_t cacheMetricGroup(MetricsDiscovery::IMetricSet_1_5 &metricSet,
41                                  MetricsDiscovery::IConcurrentGroup_1_5 &pConcurrentGroup,
42                                  const uint32_t domain,
43                                  const zet_metric_group_sampling_type_flag_t samplingType);
44     ze_result_t createMetrics(MetricsDiscovery::IMetricSet_1_5 &metricSet,
45                               std::vector<Metric *> &metrics);
46 
47     // Metrics Discovery types mapping.
48     uint32_t getMetricTierNumber(const uint32_t sourceUsageFlagsMask) const;
49     zet_metric_type_t getMetricType(const MetricsDiscovery::TMetricType sourceMetricType) const;
50     zet_metric_type_t
51     getMetricType(const MetricsDiscovery::TInformationType sourceInformationType) const;
52     zet_value_type_t
53     getMetricResultType(const MetricsDiscovery::TMetricResultType sourceMetricResultType) const;
54 
55   protected:
56     MetricContext &metricContext;
57     std::vector<MetricGroup *> metricGroups; // Cached metric groups
58     ze_result_t initializationState = ZE_RESULT_ERROR_UNINITIALIZED;
59 
60     // Metrics Discovery API.
61     std::unique_ptr<NEO::OsLibrary> hMetricsDiscovery = nullptr;
62     MetricsDiscovery::OpenAdapterGroup_fn openAdapterGroup = nullptr;
63     MetricsDiscovery::IAdapterGroup_1_9 *pAdapterGroup = nullptr;
64     MetricsDiscovery::IAdapter_1_9 *pAdapter = nullptr;
65     MetricsDiscovery::IMetricsDevice_1_5 *pMetricsDevice = nullptr;
66 
67   public:
68     // Metrics Discovery version should be at least 1.5.
69     static const uint32_t requiredMetricsDiscoveryMajorVersion = 1;
70     static const uint32_t requiredMetricsDiscoveryMinorVersion = 5;
71     static const char *oaConcurrentGroupName;
72 };
73 
74 struct MetricGroupImp : MetricGroup {
75     ~MetricGroupImp() override;
76 
77     ze_result_t getProperties(zet_metric_group_properties_t *pProperties) override;
78     ze_result_t getMetric(uint32_t *pCount, zet_metric_handle_t *phMetrics) override;
79     ze_result_t calculateMetricValues(const zet_metric_group_calculation_type_t type, size_t rawDataSize, const uint8_t *pRawData,
80                                       uint32_t *pMetricValueCount,
81                                       zet_typed_value_t *pCalculatedData) override;
82     ze_result_t calculateMetricValuesExp(const zet_metric_group_calculation_type_t type, size_t rawDataSize,
83                                          const uint8_t *pRawData, uint32_t *pSetCount,
84                                          uint32_t *pTotalMetricValueCount, uint32_t *pMetricCounts,
85                                          zet_typed_value_t *pMetricValues) override;
86 
87     ze_result_t initialize(const zet_metric_group_properties_t &sourceProperties,
88                            MetricsDiscovery::IMetricSet_1_5 &metricSet,
89                            MetricsDiscovery::IConcurrentGroup_1_5 &concurrentGroup,
90                            const std::vector<Metric *> &groupMetrics);
91 
92     uint32_t getRawReportSize() override;
93 
94     bool activate() override;
95     bool deactivate() override;
96 
97     static uint32_t getApiMask(const zet_metric_group_sampling_type_flags_t samplingType);
98 
99     // Time based measurements.
100     ze_result_t openIoStream(uint32_t &timerPeriodNs, uint32_t &oaBufferSize) override;
101     ze_result_t waitForReports(const uint32_t timeoutMs) override;
102     ze_result_t readIoStream(uint32_t &reportCount, uint8_t &reportData) override;
103     ze_result_t closeIoStream() override;
104 
105     std::vector<zet_metric_group_handle_t> &getMetricGroups();
106 
107   protected:
108     void copyProperties(const zet_metric_group_properties_t &source,
109                         zet_metric_group_properties_t &destination);
110     void copyValue(const MetricsDiscovery::TTypedValue_1_0 &source,
111                    zet_typed_value_t &destination) const;
112 
113     bool getCalculatedMetricCount(const size_t rawDataSize,
114                                   uint32_t &metricValueCount);
115 
116     bool getCalculatedMetricValues(const zet_metric_group_calculation_type_t, const size_t rawDataSize, const uint8_t *pRawData,
117                                    uint32_t &metricValueCount,
118                                    zet_typed_value_t *pCalculatedData);
119 
120     // Cached metrics.
121     std::vector<Metric *> metrics;
122     zet_metric_group_properties_t properties{
123         ZET_STRUCTURE_TYPE_METRIC_GROUP_PROPERTIES,
124     };
125     MetricsDiscovery::IMetricSet_1_5 *pReferenceMetricSet = nullptr;
126     MetricsDiscovery::IConcurrentGroup_1_5 *pReferenceConcurrentGroup = nullptr;
127 
128     std::vector<zet_metric_group_handle_t> metricGroups;
129 };
130 
131 struct MetricImp : Metric {
~MetricImpMetricImp132     ~MetricImp() override{};
133 
134     ze_result_t getProperties(zet_metric_properties_t *pProperties) override;
135 
136     ze_result_t initialize(const zet_metric_properties_t &sourceProperties);
137 
138   protected:
139     void copyProperties(const zet_metric_properties_t &source,
140                         zet_metric_properties_t &destination);
141 
142     zet_metric_properties_t properties{
143         ZET_STRUCTURE_TYPE_METRIC_PROPERTIES};
144 };
145 
146 } // namespace L0
147