Skip to content

Commit b5e0d32

Browse files
Metric Api: Fix activation for sub devices
Resolves: LOCI-2611 Signed-off-by: Robert Krzemien <[email protected]>
1 parent 0b1c3d2 commit b5e0d32

File tree

8 files changed

+301
-22
lines changed

8 files changed

+301
-22
lines changed

level_zero/core/source/device/device_imp.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,13 @@ MetricContext &DeviceImp::getMetricContext() { return *metricContext; }
679679

680680
void DeviceImp::activateMetricGroups() {
681681
if (metricContext != nullptr) {
682-
metricContext->activateMetricGroups();
682+
if (metricContext->isMultiDeviceCapable()) {
683+
for (uint32_t i = 0; i < numSubDevices; i++) {
684+
subDevices[i]->getMetricContext().activateMetricGroups();
685+
}
686+
} else {
687+
metricContext->activateMetricGroups();
688+
}
683689
}
684690
}
685691
uint32_t DeviceImp::getMaxNumHwThreads() const { return maxNumHwThreads; }

level_zero/tools/source/metrics/metric.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct MetricGroupDomains {
3535
bool activateEventMetricGroup(const zet_metric_group_handle_t hMetricGroup);
3636

3737
protected:
38-
MetricsLibrary &metricsLibrary;
38+
MetricContext &metricContext;
3939

4040
// Map holds activated domains and associated metric groups.
4141
// Content: <domain number, pair<metric group, is activated on gpu flag>
@@ -250,7 +250,7 @@ bool MetricContext::isMetricApiAvailable() {
250250
}
251251

252252
MetricGroupDomains::MetricGroupDomains(MetricContext &metricContext)
253-
: metricsLibrary(metricContext.getMetricsLibrary()) {}
253+
: metricContext(metricContext) {}
254254

255255
ze_result_t MetricGroupDomains::activateDeferred(const uint32_t subDeviceIndex,
256256
const uint32_t count,
@@ -329,7 +329,7 @@ ze_result_t MetricGroupDomains::activate() {
329329

330330
bool MetricGroupDomains::activateEventMetricGroup(const zet_metric_group_handle_t hMetricGroup) {
331331
// Obtain metric group configuration handle from metrics library.
332-
auto hConfiguration = metricsLibrary.getConfiguration(hMetricGroup);
332+
auto hConfiguration = metricContext.getMetricsLibrary().getConfiguration(hMetricGroup);
333333

334334
// Validate metrics library handle.
335335
if (!hConfiguration.IsValid()) {
@@ -338,7 +338,7 @@ bool MetricGroupDomains::activateEventMetricGroup(const zet_metric_group_handle_
338338
}
339339

340340
// Write metric group configuration to gpu.
341-
const bool result = metricsLibrary.activateConfiguration(hConfiguration);
341+
const bool result = metricContext.getMetricsLibrary().activateConfiguration(hConfiguration);
342342

343343
DEBUG_BREAK_IF(!result);
344344
return result;
@@ -356,12 +356,12 @@ ze_result_t MetricGroupDomains::deactivate() {
356356
: false;
357357
auto hConfigurationEmpty = ConfigurationHandle_1_0{};
358358
auto hConfiguration = metricGroupEventBased
359-
? metricsLibrary.getConfiguration(hMetricGroup)
359+
? metricContext.getMetricsLibrary().getConfiguration(hMetricGroup)
360360
: hConfigurationEmpty;
361361

362362
// Deactivate metric group configuration using metrics library.
363363
if (hConfiguration.IsValid() && metricGroupActivated) {
364-
metricsLibrary.deactivateConfiguration(hConfiguration);
364+
metricContext.getMetricsLibrary().deactivateConfiguration(hConfiguration);
365365
}
366366

367367
// Mark domain as free.

level_zero/tools/source/metrics/metric_enumeration_imp.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,11 +666,14 @@ ze_result_t MetricGroupImp::calculateMetricValuesExp(const zet_metric_group_calc
666666
pMetricCounts[0] = *pTotalMetricValueCount;
667667

668668
} else {
669-
for (size_t i = 0; i < metricGroupCount; i++) {
669+
UNRECOVERABLE_IF(*pSetCount > metricGroupCount);
670+
const uint32_t maxTotalMetricValueCount = *pTotalMetricValueCount;
671+
*pTotalMetricValueCount = 0;
672+
for (size_t i = 0; i < *pSetCount; i++) {
670673
auto &metricGroup = *static_cast<MetricGroupImp *>(metricGroups[i]);
671674
const uint32_t dataSize = pRawDataSizesUnpacked[i];
672675
const uint8_t *pRawDataOffset = pRawDataOffsetUnpacked + pRawDataOffsetsUnpacked[i];
673-
pMetricCounts[i] = *pTotalMetricValueCount;
676+
pMetricCounts[i] = maxTotalMetricValueCount;
674677
result = metricGroup.getCalculatedMetricValues(type, dataSize, pRawDataOffset, pMetricCounts[i], pMetricValues);
675678

676679
if (!result) {
@@ -679,6 +682,9 @@ ze_result_t MetricGroupImp::calculateMetricValuesExp(const zet_metric_group_calc
679682
}
680683
break;
681684
}
685+
686+
*pTotalMetricValueCount += pMetricCounts[i];
687+
pMetricValues += pMetricCounts[i];
682688
}
683689
}
684690
}

level_zero/tools/source/metrics/metric_query_imp.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ ze_result_t MetricQueryImp::getData(size_t *pRawDataSize, uint8_t *pRawData) {
702702
pRawDataHeader->rawDataSizes = static_cast<uint32_t>(pRawDataHeader->rawDataOffsets + (sizeof(uint32_t) * metricQueriesSize));
703703
pRawDataHeader->rawDataOffset = static_cast<uint32_t>(pRawDataHeader->rawDataSizes + (sizeof(uint32_t) * metricQueriesSize));
704704

705-
size_t sizePerSubDevice = (*pRawDataSize - pRawDataHeader->rawDataOffset) / metricQueriesSize;
705+
const size_t sizePerSubDevice = (*pRawDataSize - pRawDataHeader->rawDataOffset) / metricQueriesSize;
706706
DEBUG_BREAK_IF(sizePerSubDevice == 0);
707707
*pRawDataSize = pRawDataHeader->rawDataOffset;
708708

@@ -712,18 +712,17 @@ ze_result_t MetricQueryImp::getData(size_t *pRawDataSize, uint8_t *pRawData) {
712712

713713
for (size_t i = 0; i < metricQueriesSize; ++i) {
714714

715-
const uint32_t rawDataOffset = (i != 0) ? pRawDataOffsetsUnpacked[i - 1] : 0;
715+
size_t getDataSize = sizePerSubDevice;
716+
const uint32_t rawDataOffset = (i != 0) ? (pRawDataSizesUnpacked[i - 1] + pRawDataOffsetsUnpacked[i - 1]) : 0;
716717
auto pMetricQuery = MetricQuery::fromHandle(metricQueries[i]);
717-
ze_result_t tmpResult = pMetricQuery->getData(&sizePerSubDevice, pRawDataUnpacked + rawDataOffset);
718-
718+
ze_result_t tmpResult = pMetricQuery->getData(&getDataSize, pRawDataUnpacked + rawDataOffset);
719+
// Return at first error.
719720
if (tmpResult != ZE_RESULT_SUCCESS) {
720-
result = false;
721-
break;
721+
return tmpResult;
722722
}
723-
724-
pRawDataSizesUnpacked[i] = static_cast<uint32_t>(sizePerSubDevice);
723+
pRawDataSizesUnpacked[i] = static_cast<uint32_t>(getDataSize);
725724
pRawDataOffsetsUnpacked[i] = (i != 0) ? pRawDataOffsetsUnpacked[i - 1] + pRawDataSizesUnpacked[i] : 0;
726-
*pRawDataSize += sizePerSubDevice;
725+
*pRawDataSize += getDataSize;
727726
}
728727
}
729728

level_zero/tools/source/metrics/metric_streamer_imp.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@ ze_result_t MetricStreamerImp::readData(uint32_t maxReportCount, size_t *pRawDat
5252
for (size_t i = 0; i < metricStreamerSize; ++i) {
5353

5454
size_t readSize = sizePerSubDevice;
55-
auto metricStreamerHandle = metricStreamers[i];
56-
const uint32_t rawDataOffset = (i != 0) ? pRawDataOffsetsUnpacked[i - 1] : 0;
57-
pMetricStreamer = MetricStreamer::fromHandle(metricStreamerHandle);
55+
const uint32_t rawDataOffset = (i != 0) ? (pRawDataSizesUnpacked[i - 1] + pRawDataOffsetsUnpacked[i - 1]) : 0;
56+
pMetricStreamer = MetricStreamer::fromHandle(metricStreamers[i]);
5857
result = pMetricStreamer->readData(maxReportCount, &readSize, pRawDataUnpacked + rawDataOffset);
5958
// Return at first error.
6059
if (result != ZE_RESULT_SUCCESS) {

level_zero/tools/test/unit_tests/sources/metrics/mock_metric.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ StatusCode MockMetricsLibraryApi::ConfigurationDeactivate(const ConfigurationHan
395395
}
396396

397397
StatusCode MockMetricsLibraryApi::ConfigurationDelete(const ConfigurationHandle_1_0 handle) {
398-
return Mock<MetricsLibrary>::g_mockApi->MockConfigurationDeactivate(handle);
398+
return Mock<MetricsLibrary>::g_mockApi->MockConfigurationDelete(handle);
399399
}
400400

401401
StatusCode MockMetricsLibraryApi::GetData(GetReportData_1_0 *data) {

level_zero/tools/test/unit_tests/sources/metrics/test_metric_query_pool_2.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,5 +433,137 @@ TEST_F(MetricQueryPoolTest, givenUninitializedMetricEnumerationWhenGetQueryRepor
433433
EXPECT_EQ(invalidSize, 0u);
434434
}
435435

436+
TEST_F(MetricQueryPoolTest, givenCorrectArgumentsWhenActivateMetricGroupsIsCalledThenReturnsSuccess) {
437+
438+
zet_device_handle_t metricDevice = device->toHandle();
439+
440+
metricsDeviceParams.ConcurrentGroupsCount = 1;
441+
442+
Mock<IConcurrentGroup_1_5> metricsConcurrentGroup;
443+
TConcurrentGroupParams_1_0 metricsConcurrentGroupParams = {};
444+
metricsConcurrentGroupParams.MetricSetsCount = 1;
445+
metricsConcurrentGroupParams.SymbolName = "OA";
446+
metricsConcurrentGroupParams.Description = "OA description";
447+
448+
Mock<MetricsDiscovery::IMetricSet_1_5> metricsSet;
449+
MetricsDiscovery::TMetricSetParams_1_4 metricsSetParams = {};
450+
metricsSetParams.ApiMask = MetricsDiscovery::API_TYPE_OCL;
451+
metricsSetParams.MetricsCount = 0;
452+
metricsSetParams.SymbolName = "Metric set name";
453+
metricsSetParams.ShortName = "Metric set description";
454+
metricsSetParams.MetricsCount = 1;
455+
456+
Mock<IMetric_1_0> metric;
457+
TMetricParams_1_0 metricParams = {};
458+
metricParams.SymbolName = "Metric symbol name";
459+
metricParams.ShortName = "Metric short name";
460+
metricParams.LongName = "Metric long name";
461+
metricParams.ResultType = MetricsDiscovery::TMetricResultType::RESULT_UINT64;
462+
metricParams.MetricType = MetricsDiscovery::TMetricType::METRIC_TYPE_RATIO;
463+
464+
zet_metric_group_handle_t metricGroupHandle = {};
465+
466+
zet_metric_group_properties_t metricGroupProperties = {};
467+
metricGroupProperties.samplingType = ZET_METRIC_GROUP_SAMPLING_TYPE_FLAG_EVENT_BASED;
468+
469+
TypedValue_1_0 value = {};
470+
value.Type = ValueType::Uint32;
471+
value.ValueUInt32 = 64;
472+
473+
ConfigurationHandle_1_0 metricsLibraryConfigurationHandle = {&value};
474+
ContextHandle_1_0 metricsLibraryContextHandle = {&value};
475+
476+
openMetricsAdapter();
477+
478+
EXPECT_CALL(metricsDevice, GetParams())
479+
.WillRepeatedly(Return(&metricsDeviceParams));
480+
481+
EXPECT_CALL(metricsDevice, GetConcurrentGroup(_))
482+
.Times(1)
483+
.WillOnce(Return(&metricsConcurrentGroup));
484+
485+
EXPECT_CALL(metricsConcurrentGroup, GetParams())
486+
.Times(1)
487+
.WillOnce(Return(&metricsConcurrentGroupParams));
488+
489+
EXPECT_CALL(metricsConcurrentGroup, GetMetricSet(_))
490+
.WillRepeatedly(Return(&metricsSet));
491+
492+
EXPECT_CALL(metricsSet, GetParams())
493+
.WillRepeatedly(Return(&metricsSetParams));
494+
495+
EXPECT_CALL(metricsSet, GetMetric(_))
496+
.Times(1)
497+
.WillOnce(Return(&metric));
498+
499+
EXPECT_CALL(metricsSet, Activate())
500+
.Times(1)
501+
.WillOnce(Return(MetricsDiscovery::CC_OK));
502+
503+
EXPECT_CALL(metricsSet, Deactivate())
504+
.Times(1)
505+
.WillOnce(Return(MetricsDiscovery::CC_OK));
506+
507+
EXPECT_CALL(metric, GetParams())
508+
.Times(1)
509+
.WillOnce(Return(&metricParams));
510+
511+
EXPECT_CALL(metricsSet, SetApiFiltering(_))
512+
.WillRepeatedly(Return(TCompletionCode::CC_OK));
513+
514+
EXPECT_CALL(*mockMetricEnumeration, isInitialized())
515+
.Times(1)
516+
.WillOnce(Return(true));
517+
518+
EXPECT_CALL(*mockMetricsLibrary, getContextData(_, _))
519+
.Times(1)
520+
.WillOnce(Return(true));
521+
522+
EXPECT_CALL(*mockMetricsLibrary, load())
523+
.Times(0);
524+
525+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockContextCreate(_, _, _))
526+
.Times(1)
527+
.WillOnce(DoAll(::testing::SetArgPointee<2>(metricsLibraryContextHandle), Return(StatusCode::Success)));
528+
529+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockContextDelete(_))
530+
.Times(1)
531+
.WillOnce(Return(StatusCode::Success));
532+
533+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockConfigurationCreate(_, _))
534+
.Times(1)
535+
.WillOnce(DoAll(::testing::SetArgPointee<1>(metricsLibraryConfigurationHandle), Return(StatusCode::Success)));
536+
537+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockConfigurationActivate(_, _))
538+
.Times(1)
539+
.WillOnce(Return(StatusCode::Success));
540+
541+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockConfigurationDeactivate(_))
542+
.Times(1)
543+
.WillOnce(Return(StatusCode::Success));
544+
545+
EXPECT_CALL(*mockMetricsLibrary->g_mockApi, MockConfigurationDelete(_))
546+
.Times(1)
547+
.WillOnce(Return(StatusCode::Success));
548+
549+
// Metric group count.
550+
uint32_t metricGroupCount = 0;
551+
EXPECT_EQ(zetMetricGroupGet(device->toHandle(), &metricGroupCount, nullptr), ZE_RESULT_SUCCESS);
552+
EXPECT_EQ(metricGroupCount, 1u);
553+
554+
// Metric group handle.
555+
EXPECT_EQ(zetMetricGroupGet(device->toHandle(), &metricGroupCount, &metricGroupHandle), ZE_RESULT_SUCCESS);
556+
EXPECT_EQ(metricGroupCount, 1u);
557+
EXPECT_NE(metricGroupHandle, nullptr);
558+
559+
// Activate metric group.
560+
EXPECT_EQ(zetContextActivateMetricGroups(context->toHandle(), device->toHandle(), 1, &metricGroupHandle), ZE_RESULT_SUCCESS);
561+
562+
// Activate metric groups.
563+
device->activateMetricGroups();
564+
565+
EXPECT_EQ(zetContextActivateMetricGroups(context->toHandle(), metricDevice, 0, nullptr), ZE_RESULT_SUCCESS);
566+
}
567+
436568
} // namespace ult
437569
} // namespace L0

0 commit comments

Comments
 (0)