diff --git a/level_zero/tools/source/metrics/metric_ip_sampling_source.cpp b/level_zero/tools/source/metrics/metric_ip_sampling_source.cpp index 696781f120..24fb50f29f 100644 --- a/level_zero/tools/source/metrics/metric_ip_sampling_source.cpp +++ b/level_zero/tools/source/metrics/metric_ip_sampling_source.cpp @@ -190,7 +190,7 @@ ze_result_t IpSamplingMetricGroupImp::calculateMetricValuesExp(const zet_metric_ const bool calculationCountOnly = *pTotalMetricValueCount == 0; ze_result_t result = this->calculateMetricValues(type, rawDataSize, pRawData, pTotalMetricValueCount, pMetricValues); - if (result == ZE_RESULT_SUCCESS) { + if ((result == ZE_RESULT_SUCCESS) || (result == ZE_RESULT_WARNING_DROPPED_DATA)) { *pSetCount = 1; if (!calculationCountOnly) { pMetricCounts[0] = *pTotalMetricValueCount; @@ -223,6 +223,7 @@ ze_result_t IpSamplingMetricGroupImp::getCalculatedMetricCount(const size_t rawD ze_result_t IpSamplingMetricGroupImp::getCalculatedMetricValues(const zet_metric_group_calculation_type_t type, const size_t rawDataSize, const uint8_t *pRawData, uint32_t &metricValueCount, zet_typed_value_t *pCalculatedData) { + bool dataOverflow = false; StallSumIpDataMap_t stallSumIpDataMap; // MAX_METRIC_VALUES is not supported yet. @@ -241,7 +242,7 @@ ze_result_t IpSamplingMetricGroupImp::getCalculatedMetricValues(const zet_metric const uint32_t rawReportCount = static_cast(rawDataSize) / rawReportSize; for (const uint8_t *pRawIpData = pRawData; pRawIpData < pRawData + (rawReportCount * rawReportSize); pRawIpData += rawReportSize) { - stallIpDataMapUpdate(stallSumIpDataMap, pRawIpData); + dataOverflow |= stallIpDataMapUpdate(stallSumIpDataMap, pRawIpData); } metricValueCount = std::min(metricValueCount, static_cast(stallSumIpDataMap.size()) * properties.metricCount); @@ -255,7 +256,7 @@ ze_result_t IpSamplingMetricGroupImp::getCalculatedMetricValues(const zet_metric ipDataValues.clear(); } - return ZE_RESULT_SUCCESS; + return dataOverflow ? ZE_RESULT_WARNING_DROPPED_DATA : ZE_RESULT_SUCCESS; } /* @@ -278,7 +279,7 @@ ze_result_t IpSamplingMetricGroupImp::getCalculatedMetricValues(const zet_metric * * total size 64 bytes */ -void IpSamplingMetricGroupImp::stallIpDataMapUpdate(StallSumIpDataMap_t &stallSumIpDataMap, const uint8_t *pRawIpData) { +bool IpSamplingMetricGroupImp::stallIpDataMapUpdate(StallSumIpDataMap_t &stallSumIpDataMap, const uint8_t *pRawIpData) { const uint8_t *tempAddr = pRawIpData; uint64_t ip = 0ULL; @@ -314,9 +315,7 @@ void IpSamplingMetricGroupImp::stallIpDataMapUpdate(StallSumIpDataMap_t &stallSu memcpy_s(reinterpret_cast(&stallCntrInfo), sizeof(stallCntrInfo), tempAddr, sizeof(stallCntrInfo)); constexpr int overflowDropFlag = (1 << 8); - if (stallCntrInfo.flags & overflowDropFlag) { - PRINT_DEBUG_STRING(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Stall Sampling Data Lost %s\n", " "); - } + return stallCntrInfo.flags & overflowDropFlag; } // The order of push_back calls must match the order of metricPropertiesList. diff --git a/level_zero/tools/source/metrics/metric_ip_sampling_source.h b/level_zero/tools/source/metrics/metric_ip_sampling_source.h index 243a3f4599..cd54ece5c2 100644 --- a/level_zero/tools/source/metrics/metric_ip_sampling_source.h +++ b/level_zero/tools/source/metrics/metric_ip_sampling_source.h @@ -95,7 +95,7 @@ struct IpSamplingMetricGroupImp : public IpSamplingMetricGroupBase { ze_result_t getCalculatedMetricValues(const zet_metric_group_calculation_type_t type, const size_t rawDataSize, const uint8_t *pRawData, uint32_t &metricValueCount, zet_typed_value_t *pCalculatedData); - void stallIpDataMapUpdate(StallSumIpDataMap_t &, const uint8_t *pRawIpData); + bool stallIpDataMapUpdate(StallSumIpDataMap_t &, const uint8_t *pRawIpData); void stallSumIpDataToTypedValues(uint64_t ip, StallSumIpData_t &sumIpData, std::vector &ipDataValues); IpSamplingMetricSourceImp &metricSource; }; diff --git a/level_zero/tools/test/unit_tests/sources/metrics/metric_ip_sampling_fixture.h b/level_zero/tools/test/unit_tests/sources/metrics/metric_ip_sampling_fixture.h index 406c244fc5..adf1b29a0e 100644 --- a/level_zero/tools/test/unit_tests/sources/metrics/metric_ip_sampling_fixture.h +++ b/level_zero/tools/test/unit_tests/sources/metrics/metric_ip_sampling_fixture.h @@ -65,7 +65,7 @@ class MetricIpSamplingCalculateMetricsFixture : public MetricIpSamplingFixture { public: std::vector rawDataVector = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1000, 0x01}, {1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1000, 0x02}, - {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 1001, 0x100}, // set the overflow bit in flags + {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 1001, 0x000}, {10, 90, 80, 70, 60, 50, 40, 30, 20, 10, 1000, 0x3}}; size_t rawDataVectorSize = sizeof(rawDataVector[0]) * rawDataVector.size(); @@ -90,6 +90,34 @@ class MetricIpSamplingCalculateMetricsFixture : public MetricIpSamplingFixture { {ZET_VALUE_TYPE_UINT64, {110}}, {ZET_VALUE_TYPE_UINT64, {110}}, {ZET_VALUE_TYPE_UINT64, {110}}}; + + std::vector rawDataVectorOverflow = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1000, 0x01}, + {1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1000, 0x02}, + {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 1001, 0x100}, // set the overflow bit in flags + {10, 90, 80, 70, 60, 50, 40, 30, 20, 10, 1000, 0x3}}; + + size_t rawDataVectorOverflowSize = sizeof(rawDataVectorOverflow[0]) * rawDataVectorOverflow.size(); + std::vector expectedMetricOverflowValues = { + {ZET_VALUE_TYPE_UINT64, {1}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {11}}, + {ZET_VALUE_TYPE_UINT64, {10}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}, + {ZET_VALUE_TYPE_UINT64, {110}}}; }; } // namespace ult diff --git a/level_zero/tools/test/unit_tests/sources/metrics/test_metric_ip_sampling_enumeration.cpp b/level_zero/tools/test/unit_tests/sources/metrics/test_metric_ip_sampling_enumeration.cpp index 85c4dccd36..8949dd5c42 100644 --- a/level_zero/tools/test/unit_tests/sources/metrics/test_metric_ip_sampling_enumeration.cpp +++ b/level_zero/tools/test/unit_tests/sources/metrics/test_metric_ip_sampling_enumeration.cpp @@ -418,6 +418,46 @@ TEST_F(MetricIpSamplingCalculateMetricsTest, GivenEnumerationIsSuccessfulWhenCal } } +TEST_F(MetricIpSamplingCalculateMetricsTest, GivenDataOverflowOccurredWhenStreamerReadDataIscalledThenCalculateMultipleMetricsValulesExpReturnsOverflowWarning) { + EXPECT_EQ(ZE_RESULT_SUCCESS, testDevices[0]->getMetricDeviceContext().enableMetricApi()); + + std::vector metricValues(30); + + for (auto device : testDevices) { + + uint32_t metricGroupCount = 0; + zetMetricGroupGet(device->toHandle(), &metricGroupCount, nullptr); + std::vector metricGroups; + metricGroups.resize(metricGroupCount); + ASSERT_EQ(zetMetricGroupGet(device->toHandle(), &metricGroupCount, metricGroups.data()), ZE_RESULT_SUCCESS); + ASSERT_NE(metricGroups[0], nullptr); + zet_metric_group_properties_t metricGroupProperties; + EXPECT_EQ(zetMetricGroupGetProperties(metricGroups[0], &metricGroupProperties), ZE_RESULT_SUCCESS); + EXPECT_EQ(strcmp(metricGroupProperties.name, "EuStallSampling"), 0); + + uint32_t setCount = 0; + uint32_t totalMetricValueCount = 0; + std::vector metricCounts(2); + EXPECT_EQ(L0::zetMetricGroupCalculateMultipleMetricValuesExp(metricGroups[0], + ZET_METRIC_GROUP_CALCULATION_TYPE_METRIC_VALUES, rawDataVectorOverflowSize, reinterpret_cast(rawDataVectorOverflow.data()), + &setCount, &totalMetricValueCount, metricCounts.data(), nullptr), + ZE_RESULT_SUCCESS); + EXPECT_TRUE(setCount == 1); + EXPECT_TRUE(totalMetricValueCount == 40); + EXPECT_EQ(L0::zetMetricGroupCalculateMultipleMetricValuesExp(metricGroups[0], + ZET_METRIC_GROUP_CALCULATION_TYPE_METRIC_VALUES, rawDataVectorOverflowSize, reinterpret_cast(rawDataVectorOverflow.data()), + &setCount, &totalMetricValueCount, metricCounts.data(), metricValues.data()), + ZE_RESULT_WARNING_DROPPED_DATA); + EXPECT_TRUE(setCount == 1); + EXPECT_TRUE(totalMetricValueCount == 20); + EXPECT_TRUE(metricCounts[0] == 20); + for (uint32_t i = 0; i < totalMetricValueCount; i++) { + EXPECT_TRUE(expectedMetricOverflowValues[i].type == metricValues[i].type); + EXPECT_TRUE(expectedMetricOverflowValues[i].value.ui64 == metricValues[i].value.ui64); + } + } +} + TEST_F(MetricIpSamplingCalculateMetricsTest, GivenEnumerationIsSuccessfulWithCALCULATIONTYPEMAXWhenCalculateMetricValuesIsCalledThenErrorUnknownIsReturned) { EXPECT_EQ(ZE_RESULT_SUCCESS, testDevices[0]->getMetricDeviceContext().enableMetricApi());