mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 12:23:05 +08:00
Metric: Add sub device support for zetMetricStreamerReadData
Adding sub device support for Metric Streamer Read Data Signed-off-by: Joshua Santosh Ranjan <joshua.santosh.ranjan@intel.com> Signed-off-by: Robert Krzemien <robert.krzemien@intel.com> Related-To: LOCI-2460
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
6b299a3ab0
commit
1ee80cd382
@@ -17,28 +17,52 @@ namespace L0 {
|
||||
|
||||
ze_result_t MetricStreamerImp::readData(uint32_t maxReportCount, size_t *pRawDataSize,
|
||||
uint8_t *pRawData) {
|
||||
DEBUG_BREAK_IF(rawReportSize == 0);
|
||||
ze_result_t result = ZE_RESULT_SUCCESS;
|
||||
|
||||
auto metricGroup = MetricGroup::fromHandle(hMetricGroup);
|
||||
if (metricStreamers.size() > 0) {
|
||||
auto pMetricStreamer = MetricStreamer::fromHandle(metricStreamers[0]);
|
||||
// Return required size if requested.
|
||||
if (*pRawDataSize == 0) {
|
||||
*pRawDataSize = static_cast<MetricStreamerImp *>(pMetricStreamer)->getRequiredBufferSize(maxReportCount) * metricStreamers.size();
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
// Return required size if requested.
|
||||
if (*pRawDataSize == 0) {
|
||||
*pRawDataSize = getRequiredBufferSize(maxReportCount);
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
size_t sizePerSubDevice = *pRawDataSize / metricStreamers.size();
|
||||
DEBUG_BREAK_IF(sizePerSubDevice == 0);
|
||||
*pRawDataSize = 0;
|
||||
for (auto metricStreamerHandle : metricStreamers) {
|
||||
|
||||
// User is expected to allocate space.
|
||||
if (pRawData == nullptr) {
|
||||
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
||||
}
|
||||
size_t readSize = sizePerSubDevice;
|
||||
pMetricStreamer = MetricStreamer::fromHandle(metricStreamerHandle);
|
||||
result = pMetricStreamer->readData(maxReportCount, &readSize, pRawData + *pRawDataSize);
|
||||
// Return at first error.
|
||||
if (result != ZE_RESULT_SUCCESS) {
|
||||
return result;
|
||||
}
|
||||
*pRawDataSize += readSize;
|
||||
}
|
||||
} else {
|
||||
|
||||
// Retrieve the number of reports that fit into the buffer.
|
||||
uint32_t reportCount = static_cast<uint32_t>(*pRawDataSize / rawReportSize);
|
||||
DEBUG_BREAK_IF(rawReportSize == 0);
|
||||
auto metricGroup = MetricGroup::fromHandle(hMetricGroup);
|
||||
|
||||
// Read streamer data.
|
||||
const ze_result_t result = metricGroup->readIoStream(reportCount, *pRawData);
|
||||
if (result == ZE_RESULT_SUCCESS) {
|
||||
*pRawDataSize = reportCount * rawReportSize;
|
||||
// Return required size if requested.
|
||||
if (*pRawDataSize == 0) {
|
||||
*pRawDataSize = getRequiredBufferSize(maxReportCount);
|
||||
return ZE_RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
// User is expected to allocate space.
|
||||
DEBUG_BREAK_IF(pRawData == nullptr);
|
||||
|
||||
// Retrieve the number of reports that fit into the buffer.
|
||||
uint32_t reportCount = static_cast<uint32_t>(*pRawDataSize / rawReportSize);
|
||||
|
||||
// Read streamer data.
|
||||
result = metricGroup->readIoStream(reportCount, *pRawData);
|
||||
if (result == ZE_RESULT_SUCCESS) {
|
||||
*pRawDataSize = reportCount * rawReportSize;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -1434,5 +1434,98 @@ TEST_F(MetricStreamerMultiDeviceTest, givenValidArgumentsWhenZetMetricStreamerOp
|
||||
EXPECT_EQ(zeEventPoolDestroy(eventPoolHandle), ZE_RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
TEST_F(MetricStreamerMultiDeviceTest, givenValidArgumentsWhenZetMetricStreamerReadDataIsCalledThenReturnsSuccess) {
|
||||
|
||||
zet_device_handle_t metricDeviceHandle = devices[0]->toHandle();
|
||||
auto &deviceImp = *static_cast<DeviceImp *>(devices[0]);
|
||||
const uint32_t subDeviceCount = static_cast<uint32_t>(deviceImp.subDevices.size());
|
||||
|
||||
ze_event_handle_t eventHandle = {};
|
||||
|
||||
zet_metric_streamer_handle_t streamerHandle = {};
|
||||
zet_metric_streamer_desc_t streamerDesc = {};
|
||||
|
||||
streamerDesc.stype = ZET_STRUCTURE_TYPE_METRIC_STREAMER_DESC;
|
||||
streamerDesc.notifyEveryNReports = 32768;
|
||||
streamerDesc.samplingPeriod = 1000;
|
||||
|
||||
Mock<MetricGroup> metricGroup;
|
||||
zet_metric_group_handle_t metricGroupHandle = metricGroup.toHandle();
|
||||
|
||||
metricsDeviceParams.ConcurrentGroupsCount = 1;
|
||||
|
||||
Mock<IConcurrentGroup_1_5> metricsConcurrentGroup;
|
||||
TConcurrentGroupParams_1_0 metricsConcurrentGroupParams = {};
|
||||
metricsConcurrentGroupParams.MetricSetsCount = 1;
|
||||
metricsConcurrentGroupParams.SymbolName = "OA";
|
||||
metricsConcurrentGroupParams.Description = "OA description";
|
||||
|
||||
Mock<MetricsDiscovery::IMetricSet_1_5> metricsSet;
|
||||
MetricsDiscovery::TMetricSetParams_1_4 metricsSetParams = {};
|
||||
metricsSetParams.ApiMask = MetricsDiscovery::API_TYPE_IOSTREAM;
|
||||
metricsSetParams.MetricsCount = 0;
|
||||
metricsSetParams.SymbolName = "Metric set name";
|
||||
metricsSetParams.ShortName = "Metric set description";
|
||||
metricsSetParams.RawReportSize = 256;
|
||||
|
||||
openMetricsAdapter();
|
||||
|
||||
EXPECT_CALL(metricsDevice, GetParams())
|
||||
.WillRepeatedly(Return(&metricsDeviceParams));
|
||||
|
||||
EXPECT_CALL(metricsDevice, GetConcurrentGroup(_))
|
||||
.Times(subDeviceCount)
|
||||
.WillRepeatedly(Return(&metricsConcurrentGroup));
|
||||
|
||||
EXPECT_CALL(metricsConcurrentGroup, GetParams())
|
||||
.Times(subDeviceCount)
|
||||
.WillRepeatedly(Return(&metricsConcurrentGroupParams));
|
||||
|
||||
EXPECT_CALL(metricsConcurrentGroup, GetMetricSet(_))
|
||||
.WillRepeatedly(Return(&metricsSet));
|
||||
|
||||
EXPECT_CALL(metricsSet, GetParams())
|
||||
.WillRepeatedly(Return(&metricsSetParams));
|
||||
|
||||
EXPECT_CALL(metricsSet, SetApiFiltering(_))
|
||||
.WillRepeatedly(Return(TCompletionCode::CC_OK));
|
||||
|
||||
EXPECT_CALL(metricsConcurrentGroup, OpenIoStream(_, _, _, _))
|
||||
.Times(subDeviceCount)
|
||||
.WillRepeatedly(Return(TCompletionCode::CC_OK));
|
||||
|
||||
EXPECT_CALL(metricsConcurrentGroup, ReadIoStream(_, _, _))
|
||||
.Times(subDeviceCount)
|
||||
.WillRepeatedly(Return(TCompletionCode::CC_OK));
|
||||
|
||||
EXPECT_CALL(metricsConcurrentGroup, CloseIoStream())
|
||||
.Times(subDeviceCount)
|
||||
.WillRepeatedly(Return(TCompletionCode::CC_OK));
|
||||
|
||||
uint32_t metricGroupCount = 0;
|
||||
EXPECT_EQ(zetMetricGroupGet(metricDeviceHandle, &metricGroupCount, nullptr), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(metricGroupCount, 1u);
|
||||
|
||||
EXPECT_EQ(zetMetricGroupGet(metricDeviceHandle, &metricGroupCount, &metricGroupHandle), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(metricGroupCount, 1u);
|
||||
EXPECT_NE(metricGroupHandle, nullptr);
|
||||
|
||||
EXPECT_EQ(zetContextActivateMetricGroups(context->toHandle(), metricDeviceHandle, 1, &metricGroupHandle), ZE_RESULT_SUCCESS);
|
||||
|
||||
EXPECT_EQ(zetMetricStreamerOpen(context->toHandle(), metricDeviceHandle, metricGroupHandle, &streamerDesc, eventHandle, &streamerHandle), ZE_RESULT_SUCCESS);
|
||||
EXPECT_NE(streamerHandle, nullptr);
|
||||
|
||||
size_t rawSize = 0;
|
||||
uint32_t reportCount = 256;
|
||||
EXPECT_EQ(zetMetricStreamerReadData(streamerHandle, reportCount, &rawSize, nullptr), ZE_RESULT_SUCCESS);
|
||||
|
||||
std::vector<uint8_t> rawData;
|
||||
rawData.resize(rawSize);
|
||||
size_t rawRequestSize = rawSize;
|
||||
EXPECT_EQ(zetMetricStreamerReadData(streamerHandle, reportCount, &rawSize, rawData.data()), ZE_RESULT_SUCCESS);
|
||||
EXPECT_EQ(rawSize, rawRequestSize);
|
||||
EXPECT_EQ(zetMetricStreamerClose(streamerHandle), ZE_RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
} // namespace ult
|
||||
} // namespace L0
|
||||
|
||||
Reference in New Issue
Block a user