Fix Metric Activation Procedure

This patch implements Deactivate previously activated metric groups,
if they are not part of the current list

Related-To: LOCI-3160

Signed-off-by: Joshua Santosh Ranjan <joshua.santosh.ranjan@intel.com>
This commit is contained in:
Joshua Santosh Ranjan
2022-07-04 11:02:11 +00:00
committed by Compute-Runtime-Automation
parent 6cb44ae0d9
commit 6292a3304a
4 changed files with 56 additions and 36 deletions

View File

@@ -83,14 +83,40 @@ ze_result_t MetricDeviceContext::metricGroupGet(uint32_t *pCount, zet_metric_gro
return result;
}
ze_result_t MetricDeviceContext::activateMetricGroupsDeferred(uint32_t count, zet_metric_group_handle_t *phMetricGroups) {
void MetricDeviceContext::activateMetricGroupsDeferred(uint32_t count, zet_metric_group_handle_t *phMetricGroups) {
// Activation: postpone until zetMetricStreamerOpen or zeCommandQueueExecuteCommandLists
// Deactivation: execute immediately.
if (phMetricGroups == nullptr) {
return deActivateAllDomains();
deActivateAllDomains();
return;
}
auto isMetricGroupProvided = [phMetricGroups, count](const zet_metric_group_handle_t hMetricGroup) {
for (auto index = 0u; index < count; index++) {
if (hMetricGroup == phMetricGroups[index]) {
return true;
}
}
return false;
};
// Deactive existing metric groups which are not provided in phMetricGroups
std::vector<uint32_t> deactivateList = {};
for (const auto &[domainId, metricGroupPair] : domains) {
const auto &hMetricGroup = metricGroupPair.first;
if (isMetricGroupProvided(hMetricGroup) == false) {
deActivateDomain(domainId);
deactivateList.push_back(domainId);
}
}
// Remove deactivated ones from the map
for (const auto &domainId : deactivateList) {
domains.erase(domainId);
}
// Activate-deferred new metric groups if any
for (auto index = 0u; index < count; index++) {
zet_metric_group_handle_t hMetricGroup = MetricGroup::fromHandle(phMetricGroups[index])->getMetricGroupForSubDevice(subDeviceIndex);
@@ -102,17 +128,9 @@ ze_result_t MetricDeviceContext::activateMetricGroupsDeferred(uint32_t count, ze
continue;
}
// Domain empty; So create new deactiavted association.
if (domains[domain].first == nullptr) {
domains[domain].first = hMetricGroup;
domains[domain].second = false;
continue;
}
// Attempt to overwrite a previous association is an error.
return ZE_RESULT_ERROR_UNKNOWN;
domains[domain].first = hMetricGroup;
domains[domain].second = false;
}
return ZE_RESULT_SUCCESS;
}
ze_result_t MetricDeviceContext::activateAllDomains() {
@@ -125,16 +143,18 @@ ze_result_t MetricDeviceContext::activateAllDomains() {
return ZE_RESULT_SUCCESS;
}
ze_result_t MetricDeviceContext::deActivateAllDomains() {
void MetricDeviceContext::deActivateDomain(uint32_t domain) {
auto &metricGroupPair = domains[domain];
if (metricGroupPair.second == true) {
MetricGroup::fromHandle(metricGroupPair.first)->deactivate();
}
}
void MetricDeviceContext::deActivateAllDomains() {
for (auto &entry : domains) {
auto &metricGroup = entry.second;
if (metricGroup.second == true) {
MetricGroup::fromHandle(metricGroup.first)->deactivate();
}
metricGroup = {};
deActivateDomain(entry.first);
}
domains.clear();
return ZE_RESULT_SUCCESS;
}
ze_result_t MetricDeviceContext::appendMetricMemoryBarrier(CommandList &commandList) {

View File

@@ -42,7 +42,7 @@ class MetricDeviceContext {
public:
MetricDeviceContext(Device &device);
ze_result_t metricGroupGet(uint32_t *pCount, zet_metric_group_handle_t *phMetricGroups);
ze_result_t activateMetricGroupsDeferred(uint32_t count, zet_metric_group_handle_t *phMetricGroups);
void activateMetricGroupsDeferred(uint32_t count, zet_metric_group_handle_t *phMetricGroups);
ze_result_t activateMetricGroups();
ze_result_t appendMetricMemoryBarrier(CommandList &commandList);
bool isMetricGroupActivated(const zet_metric_group_handle_t hMetricGroup) const;
@@ -60,7 +60,8 @@ class MetricDeviceContext {
private:
bool enable();
ze_result_t activateAllDomains();
ze_result_t deActivateAllDomains();
void deActivateAllDomains();
void deActivateDomain(uint32_t domain);
struct Device &device;
std::map<uint32_t, std::pair<zet_metric_group_handle_t, bool>> domains;
bool multiDeviceCapable = false;