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