[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <0d48bf82-5de2-4928-bd15-1c5abfd4f087@linux.intel.com>
Date: Thu, 7 Nov 2024 10:00:14 -0500
From: "Liang, Kan" <kan.liang@...ux.intel.com>
To: Ian Rogers <irogers@...gle.com>, Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>, Arnaldo Carvalho de Melo <acme@...nel.org>,
Namhyung Kim <namhyung@...nel.org>, Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>, Adrian Hunter <adrian.hunter@...el.com>,
linux-perf-users@...r.kernel.org, linux-kernel@...r.kernel.org,
Perry Taylor <perry.taylor@...el.com>, Samantha Alt
<samantha.alt@...el.com>, Caleb Biggers <caleb.biggers@...el.com>,
Weilin Wang <weilin.wang@...el.com>, Edward Baker <edward.baker@...el.com>
Subject: Re: [PATCH v4 09/22] perf jevents: Add ports metric group giving
utilization on Intel
On 2024-09-26 1:50 p.m., Ian Rogers wrote:
> The ports metric group contains a metric for each port giving its
> utilization as a ratio of cycles. The metrics are created by looking
> for UOPS_DISPATCHED.PORT events.
>
> Signed-off-by: Ian Rogers <irogers@...gle.com>
> ---
> tools/perf/pmu-events/intel_metrics.py | 33 ++++++++++++++++++++++++--
> 1 file changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py
> index f4707e964f75..3ef4eb868580 100755
> --- a/tools/perf/pmu-events/intel_metrics.py
> +++ b/tools/perf/pmu-events/intel_metrics.py
> @@ -1,12 +1,13 @@
> #!/usr/bin/env python3
> # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
> from metric import (d_ratio, has_event, max, CheckPmu, Event, JsonEncodeMetric,
> - JsonEncodeMetricGroupDescriptions, LoadEvents, Metric,
> - MetricGroup, MetricRef, Select)
> + JsonEncodeMetricGroupDescriptions, Literal, LoadEvents,
> + Metric, MetricGroup, MetricRef, Select)
> import argparse
> import json
> import math
> import os
> +import re
> from typing import Optional
>
> # Global command line arguments.
> @@ -260,6 +261,33 @@ def IntelBr():
> description="breakdown of retired branch instructions")
>
>
> +def IntelPorts() -> Optional[MetricGroup]:
> + pipeline_events = json.load(open(f"{_args.events_path}/x86/{_args.model}/pipeline.json"))
> +
> + core_cycles = Event("CPU_CLK_UNHALTED.THREAD_P_ANY",
> + "CPU_CLK_UNHALTED.DISTRIBUTED",
> + "cycles")
> + # Number of CPU cycles scaled for SMT.
> + smt_cycles = Select(core_cycles / 2, Literal("#smt_on"), core_cycles)
> +
> + metrics = []
> + for x in pipeline_events:
> + if "EventName" in x and re.search("^UOPS_DISPATCHED.PORT", x["EventName"]):
> + name = x["EventName"]
> + port = re.search(r"(PORT_[0-9].*)", name).group(0).lower()
> + if name.endswith("_CORE"):
> + cyc = core_cycles
> + else:
> + cyc = smt_cycles
> + metrics.append(Metric(port, f"{port} utilization (higher is better)",
> + d_ratio(Event(name), cyc), "100%"))
The generated metric highly depends on the event name, which is very
fragile. We will probably have the same event in a new generation, but
with a different name. Long-term maintenance could be a problem.
Is there an idea regarding how to sync the event names for new generations?
Maybe we should improve the event generation script and do an automatic
check to tell which metrics are missed. Then we may decide if updating
the new event name, dropping the metric or adding a different metric.
Thanks,
Kan
> + if len(metrics) == 0:
> + return None
> +
> + return MetricGroup("ports", metrics, "functional unit (port) utilization -- "
> + "fraction of cycles each port is utilized (higher is better)")
> +
> +
> def IntelSwpf() -> Optional[MetricGroup]:
> ins = Event("instructions")
> try:
> @@ -352,6 +380,7 @@ def main() -> None:
> Smi(),
> Tsx(),
> IntelBr(),
> + IntelPorts(),
> IntelSwpf(),
> ])
>
Powered by blists - more mailing lists