601 lines
24 KiB
C++
601 lines
24 KiB
C++
/*
|
|
* Copyright (C) 2023-2025 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#include "level_zero/tools/source/metrics/metric_oa_programmable_imp.h"
|
|
|
|
#include "shared/source/debug_settings/debug_settings_manager.h"
|
|
|
|
#include "level_zero/tools/source/metrics/metric.h"
|
|
#include "level_zero/tools/source/metrics/metric_oa_enumeration_imp.h"
|
|
|
|
#include <algorithm>
|
|
#include <cstring>
|
|
#include <vector>
|
|
|
|
namespace L0 {
|
|
|
|
static const std::map<MetricsDiscovery::TOptionDescriptorType, zet_metric_programmable_param_type_exp_t> optionTypeToParameterTypeMap{
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_DISAGGREGATION, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_DISAGGREGATION},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_LATENCY, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_LATENCY},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_UTILIZATION, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_NORMALIZATION_UTILIZATION},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_AVERAGE, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_NORMALIZATION_AVERAGE},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_RATE, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_NORMALIZATION_RATE},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_BYTE, ZET_METRIC_PROGRAMMABLE_PARAM_TYPE_EXP_NORMALIZATION_BYTES}};
|
|
|
|
static const std::map<MetricsDiscovery::TOptionDescriptorType, uint64_t> optionTypeToDefaultValueMap{
|
|
// Default value for disaggregation is disabled (which means aggregated).
|
|
// However, MDAPI accepts values for disaggregation which represent slice index.
|
|
// So having a special default-value (UINT64_MAX) to represent aggregated case
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_DISAGGREGATION, UINT64_MAX},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_LATENCY, 0u},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_UTILIZATION, 0u},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_AVERAGE, 0u},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_RATE, 0u},
|
|
{MetricsDiscovery::OPTION_DESCRIPTOR_TYPE_NORMALIZATION_BYTE, 0u}};
|
|
|
|
static const std::map<MetricsDiscovery::TValueType, zet_value_info_type_exp_t> valueTypeToValueInfoTypeMap{
|
|
{MetricsDiscovery::VALUE_TYPE_UINT32, ZET_VALUE_INFO_TYPE_EXP_UINT32},
|
|
{MetricsDiscovery::VALUE_TYPE_UINT64, ZET_VALUE_INFO_TYPE_EXP_UINT64},
|
|
{MetricsDiscovery::VALUE_TYPE_FLOAT, ZET_VALUE_INFO_TYPE_EXP_FLOAT32},
|
|
{MetricsDiscovery::VALUE_TYPE_BOOL, ZET_VALUE_INFO_TYPE_EXP_BOOL8},
|
|
{MetricsDiscovery::VALUE_TYPE_UINT32_RANGE, ZET_VALUE_INFO_TYPE_EXP_UINT64_RANGE},
|
|
{MetricsDiscovery::VALUE_TYPE_UINT64_RANGE, ZET_VALUE_INFO_TYPE_EXP_UINT64_RANGE}};
|
|
|
|
ze_result_t OaMetricProgrammableImp::getProperties(zet_metric_programmable_exp_properties_t *pProperties) {
|
|
|
|
memcpy(&pProperties->component, properties.component, sizeof(pProperties->component));
|
|
memcpy(pProperties->description, properties.description, sizeof(pProperties->description));
|
|
pProperties->domain = properties.domain;
|
|
memcpy(pProperties->name, properties.name, sizeof(pProperties->name));
|
|
pProperties->tierNumber = properties.tierNumber;
|
|
pProperties->samplingType = properties.samplingType;
|
|
pProperties->parameterCount = properties.parameterCount;
|
|
pProperties->sourceId = properties.sourceId;
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricProgrammableImp::getParamInfo(uint32_t *pParameterCount, zet_metric_programmable_param_info_exp_t *pParameterInfo) {
|
|
|
|
if (*pParameterCount == 0 && properties.parameterCount != 0) {
|
|
METRICS_LOG_ERR("%s", "Error while retrieving Parameter info for 0 parameterCount.");
|
|
METRICS_LOG_ERR("%s", "Use zetMetricProgrammableGetPropertiesExp to retrieve parameterCount.");
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
*pParameterCount = std::min(*pParameterCount, properties.parameterCount);
|
|
|
|
for (uint32_t i = 0; i < *pParameterCount; i++) {
|
|
auto optionDescriptor = pPrototype->GetOptionDescriptor(i);
|
|
if (optionDescriptor == nullptr) {
|
|
METRICS_LOG_ERR("%s", "GetOptionDescriptor returned nullptr");
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
strcpy_s(pParameterInfo[i].name, ZET_MAX_METRIC_PROGRAMMABLE_PARAMETER_NAME_EXP, optionDescriptor->SymbolName);
|
|
pParameterInfo[i].valueInfoCount = optionDescriptor->ValidValueCount;
|
|
|
|
{
|
|
auto iterator = optionTypeToParameterTypeMap.find(optionDescriptor->Type);
|
|
if (iterator == optionTypeToParameterTypeMap.end()) {
|
|
METRICS_LOG_ERR("Unsupported Option Description Type %d", optionDescriptor->Type);
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
pParameterInfo[i].type = optionTypeToParameterTypeMap.at(optionDescriptor->Type);
|
|
}
|
|
{
|
|
DEBUG_BREAK_IF(optionDescriptor->ValidValueCount == 0);
|
|
auto iterator = valueTypeToValueInfoTypeMap.find(optionDescriptor->ValidValues[0].ValueType);
|
|
if (iterator == valueTypeToValueInfoTypeMap.end()) {
|
|
METRICS_LOG_ERR("Unsupported ValueType Type %d", optionDescriptor->ValidValues[0].ValueType);
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
pParameterInfo[i].valueInfoType = valueTypeToValueInfoTypeMap.at(optionDescriptor->ValidValues[0].ValueType);
|
|
pParameterInfo[i].defaultValue.ui64 = optionTypeToDefaultValueMap.at(optionDescriptor->Type);
|
|
}
|
|
}
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricProgrammableImp::copyMdapiValidValueToL0ValueInfo(zet_value_info_exp_t &l0Value, const MetricsDiscovery::TValidValue_1_13 &mdapiValue) {
|
|
|
|
switch (mdapiValue.ValueType) {
|
|
case MetricsDiscovery::VALUE_TYPE_UINT32:
|
|
l0Value.ui32 = mdapiValue.ValueUInt32;
|
|
break;
|
|
case MetricsDiscovery::VALUE_TYPE_UINT64:
|
|
l0Value.ui64 = mdapiValue.ValueUInt64;
|
|
break;
|
|
case MetricsDiscovery::VALUE_TYPE_UINT32_RANGE:
|
|
l0Value.ui64Range.ui64Min = mdapiValue.ValueUInt32Range.Min;
|
|
l0Value.ui64Range.ui64Max = mdapiValue.ValueUInt32Range.Max;
|
|
break;
|
|
case MetricsDiscovery::VALUE_TYPE_UINT64_RANGE:
|
|
l0Value.ui64Range.ui64Min = mdapiValue.ValueUInt64Range.Min;
|
|
l0Value.ui64Range.ui64Max = mdapiValue.ValueUInt64Range.Max;
|
|
break;
|
|
default:
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
};
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricProgrammableImp::getParamValueInfo(uint32_t parameterOrdinal, uint32_t *pValueInfoCount,
|
|
zet_metric_programmable_param_value_info_exp_t *pValueInfo) {
|
|
|
|
if (parameterOrdinal >= properties.parameterCount) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
auto optionDescriptor = pPrototype->GetOptionDescriptor(parameterOrdinal);
|
|
|
|
*pValueInfoCount = std::min(*pValueInfoCount, optionDescriptor->ValidValueCount);
|
|
for (uint32_t i = 0; i < *pValueInfoCount; i++) {
|
|
auto status = copyMdapiValidValueToL0ValueInfo(pValueInfo[i].valueInfo, optionDescriptor->ValidValues[i]);
|
|
if (status != ZE_RESULT_SUCCESS) {
|
|
*pValueInfoCount = 0;
|
|
return status;
|
|
}
|
|
snprintf(pValueInfo[i].description, sizeof(pValueInfo[i].description), "%s", properties.name);
|
|
}
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricProgrammableImp::copyL0ValueToMdapiTypedValue(MetricsDiscovery::TTypedValue_1_0 &mdapiValue,
|
|
const zet_value_t &l0Value) {
|
|
|
|
switch (mdapiValue.ValueType) {
|
|
case MetricsDiscovery::VALUE_TYPE_UINT32_RANGE:
|
|
case MetricsDiscovery::VALUE_TYPE_UINT32:
|
|
mdapiValue.ValueUInt32 = l0Value.ui32;
|
|
mdapiValue.ValueType = MetricsDiscovery::VALUE_TYPE_UINT32;
|
|
break;
|
|
case MetricsDiscovery::VALUE_TYPE_UINT64_RANGE:
|
|
case MetricsDiscovery::VALUE_TYPE_UINT64:
|
|
mdapiValue.ValueUInt64 = l0Value.ui64;
|
|
mdapiValue.ValueType = MetricsDiscovery::VALUE_TYPE_UINT64;
|
|
break;
|
|
default:
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
};
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricProgrammableImp::createMetric(zet_metric_programmable_param_value_exp_t *pParameterValues,
|
|
uint32_t parameterCount, const char name[ZET_MAX_METRIC_NAME],
|
|
const char description[ZET_MAX_METRIC_DESCRIPTION],
|
|
uint32_t *pMetricHandleCount, zet_metric_handle_t *phMetricHandles) {
|
|
|
|
if (parameterCount > properties.parameterCount) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
// OA generates 1 metric per programmable for 1 combination of parameters
|
|
const uint32_t maxMetricHandleCount = 1u;
|
|
|
|
if (*pMetricHandleCount == 0) {
|
|
*pMetricHandleCount = maxMetricHandleCount;
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
// Clone the prototype and change name
|
|
auto clonedPrototype = pPrototype->Clone();
|
|
if (clonedPrototype == nullptr) {
|
|
DEBUG_BREAK_IF(true);
|
|
*pMetricHandleCount = 0;
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
|
|
auto mdapiStatus = clonedPrototype->ChangeNames(name, name, description, nullptr);
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
DEBUG_BREAK_IF(true);
|
|
*pMetricHandleCount = 0;
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
|
|
// Apply the parameter values on the cloned prototype
|
|
for (uint32_t i = 0; i < parameterCount; i++) {
|
|
|
|
auto optionDescriptor = pPrototype->GetOptionDescriptor(i);
|
|
if (optionDescriptor == nullptr) {
|
|
*pMetricHandleCount = 0;
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
|
|
// If default value, no setting to MDAPI is necessary
|
|
if (pParameterValues[i].value.ui64 ==
|
|
optionTypeToDefaultValueMap.at(optionDescriptor->Type)) {
|
|
continue;
|
|
}
|
|
|
|
MetricsDiscovery::TTypedValue_1_0 mdapiValue{};
|
|
mdapiValue.ValueType = optionDescriptor->ValidValues[0].ValueType;
|
|
auto status = copyL0ValueToMdapiTypedValue(mdapiValue, pParameterValues[i].value);
|
|
if (status != ZE_RESULT_SUCCESS) {
|
|
*pMetricHandleCount = 0;
|
|
return status;
|
|
}
|
|
|
|
auto mdapiStatus = clonedPrototype->SetOption(optionDescriptor->Type, &mdapiValue);
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
*pMetricHandleCount = 0;
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
// Prepare metric properties
|
|
auto prototypeParams = clonedPrototype->GetParams();
|
|
zet_metric_properties_t metricProperties{};
|
|
snprintf(metricProperties.component, sizeof(metricProperties.component), "%s",
|
|
prototypeParams->GroupName);
|
|
snprintf(metricProperties.name, sizeof(metricProperties.name), "%s",
|
|
prototypeParams->SymbolName); // To always have a null-terminated string
|
|
snprintf(metricProperties.description, sizeof(metricProperties.description), "%s",
|
|
prototypeParams->LongName);
|
|
snprintf(metricProperties.resultUnits, sizeof(metricProperties.resultUnits), "%s",
|
|
prototypeParams->MetricResultUnits);
|
|
metricProperties.tierNumber = properties.tierNumber;
|
|
|
|
auto oaMetricSourceImp = static_cast<OaMetricSourceImp *>(metricSource);
|
|
metricProperties.metricType = oaMetricSourceImp->getMetricEnumeration().getMetricType(prototypeParams->MetricType);
|
|
metricProperties.resultType = oaMetricSourceImp->getMetricEnumeration().getMetricResultType(prototypeParams->ResultType);
|
|
|
|
// Create MetricFromProgrammable using the properties
|
|
*phMetricHandles = OaMetricFromProgrammable::create(*oaMetricSourceImp, metricProperties, clonedPrototype, properties.domain, properties.samplingType)->toHandle();
|
|
*pMetricHandleCount = maxMetricHandleCount;
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
void OaMetricProgrammableImp::initialize(zet_metric_programmable_exp_properties_t &properties,
|
|
MetricsDiscovery::IConcurrentGroup_1_13 &concurrentGroup,
|
|
MetricsDiscovery::IMetricPrototype_1_13 &prototype,
|
|
OaMetricSourceImp &metricSource) {
|
|
|
|
memcpy(&this->properties, &properties, sizeof(zet_metric_programmable_exp_properties_t));
|
|
this->pConcurrentGroup = &concurrentGroup;
|
|
this->pPrototype = &prototype;
|
|
this->metricSource = &metricSource;
|
|
}
|
|
|
|
MetricProgrammable *OaMetricProgrammableImp::create(zet_metric_programmable_exp_properties_t &properties,
|
|
MetricsDiscovery::IConcurrentGroup_1_13 &concurrentGroup,
|
|
MetricsDiscovery::IMetricPrototype_1_13 &prototype,
|
|
MetricSource &metricSource) {
|
|
auto pMetricProgrammable = new OaMetricProgrammableImp();
|
|
pMetricProgrammable->initialize(properties, concurrentGroup, prototype, static_cast<OaMetricSourceImp &>(metricSource));
|
|
return pMetricProgrammable;
|
|
}
|
|
|
|
Metric *OaMetricFromProgrammable::create(MetricSource &metricSource, zet_metric_properties_t &properties,
|
|
MetricsDiscovery::IMetricPrototype_1_13 *pClonedPrototype,
|
|
uint32_t domain,
|
|
zet_metric_group_sampling_type_flags_t supportedSamplingTypes) {
|
|
auto pMetric = new OaMetricFromProgrammable(metricSource);
|
|
UNRECOVERABLE_IF(pMetric == nullptr);
|
|
pMetric->initialize(properties);
|
|
pMetric->pClonedPrototype = pClonedPrototype;
|
|
pMetric->isPredefined = false;
|
|
pMetric->domain = domain;
|
|
pMetric->supportedSamplingTypes = supportedSamplingTypes;
|
|
|
|
return pMetric;
|
|
}
|
|
|
|
ze_result_t OaMetricFromProgrammable::destroy() {
|
|
|
|
// Destroy pClonedPrototype
|
|
if (refCount > 0) {
|
|
return ZE_RESULT_ERROR_HANDLE_OBJECT_IN_USE;
|
|
}
|
|
delete this;
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
MetricGroup *OaMetricGroupUserDefined::create(zet_metric_group_properties_t &properties,
|
|
MetricsDiscovery::IMetricSet_1_13 &metricSet,
|
|
MetricsDiscovery::IConcurrentGroup_1_13 &concurrentGroup,
|
|
MetricSource &metricSource) {
|
|
|
|
auto pMetricGroup = new OaMetricGroupUserDefined(metricSource);
|
|
std::vector<Metric *> groupMetrics{};
|
|
pMetricGroup->initialize(properties, metricSet, concurrentGroup, groupMetrics, static_cast<OaMetricSourceImp &>(metricSource));
|
|
|
|
UNRECOVERABLE_IF(pMetricGroup == nullptr);
|
|
|
|
return pMetricGroup;
|
|
}
|
|
|
|
void OaMetricGroupUserDefined::removeMetrics(bool immutable, std::vector<Metric *> &removedMetricList) {
|
|
removedMetricList.clear();
|
|
|
|
for (auto &metric : metrics) {
|
|
if (immutable == static_cast<OaMetricImp *>(metric)->isImmutable()) {
|
|
removedMetricList.push_back(metric);
|
|
}
|
|
}
|
|
|
|
for (auto &metric : removedMetricList) {
|
|
metrics.erase(std::remove(metrics.begin(), metrics.end(), metric), metrics.end());
|
|
}
|
|
}
|
|
|
|
ze_result_t OaMetricGroupUserDefined::addMetric(zet_metric_handle_t hMetric, size_t *errorStringSize, char *pErrorString) {
|
|
|
|
if (isActivated == true) {
|
|
return ZE_RESULT_ERROR_HANDLE_OBJECT_IN_USE;
|
|
}
|
|
|
|
auto metricImp = static_cast<MetricImp *>(Metric::fromHandle(hMetric));
|
|
if (metricImp->getMetricSource().getType() != MetricSource::metricSourceTypeOa) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
auto metric = static_cast<OaMetricImp *>(Metric::fromHandle(hMetric));
|
|
if (metric->isImmutable()) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
auto metricFromProgrammable = static_cast<OaMetricFromProgrammable *>(metric);
|
|
if ((metricFromProgrammable->getSupportedSamplingType() & properties.samplingType) != properties.samplingType) {
|
|
|
|
std::string errorString("MetricGroup does not support Metric's samplingtype ");
|
|
MetricGroupUserDefined::updateErrorString(errorString, errorStringSize, pErrorString);
|
|
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
// If metric was already added, do nothing
|
|
if (std::find(metrics.begin(), metrics.end(), metric) != metrics.end()) {
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
auto metricSet = getMetricSet();
|
|
|
|
// Trying to add to a finalized Metric group.
|
|
if (!isMetricSetOpened) {
|
|
auto mdapiStatus = metricSet->Open();
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
isMetricSetOpened = true;
|
|
// Remove immutable metrics, since MDAPI adds them during finalize
|
|
std::vector<Metric *> removedMetricList{};
|
|
removeMetrics(true, removedMetricList);
|
|
// Delete all removed L0 metric handles, which were previously added
|
|
// during finalize, to correspond with MDAPI metrics.
|
|
for (auto &removedMetric : removedMetricList) {
|
|
delete removedMetric;
|
|
}
|
|
}
|
|
|
|
auto mdapiStatus = metricSet->AddMetric(metricFromProgrammable->pClonedPrototype);
|
|
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
|
|
// Use a default string, since this is not supported by Mdapi
|
|
std::string errorString("Incompatible Metric");
|
|
MetricGroupUserDefined::updateErrorString(errorString, errorStringSize, pErrorString);
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
properties.domain = metricFromProgrammable->getDomain();
|
|
metricFromProgrammable->incrementRefCount();
|
|
metrics.push_back(metric);
|
|
readyToActivate = false;
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricGroupUserDefined::removeMetric(zet_metric_handle_t hMetric) {
|
|
|
|
if (isActivated == true) {
|
|
return ZE_RESULT_ERROR_HANDLE_OBJECT_IN_USE;
|
|
}
|
|
|
|
auto metricImp = static_cast<MetricImp *>(Metric::fromHandle(hMetric));
|
|
if (metricImp->getMetricSource().getType() != MetricSource::metricSourceTypeOa) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
auto metric = static_cast<OaMetricImp *>(Metric::fromHandle(hMetric));
|
|
if (metric->isImmutable()) {
|
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
if (std::find(metrics.begin(), metrics.end(), metric) == metrics.end()) {
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
// Trying to remove from a finalized Metric group
|
|
if (!isMetricSetOpened) {
|
|
auto mdapiStatus = getMetricSet()->Open();
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
isMetricSetOpened = true;
|
|
|
|
// Remove immutable metrics, since MDAPI adds them during finalize
|
|
std::vector<Metric *> removedMetricList{};
|
|
removeMetrics(true, removedMetricList);
|
|
// Delete all removed L0 metric handles, which were previously added
|
|
// during finalize to correspond with MDAPI metrics.
|
|
for (auto &removedMetric : removedMetricList) {
|
|
delete removedMetric;
|
|
}
|
|
}
|
|
|
|
auto metricFromProgrammable = static_cast<OaMetricFromProgrammable *>(metric);
|
|
auto mdapiStatus = getMetricSet()->RemoveMetric(metricFromProgrammable->pClonedPrototype);
|
|
|
|
metrics.erase(std::remove(metrics.begin(), metrics.end(), metric), metrics.end());
|
|
metricFromProgrammable->decrementRefCount();
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
|
|
readyToActivate = false;
|
|
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
ze_result_t OaMetricGroupUserDefined::close() {
|
|
|
|
// Already closed group
|
|
if (readyToActivate == true) {
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
// Groups are closed by default.
|
|
// Open Activated Groups are not possible.
|
|
DEBUG_BREAK_IF(isActivated == true);
|
|
|
|
if (metrics.size() == 0) {
|
|
METRICS_LOG_ERR("%s", "metrics count is 0 for the metric group.")
|
|
return ZE_RESULT_NOT_READY;
|
|
}
|
|
|
|
auto metricSet = getMetricSet();
|
|
auto mdapiStatus = metricSet->Finalize();
|
|
if (mdapiStatus != MetricsDiscovery::CC_OK) {
|
|
DEBUG_BREAK_IF(true);
|
|
return ZE_RESULT_ERROR_UNKNOWN;
|
|
}
|
|
isMetricSetOpened = false;
|
|
|
|
// Set API filtering to get metric count as per API
|
|
metricSet->SetApiFiltering(OaMetricGroupImp::getApiMask(properties.samplingType));
|
|
auto metricSetParams = metricSet->GetParams();
|
|
auto defaultMetricCount = metricSetParams->MetricsCount - metrics.size();
|
|
OaMetricSourceImp *metricSource = getMetricSource();
|
|
auto &enumeration = metricSource->getMetricEnumeration();
|
|
|
|
// Create and add default metrics
|
|
for (int32_t i = static_cast<int32_t>(defaultMetricCount - 1); i >= 0; i--) {
|
|
auto mdapiMetric = metricSet->GetMetric(static_cast<uint32_t>(i));
|
|
zet_metric_properties_t properties = {};
|
|
enumeration.getL0MetricPropertiesFromMdapiMetric(properties, mdapiMetric);
|
|
auto pMetric = OaMetricImp::create(*metricSource, properties);
|
|
UNRECOVERABLE_IF(pMetric == nullptr);
|
|
|
|
// Insert it to the beginning
|
|
metrics.insert(metrics.begin(), pMetric);
|
|
}
|
|
|
|
// Create and add default information
|
|
for (uint32_t i = 0; i < metricSetParams->InformationCount; i++) {
|
|
auto mdapiInformation = metricSet->GetInformation(i);
|
|
zet_metric_properties_t properties = {};
|
|
enumeration.getL0MetricPropertiesFromMdapiInformation(properties, mdapiInformation);
|
|
auto pMetric = OaMetricImp::create(*metricSource, properties);
|
|
UNRECOVERABLE_IF(pMetric == nullptr);
|
|
|
|
metrics.push_back(pMetric);
|
|
}
|
|
properties.metricCount = static_cast<uint32_t>(metrics.size());
|
|
|
|
readyToActivate = true;
|
|
|
|
// Disable API filtering
|
|
metricSet->SetApiFiltering(MetricsDiscovery::API_TYPE_ALL);
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
OaMetricGroupUserDefined::~OaMetricGroupUserDefined() {
|
|
// Remove mutable metrics, since they will destroyed
|
|
// by the application
|
|
std::vector<Metric *> removedMetricList{};
|
|
removeMetrics(false, removedMetricList);
|
|
for (auto mutableMetric : removedMetricList) {
|
|
auto metricFromProgrammable = static_cast<OaMetricFromProgrammable *>(L0::Metric::fromHandle(mutableMetric));
|
|
metricFromProgrammable->decrementRefCount();
|
|
}
|
|
}
|
|
|
|
ze_result_t OaMetricGroupUserDefined::destroy() {
|
|
|
|
if (isActivated == true) {
|
|
return ZE_RESULT_ERROR_HANDLE_OBJECT_IN_USE;
|
|
}
|
|
|
|
delete this;
|
|
return ZE_RESULT_SUCCESS;
|
|
}
|
|
|
|
bool OaMetricGroupUserDefined::activate() {
|
|
|
|
auto status = false;
|
|
|
|
if (readyToActivate) {
|
|
status = OaMetricGroupImp::activate();
|
|
if (status == true) {
|
|
isActivated = true;
|
|
}
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
bool OaMetricGroupUserDefined::deactivate() {
|
|
|
|
bool status = true;
|
|
if (isActivated) {
|
|
status = OaMetricGroupImp::deactivate();
|
|
}
|
|
isActivated = false;
|
|
return status;
|
|
}
|
|
|
|
OaMultiDeviceMetricGroupUserDefined *OaMultiDeviceMetricGroupUserDefined::create(
|
|
MetricSource &metricSource,
|
|
std::vector<MetricGroupImp *> &subDeviceMetricGroups,
|
|
std::vector<MultiDeviceMetricImp *> &inMultiDeviceMetrics) {
|
|
auto metricGroupUserDefined = new OaMultiDeviceMetricGroupUserDefined(metricSource);
|
|
metricGroupUserDefined->metricGroups = subDeviceMetricGroups;
|
|
metricGroupUserDefined->multiDeviceMetrics = inMultiDeviceMetrics;
|
|
|
|
metricGroupUserDefined->createdMetricGroupManager = std::make_unique<MultiDeviceCreatedMetricGroupManager>(
|
|
metricSource,
|
|
metricGroupUserDefined->metricGroups,
|
|
metricGroupUserDefined->multiDeviceMetrics);
|
|
return metricGroupUserDefined;
|
|
}
|
|
|
|
ze_result_t OaMultiDeviceMetricGroupUserDefined::metricGet(uint32_t *pCount, zet_metric_handle_t *phMetrics) {
|
|
return createdMetricGroupManager->metricGet(pCount, phMetrics);
|
|
}
|
|
|
|
ze_result_t OaMultiDeviceMetricGroupUserDefined::addMetric(zet_metric_handle_t hMetric, size_t *errorStringSize, char *pErrorString) {
|
|
return createdMetricGroupManager->addMetric(hMetric, errorStringSize, pErrorString);
|
|
}
|
|
|
|
ze_result_t OaMultiDeviceMetricGroupUserDefined::removeMetric(zet_metric_handle_t hMetric) {
|
|
return createdMetricGroupManager->removeMetric(hMetric);
|
|
}
|
|
|
|
ze_result_t OaMultiDeviceMetricGroupUserDefined::close() {
|
|
return createdMetricGroupManager->close();
|
|
}
|
|
|
|
ze_result_t OaMultiDeviceMetricGroupUserDefined::destroy() {
|
|
auto status = createdMetricGroupManager->destroy();
|
|
delete this;
|
|
return status;
|
|
}
|
|
|
|
} // namespace L0
|