feature: Add support for OA buffer overflow

Related-To: NEO-8685

Signed-off-by: shubham kumar <shubham.kumar@intel.com>
This commit is contained in:
shubham kumar
2024-09-24 18:08:22 +00:00
committed by Compute-Runtime-Automation
parent 7c8c248f04
commit f402ce0f60
17 changed files with 1789 additions and 40 deletions

View File

@@ -321,6 +321,30 @@ ze_result_t MetricEnumeration::cacheMetricInformation() {
// 2. Find "OA" concurrent group.
if (strcmp(pConcurrentGroupParams->SymbolName, oaConcurrentGroupName) == 0) {
// Find the oaBufferOverflowInformation and store in member variable pOaBufferOverflowInformation
const uint32_t measurementInfoCount = pConcurrentGroupParams->IoMeasurementInformationCount;
MetricsDiscovery::IInformationLatest *oaBufferOverflowInformation = nullptr;
for (uint32_t i = 0; i < measurementInfoCount; ++i) {
MetricsDiscovery::IInformationLatest *ioMeasurement = pConcurrentGroup->GetIoMeasurementInformation(i);
DEBUG_BREAK_IF(ioMeasurement == nullptr);
if (ioMeasurement->GetParams()->SymbolName == std::string("BufferOverflow")) {
oaBufferOverflowInformation = ioMeasurement;
break;
}
}
// MDAPI checks for proper library initialization
if (oaBufferOverflowInformation == nullptr ||
oaBufferOverflowInformation->GetParams()->IoReadEquation->GetEquationElementsCount() != 1 ||
oaBufferOverflowInformation->GetParams()->IoReadEquation->GetEquationElement(0)->Type != MetricsDiscovery::EQUATION_ELEM_IMM_UINT64) {
METRICS_LOG_ERR("IoMeasurmentInformation is not as expected for OA %s", " ");
return ZE_RESULT_ERROR_UNKNOWN;
}
pOaBufferOverflowInformation = oaBufferOverflowInformation;
// Reserve memory for metric groups
metricGroups.reserve(pConcurrentGroupParams->MetricSetsCount);
@@ -693,8 +717,11 @@ ze_result_t OaMetricGroupImp::readIoStream(uint32_t &reportCount, uint8_t &repor
switch (readResult) {
case MetricsDiscovery::CC_OK:
case MetricsDiscovery::CC_READ_PENDING:
return ZE_RESULT_SUCCESS;
case MetricsDiscovery::CC_READ_PENDING: {
MetricsDiscovery::IInformationLatest *oaBufferOverflowInformation = getMetricEnumeration().getOaBufferOverflowInformation();
const bool oaBufferOverflow = oaBufferOverflowInformation->GetParams()->IoReadEquation->GetEquationElement(0)->ImmediateUInt64 != 0;
return oaBufferOverflow ? ZE_RESULT_WARNING_DROPPED_DATA : ZE_RESULT_SUCCESS;
}
default:
return ZE_RESULT_ERROR_UNKNOWN;

View File

@@ -76,6 +76,7 @@ struct MetricEnumeration {
getMetricResultType(const MetricsDiscovery::TMetricResultType sourceMetricResultType) const;
void getL0MetricPropertiesFromMdapiMetric(zet_metric_properties_t &l0MetricProps, MetricsDiscovery::IMetric_1_0 *mdapiMetric);
void getL0MetricPropertiesFromMdapiInformation(zet_metric_properties_t &l0MetricProps, MetricsDiscovery::IInformation_1_0 *mdapiInformation);
MetricsDiscovery::IInformationLatest *getOaBufferOverflowInformation() const { return pOaBufferOverflowInformation; }
protected:
ze_result_t initialize();
@@ -115,6 +116,7 @@ struct MetricEnumeration {
MetricsDiscovery::IAdapter_1_9 *pAdapter = nullptr;
MetricsDiscovery::IMetricsDevice_1_5 *pMetricsDevice = nullptr;
uint32_t maximumOaBufferSize = 0u;
MetricsDiscovery::IInformationLatest *pOaBufferOverflowInformation = nullptr;
public:
// Metrics Discovery version should be at least 1.5.

View File

@@ -86,7 +86,7 @@ ze_result_t OaMetricStreamerImp::readData(uint32_t maxReportCount, size_t *pRawD
// Read streamer data.
result = metricGroup->readIoStream(reportCount, *pRawData);
if (result == ZE_RESULT_SUCCESS) {
if (result == ZE_RESULT_SUCCESS || result == ZE_RESULT_WARNING_DROPPED_DATA) {
*pRawDataSize = reportCount * rawReportSize;
}
}