feature: Add support for internal Metrics

Related-To: LOCI-4561

Signed-off-by: Joshua Santosh Ranjan <joshua.santosh.ranjan@intel.com>
This commit is contained in:
Joshua Santosh Ranjan
2023-06-29 17:36:46 +00:00
committed by Compute-Runtime-Automation
parent 6217d97bbe
commit e27046af1f
8 changed files with 69 additions and 16 deletions

View File

@@ -23,6 +23,7 @@ target_sources(${L0_STATIC_LIB_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/metric_ip_sampling_streamer.h
${CMAKE_CURRENT_SOURCE_DIR}/metric_ip_sampling_streamer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/os_interface_metric.h
${CMAKE_CURRENT_SOURCE_DIR}/${BRANCH_DIR_SUFFIX}/metric_device_context_create.cpp
)
add_subdirectories()

View File

@@ -61,15 +61,15 @@ MetricsDiscovery::IAdapter_1_9 *MetricEnumeration::getMetricsAdapter() {
const int32_t drmMinorPrimary = drmMinor - (drmNodePrimary * drmMaxDevices);
// Enumerate metrics discovery adapters.
for (uint32_t index = 0, count = pAdapterGroup->GetParams()->AdapterCount;
for (uint32_t index = 0, count = getAdapterGroupParams(pAdapterGroup)->AdapterCount;
index < count;
++index) {
UNRECOVERABLE_IF(pAdapterGroup->GetAdapter(index) == nullptr);
UNRECOVERABLE_IF(pAdapterGroup->GetAdapter(index)->GetParams() == nullptr);
auto adapter = pAdapterGroup->GetAdapter(index);
auto adapterParams = adapter->GetParams();
auto adapter = getAdapterFromAdapterGroup(pAdapterGroup, index);
auto adapterParams = getAdapterParams(adapter);
const bool validAdapterType = adapterParams->SystemId.Type == MetricsDiscovery::ADAPTER_ID_TYPE_MAJOR_MINOR;
const bool validAdapterMajor = adapterParams->SystemId.MajorMinor.Major == static_cast<int32_t>(drmMajor);

View File

@@ -22,10 +22,6 @@
namespace L0 {
std::unique_ptr<MetricDeviceContext> MetricDeviceContext::create(Device &device) {
return std::make_unique<MetricDeviceContext>(device);
}
MetricDeviceContext::MetricDeviceContext(Device &inputDevice) : device(inputDevice) {
auto deviceNeo = device.getNEODevice();
bool isSubDevice = deviceNeo->isSubDevice();

View File

@@ -63,6 +63,9 @@ class MetricDeviceContext {
static std::unique_ptr<MetricDeviceContext> create(Device &device);
static ze_result_t enableMetricApi();
protected:
std::map<MetricSource::SourceType, std::unique_ptr<MetricSource>> metricSources;
private:
bool enable();
ze_result_t activateAllDomains();
@@ -72,7 +75,6 @@ class MetricDeviceContext {
std::map<uint32_t, std::pair<zet_metric_group_handle_t, bool>> domains;
bool multiDeviceCapable = false;
uint32_t subDeviceIndex = 0;
std::map<MetricSource::SourceType, std::unique_ptr<MetricSource>> metricSources;
};
struct Metric : _zet_metric_handle_t {

View File

@@ -0,0 +1,16 @@
/*
* Copyright (C) 2023 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "level_zero/tools/source/metrics/metric.h"
namespace L0 {
std::unique_ptr<MetricDeviceContext> MetricDeviceContext::create(Device &device) {
return std::make_unique<MetricDeviceContext>(device);
}
} // namespace L0

View File

@@ -173,7 +173,7 @@ ze_result_t MetricEnumeration::openMetricsDiscovery() {
auto &subDeviceMetricEnumeraion = deviceImp.subDevices[i]->getMetricDeviceContext().getMetricSource<OaMetricSourceImp>().getMetricEnumeration();
auto &metricsDevice = subDeviceMetricEnumeraion.pMetricsDevice;
auto subDeviceImp = static_cast<DeviceImp *>(deviceImp.subDevices[i]);
pAdapter->OpenMetricsSubDevice(subDeviceImp->getPhysicalSubDeviceId(), &metricsDevice);
openMetricsSubDeviceFromAdapter(pAdapter, subDeviceImp->getPhysicalSubDeviceId(), &metricsDevice);
subDeviceMetricEnumeraion.pAdapter = pAdapter;
if (metricsDevice == nullptr) {
NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "unable to open metrics device %u\n", i);
@@ -184,7 +184,7 @@ ze_result_t MetricEnumeration::openMetricsDiscovery() {
subDeviceMetricEnumeraion.readGlobalSymbol(globalSymbolOaMaxBufferSize.data(), maximumOaBufferSize);
}
pAdapter->OpenMetricsDevice(&pMetricsDevice);
openMetricsDeviceFromAdapter(pAdapter, &pMetricsDevice);
if (pMetricsDevice == nullptr) {
NEO::printDebugString(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "unable to open metrics device %u\n", 0);
cleanupMetricsDiscovery();
@@ -196,10 +196,10 @@ ze_result_t MetricEnumeration::openMetricsDiscovery() {
const uint32_t subDeviceIndex = deviceImp.getPhysicalSubDeviceId();
if (subDeviceIndex == 0) {
// Open metrics device for root device or sub device with index 0.
pAdapter->OpenMetricsDevice(&pMetricsDevice);
openMetricsDeviceFromAdapter(pAdapter, &pMetricsDevice);
} else {
// Open metrics device for a given sub device index.
pAdapter->OpenMetricsSubDevice(subDeviceIndex, &pMetricsDevice);
openMetricsSubDeviceFromAdapter(pAdapter, subDeviceIndex, &pMetricsDevice);
}
if (pMetricsDevice == nullptr) {
@@ -238,6 +238,7 @@ ze_result_t MetricEnumeration::cleanupMetricsDiscovery() {
delete metricGroups[i];
}
metricGroups.clear();
cleanupExtendedMetricInformation();
if (hMetricsDiscovery != nullptr) {
if (pAdapterGroup != nullptr) {
@@ -312,7 +313,7 @@ ze_result_t MetricEnumeration::cacheMetricInformation() {
// 1. Iterate over concurrent groups.
MetricsDiscovery::IConcurrentGroup_1_5 *pConcurrentGroup = nullptr;
for (uint32_t i = 0; i < pMetricsDeviceParams->ConcurrentGroupsCount; ++i) {
pConcurrentGroup = pMetricsDevice->GetConcurrentGroup(i);
pConcurrentGroup = getConcurrentGroupFromDevice(pMetricsDevice, i);
DEBUG_BREAK_IF(pConcurrentGroup == nullptr);
MetricsDiscovery::TConcurrentGroupParams_1_0 *pConcurrentGroupParams =
@@ -334,6 +335,7 @@ ze_result_t MetricEnumeration::cacheMetricInformation() {
cacheMetricGroup(*pMetricSet, *pConcurrentGroup, i,
ZET_METRIC_GROUP_SAMPLING_TYPE_FLAG_EVENT_BASED);
}
cacheExtendedMetricInformation(*pConcurrentGroup, i);
}
}

View File

@@ -39,6 +39,37 @@ struct MetricEnumeration {
MetricsDiscovery::IMetricsDevice_1_5 *getMdapiDevice() { return pMetricsDevice; }
MetricsDiscovery::IAdapter_1_9 *getMdapiAdapter() { return pAdapter; }
virtual MetricsDiscovery::IAdapter_1_9 *getAdapterFromAdapterGroup(
MetricsDiscovery::IAdapterGroup_1_9 *adapterGroup,
uint32_t index) {
UNRECOVERABLE_IF(pAdapterGroup == nullptr);
UNRECOVERABLE_IF(pAdapterGroup->GetAdapter(index) == nullptr);
return pAdapterGroup->GetAdapter(index);
}
virtual const MetricsDiscovery::TAdapterGroupParams_1_6 *getAdapterGroupParams(MetricsDiscovery::IAdapterGroup_1_9 *adapterGroup) {
return adapterGroup->GetParams();
}
virtual const MetricsDiscovery::TAdapterParams_1_9 *getAdapterParams(
MetricsDiscovery::IAdapter_1_9 *pAdapter) {
return pAdapter->GetParams();
}
virtual void openMetricsSubDeviceFromAdapter(MetricsDiscovery::IAdapter_1_9 *pAdapter,
const uint32_t subDeviceIndex, MetricsDiscovery::IMetricsDevice_1_5 **metricsDevice) {
pAdapter->OpenMetricsSubDevice(subDeviceIndex, metricsDevice);
}
virtual void openMetricsDeviceFromAdapter(
MetricsDiscovery::IAdapter_1_9 *pAdapter,
MetricsDiscovery::IMetricsDevice_1_5 **metricsDevice) {
pAdapter->OpenMetricsDevice(metricsDevice);
}
virtual MetricsDiscovery::IConcurrentGroup_1_5 *getConcurrentGroupFromDevice(
MetricsDiscovery::IMetricsDevice_1_5 *metricDevice,
uint32_t index) {
return metricDevice->GetConcurrentGroup(index);
}
protected:
ze_result_t initialize();
@@ -63,6 +94,11 @@ struct MetricEnumeration {
getMetricType(const MetricsDiscovery::TInformationType sourceInformationType) const;
zet_value_type_t
getMetricResultType(const MetricsDiscovery::TMetricResultType sourceMetricResultType) const;
virtual ze_result_t cacheExtendedMetricInformation(
MetricsDiscovery::IConcurrentGroup_1_5 &pConcurrentGroup,
const uint32_t domain) { return ZE_RESULT_SUCCESS; };
virtual void cleanupExtendedMetricInformation() {}
protected:
OaMetricSourceImp &metricSource;

View File

@@ -48,15 +48,15 @@ MetricsDiscovery::IAdapter_1_9 *MetricEnumeration::getMetricsAdapter() {
UNRECOVERABLE_IF(getAdapterId(major, minor) == false);
// Enumerate metrics discovery adapters.
for (uint32_t index = 0, count = pAdapterGroup->GetParams()->AdapterCount;
for (uint32_t index = 0, count = getAdapterGroupParams(pAdapterGroup)->AdapterCount;
index < count;
++index) {
UNRECOVERABLE_IF(pAdapterGroup->GetAdapter(index) == nullptr);
UNRECOVERABLE_IF(pAdapterGroup->GetAdapter(index)->GetParams() == nullptr);
auto adapter = pAdapterGroup->GetAdapter(index);
auto adapterParams = adapter->GetParams();
auto adapter = getAdapterFromAdapterGroup(pAdapterGroup, index);
auto adapterParams = getAdapterParams(adapter);
const bool validAdapterInfo = adapterParams->SystemId.Type == MetricsDiscovery::ADAPTER_ID_TYPE_LUID;
const bool validAdapterMatch = (adapterParams->SystemId.Luid.HighPart == major) &&