|
7 | 7 |
|
8 | 8 | #include "level_zero/tools/source/metrics/metric_ip_sampling_source.h" |
9 | 9 |
|
| 10 | +#include "level_zero/core/source/device/device_imp.h" |
10 | 11 | #include "level_zero/tools/source/metrics/metric.h" |
| 12 | +#include "level_zero/tools/source/metrics/metric_ip_sampling_streamer.h" |
11 | 13 | #include "level_zero/tools/source/metrics/os_metric_ip_sampling.h" |
12 | 14 | #include <level_zero/zet_api.h> |
13 | 15 |
|
@@ -35,6 +37,27 @@ bool IpSamplingMetricSourceImp::isAvailable() { |
35 | 37 |
|
36 | 38 | void IpSamplingMetricSourceImp::cacheMetricGroup() { |
37 | 39 |
|
| 40 | + if (metricDeviceContext.isImplicitScalingCapable()) { |
| 41 | + const auto deviceImp = static_cast<DeviceImp *>(&metricDeviceContext.getDevice()); |
| 42 | + std::vector<IpSamplingMetricGroupImp *> subDeviceMetricGroup = {}; |
| 43 | + subDeviceMetricGroup.reserve(deviceImp->subDevices.size()); |
| 44 | + |
| 45 | + // Prepare cached metric group for sub-devices |
| 46 | + for (auto &subDevice : deviceImp->subDevices) { |
| 47 | + IpSamplingMetricSourceImp &source = subDevice->getMetricDeviceContext().getMetricSource<IpSamplingMetricSourceImp>(); |
| 48 | + // 1 metric group available for IP Sampling |
| 49 | + uint32_t count = 1; |
| 50 | + zet_metric_group_handle_t hMetricGroup = {}; |
| 51 | + const auto result = source.metricGroupGet(&count, &hMetricGroup); |
| 52 | + // Getting MetricGroup from sub-device cannot fail, since RootDevice is successful |
| 53 | + UNRECOVERABLE_IF(result != ZE_RESULT_SUCCESS); |
| 54 | + subDeviceMetricGroup.push_back(static_cast<IpSamplingMetricGroupImp *>(MetricGroup::fromHandle(hMetricGroup))); |
| 55 | + } |
| 56 | + |
| 57 | + cachedMetricGroup = MultiDeviceIpSamplingMetricGroupImp::create(subDeviceMetricGroup); |
| 58 | + return; |
| 59 | + } |
| 60 | + |
38 | 61 | std::vector<IpSamplingMetricImp> metrics = {}; |
39 | 62 | metrics.reserve(ipSamplinMetricCount); |
40 | 63 |
|
@@ -75,7 +98,7 @@ void IpSamplingMetricSourceImp::cacheMetricGroup() { |
75 | 98 | metrics.push_back(IpSamplingMetricImp(metricProperties)); |
76 | 99 | } |
77 | 100 |
|
78 | | - cachedMetricGroup = IpSamplingMetricGroupImp::create(metrics); |
| 101 | + cachedMetricGroup = IpSamplingMetricGroupImp::create(*this, metrics); |
79 | 102 | DEBUG_BREAK_IF(cachedMetricGroup == nullptr); |
80 | 103 | } |
81 | 104 |
|
@@ -110,7 +133,8 @@ void IpSamplingMetricSourceImp::setMetricOsInterface(std::unique_ptr<MetricIpSam |
110 | 133 | this->metricOsInterface = std::move(metricOsInterface); |
111 | 134 | } |
112 | 135 |
|
113 | | -IpSamplingMetricGroupImp::IpSamplingMetricGroupImp(std::vector<IpSamplingMetricImp> &metrics) { |
| 136 | +IpSamplingMetricGroupImp::IpSamplingMetricGroupImp(IpSamplingMetricSourceImp &metricSource, |
| 137 | + std::vector<IpSamplingMetricImp> &metrics) : metricSource(metricSource) { |
114 | 138 | this->metrics.reserve(metrics.size()); |
115 | 139 | for (const auto &metric : metrics) { |
116 | 140 | this->metrics.push_back(std::make_unique<IpSamplingMetricImp>(metric)); |
@@ -341,28 +365,52 @@ void IpSamplingMetricGroupImp::stallSumIpDataToTypedValues(uint64_t ip, |
341 | 365 | ipDataValues.push_back(tmpValueData); |
342 | 366 | } |
343 | 367 |
|
344 | | -bool IpSamplingMetricGroupImp::activate() { |
345 | | - // There is no hardware specific activation, since metric collection starts in streamer open |
346 | | - return true; |
| 368 | +zet_metric_group_handle_t IpSamplingMetricGroupImp::getMetricGroupForSubDevice(const uint32_t subDeviceIndex) { |
| 369 | + return toHandle(); |
347 | 370 | } |
348 | 371 |
|
349 | | -bool IpSamplingMetricGroupImp::deactivate() { |
350 | | - return true; |
| 372 | +std::unique_ptr<IpSamplingMetricGroupImp> IpSamplingMetricGroupImp::create(IpSamplingMetricSourceImp &metricSource, |
| 373 | + std::vector<IpSamplingMetricImp> &ipSamplingMetrics) { |
| 374 | + return std::unique_ptr<IpSamplingMetricGroupImp>(new (std::nothrow) IpSamplingMetricGroupImp(metricSource, ipSamplingMetrics)); |
351 | 375 | } |
352 | | -zet_metric_group_handle_t IpSamplingMetricGroupImp::getMetricGroupForSubDevice(const uint32_t subDeviceIndex) { |
353 | | - return toHandle(); |
| 376 | + |
| 377 | +ze_result_t MultiDeviceIpSamplingMetricGroupImp::getProperties(zet_metric_group_properties_t *pProperties) { |
| 378 | + return subDeviceMetricGroup[0]->getProperties(pProperties); |
354 | 379 | } |
355 | 380 |
|
356 | | -ze_result_t IpSamplingMetricGroupImp::metricQueryPoolCreate( |
357 | | - zet_context_handle_t hContext, |
358 | | - zet_device_handle_t hDevice, |
359 | | - const zet_metric_query_pool_desc_t *desc, |
360 | | - zet_metric_query_pool_handle_t *phMetricQueryPool) { |
361 | | - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; |
| 381 | +ze_result_t MultiDeviceIpSamplingMetricGroupImp::metricGet(uint32_t *pCount, zet_metric_handle_t *phMetrics) { |
| 382 | + return subDeviceMetricGroup[0]->metricGet(pCount, phMetrics); |
| 383 | +} |
| 384 | + |
| 385 | +ze_result_t MultiDeviceIpSamplingMetricGroupImp::calculateMetricValues(const zet_metric_group_calculation_type_t type, size_t rawDataSize, |
| 386 | + const uint8_t *pRawData, uint32_t *pMetricValueCount, |
| 387 | + zet_typed_value_t *pMetricValues) { |
| 388 | + return subDeviceMetricGroup[0]->calculateMetricValues(type, rawDataSize, pRawData, pMetricValueCount, pMetricValues); |
| 389 | +} |
| 390 | + |
| 391 | +ze_result_t MultiDeviceIpSamplingMetricGroupImp::calculateMetricValuesExp(const zet_metric_group_calculation_type_t type, size_t rawDataSize, |
| 392 | + const uint8_t *pRawData, uint32_t *pSetCount, |
| 393 | + uint32_t *pTotalMetricValueCount, uint32_t *pMetricCounts, |
| 394 | + zet_typed_value_t *pMetricValues) { |
| 395 | + |
| 396 | + return subDeviceMetricGroup[0]->calculateMetricValuesExp(type, rawDataSize, pRawData, pSetCount, pTotalMetricValueCount, |
| 397 | + pMetricCounts, pMetricValues); |
| 398 | +} |
| 399 | + |
| 400 | +zet_metric_group_handle_t MultiDeviceIpSamplingMetricGroupImp::getMetricGroupForSubDevice(const uint32_t subDeviceIndex) { |
| 401 | + return subDeviceMetricGroup[subDeviceIndex]->toHandle(); |
| 402 | +} |
| 403 | + |
| 404 | +void MultiDeviceIpSamplingMetricGroupImp::closeSubDeviceStreamers(std::vector<IpSamplingMetricStreamerImp *> &subDeviceStreamers) { |
| 405 | + for (auto streamer : subDeviceStreamers) { |
| 406 | + streamer->close(); |
| 407 | + } |
362 | 408 | } |
363 | 409 |
|
364 | | -std::unique_ptr<IpSamplingMetricGroupImp> IpSamplingMetricGroupImp::create(std::vector<IpSamplingMetricImp> &ipSamplingMetrics) { |
365 | | - return std::unique_ptr<IpSamplingMetricGroupImp>(new (std::nothrow) IpSamplingMetricGroupImp(ipSamplingMetrics)); |
| 410 | +std::unique_ptr<MultiDeviceIpSamplingMetricGroupImp> MultiDeviceIpSamplingMetricGroupImp::create( |
| 411 | + std::vector<IpSamplingMetricGroupImp *> &subDeviceMetricGroup) { |
| 412 | + UNRECOVERABLE_IF(subDeviceMetricGroup.size() == 0); |
| 413 | + return std::unique_ptr<MultiDeviceIpSamplingMetricGroupImp>(new (std::nothrow) MultiDeviceIpSamplingMetricGroupImp(subDeviceMetricGroup)); |
366 | 414 | } |
367 | 415 |
|
368 | 416 | IpSamplingMetricImp::IpSamplingMetricImp(zet_metric_properties_t &properties) : properties(properties) { |
|
0 commit comments