From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
David Ahern <dsahern@gmail.com>, Ingo Molnar <mingo@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
"Liang, Kan" <kan.liang@intel.com>
Subject: Re: [PATCH 8/8] perf script: Add stat-cpi.py script
Date: Tue, 5 Jan 2016 19:55:15 -0300 [thread overview]
Message-ID: <20160105225515.GA4932@kernel.org> (raw)
In-Reply-To: <1452028152-26762-9-git-send-email-jolsa@kernel.org>
Em Tue, Jan 05, 2016 at 10:09:12PM +0100, Jiri Olsa escreveu:
> Adding stat-cpi.py as an example of how to do stat scripting.
Can you please state what CPI means and why someone would want to use
this?
I applied the first 6 patches of this kit to my perf/core branch, will
continue tomorrow when I'll probably try to push what is there to Ingo.
Thanks,
- Arnaldo
> It computes the CPI metrics from cycles and instructions
> events.
>
> Following stat record/report/script combinations could be used:
>
> - get CPI for given workload
>
> $ perf stat -e cycles,instructions record ls
>
> SNIP
>
> Performance counter stats for 'ls':
>
> 2,904,431 cycles
> 3,346,878 instructions # 1.15 insns per cycle
>
> 0.001782686 seconds time elapsed
>
> $ perf script -s ./scripts/python/stat-cpi.py
> 0.001783: cpu -1, thread -1 -> cpi 0.867803 (2904431/3346878)
>
> $ perf stat -e cycles,instructions record ls | perf script -s ./scripts/python/stat-cpi.py
>
> SNIP
>
> 0.001730: cpu -1, thread -1 -> cpi 0.869026 (2928292/3369627)
>
> - get CPI systemwide:
>
> $ perf stat -e cycles,instructions -a -I 1000 record sleep 3
> # time counts unit events
> 1.000158618 594,274,711 cycles (100.00%)
> 1.000158618 441,898,250 instructions
> 2.000350973 567,649,705 cycles (100.00%)
> 2.000350973 432,669,206 instructions
> 3.000559210 561,940,430 cycles (100.00%)
> 3.000559210 420,403,465 instructions
> 3.000670798 780,105 cycles (100.00%)
> 3.000670798 326,516 instructions
>
> $ perf script -s ./scripts/python/stat-cpi.py
> 1.000159: cpu -1, thread -1 -> cpi 1.344823 (594274711/441898250)
> 2.000351: cpu -1, thread -1 -> cpi 1.311972 (567649705/432669206)
> 3.000559: cpu -1, thread -1 -> cpi 1.336669 (561940430/420403465)
> 3.000671: cpu -1, thread -1 -> cpi 2.389178 (780105/326516)
>
> $ perf stat -e cycles,instructions -a -I 1000 record sleep 3 | perf script -s ./scripts/python/stat-cpi.py
> 1.000202: cpu -1, thread -1 -> cpi 1.035091 (940778881/908885530)
> 2.000392: cpu -1, thread -1 -> cpi 1.442600 (627493992/434974455)
> 3.000545: cpu -1, thread -1 -> cpi 1.353612 (741463930/547766890)
> 3.000622: cpu -1, thread -1 -> cpi 2.642110 (784083/296764)
>
> Tested-by: Kan Liang <kan.liang@intel.com>
> Link: http://lkml.kernel.org/n/tip-15vwwb4yea15wzz6bqbxdpc0@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
> tools/perf/scripts/python/stat-cpi.py | 77 +++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
> create mode 100644 tools/perf/scripts/python/stat-cpi.py
>
> diff --git a/tools/perf/scripts/python/stat-cpi.py b/tools/perf/scripts/python/stat-cpi.py
> new file mode 100644
> index 000000000000..8b60f343dd07
> --- /dev/null
> +++ b/tools/perf/scripts/python/stat-cpi.py
> @@ -0,0 +1,77 @@
> +#!/usr/bin/env python
> +
> +data = {}
> +times = []
> +threads = []
> +cpus = []
> +
> +def get_key(time, event, cpu, thread):
> + return "%d-%s-%d-%d" % (time, event, cpu, thread)
> +
> +def store_key(time, cpu, thread):
> + if (time not in times):
> + times.append(time)
> +
> + if (cpu not in cpus):
> + cpus.append(cpu)
> +
> + if (thread not in threads):
> + threads.append(thread)
> +
> +def store(time, event, cpu, thread, val, ena, run):
> + #print "event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % \
> + # (event, cpu, thread, time, val, ena, run)
> +
> + store_key(time, cpu, thread)
> + key = get_key(time, event, cpu, thread)
> + data[key] = [ val, ena, run]
> +
> +def get(time, event, cpu, thread):
> + key = get_key(time, event, cpu, thread)
> + return data[key][0]
> +
> +def stat__cycles_k(cpu, thread, time, val, ena, run):
> + store(time, "cycles", cpu, thread, val, ena, run);
> +
> +def stat__instructions_k(cpu, thread, time, val, ena, run):
> + store(time, "instructions", cpu, thread, val, ena, run);
> +
> +def stat__cycles_u(cpu, thread, time, val, ena, run):
> + store(time, "cycles", cpu, thread, val, ena, run);
> +
> +def stat__instructions_u(cpu, thread, time, val, ena, run):
> + store(time, "instructions", cpu, thread, val, ena, run);
> +
> +def stat__cycles(cpu, thread, time, val, ena, run):
> + store(time, "cycles", cpu, thread, val, ena, run);
> +
> +def stat__instructions(cpu, thread, time, val, ena, run):
> + store(time, "instructions", cpu, thread, val, ena, run);
> +
> +def stat__interval(time):
> + for cpu in cpus:
> + for thread in threads:
> + cyc = get(time, "cycles", cpu, thread)
> + ins = get(time, "instructions", cpu, thread)
> + cpi = 0
> +
> + if ins != 0:
> + cpi = cyc/float(ins)
> +
> + print "%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins)
> +
> +def trace_end():
> + pass
> +# XXX trace_end callback could be used as an alternative place
> +# to compute same values as in the script above:
> +#
> +# for time in times:
> +# for cpu in cpus:
> +# for thread in threads:
> +# cyc = get(time, "cycles", cpu, thread)
> +# ins = get(time, "instructions", cpu, thread)
> +#
> +# if ins != 0:
> +# cpi = cyc/float(ins)
> +#
> +# print "time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi)
> --
> 2.4.3
next prev parent reply other threads:[~2016-01-05 22:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-05 21:09 [PATCHv8 0/8] perf stat: Add scripting support Jiri Olsa
2016-01-05 21:09 ` [PATCH 1/8] perf stat record: Keep sample_type 0 for pipe session Jiri Olsa
2016-01-09 16:29 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 2/8] perf script: Process cpu/threads maps Jiri Olsa
2016-01-09 16:29 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 3/8] perf script: Process stat config event Jiri Olsa
2016-01-09 16:29 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 4/8] perf script: Add process_stat/process_stat_interval scripting interface Jiri Olsa
2016-01-09 16:30 ` [tip:perf/core] perf script: Add process_stat/ process_stat_interval " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 5/8] perf script: Add stat default handlers Jiri Olsa
2016-01-09 16:30 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 6/8] perf script: Display stat events by default Jiri Olsa
2016-01-05 22:49 ` Arnaldo Carvalho de Melo
2016-01-06 9:36 ` Jiri Olsa
2016-01-05 21:09 ` [PATCH 7/8] perf script: Add python support for stat events Jiri Olsa
2016-01-09 16:31 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-01-05 21:09 ` [PATCH 8/8] perf script: Add stat-cpi.py script Jiri Olsa
2016-01-05 22:55 ` Arnaldo Carvalho de Melo [this message]
2016-01-05 22:39 ` [PATCHv8 0/8] perf stat: Add scripting support Arnaldo Carvalho de Melo
2016-01-06 9:09 ` Jiri Olsa
-- strict thread matches above, loose matches on Subject: below --
2015-12-22 15:43 [PATCHv7 00/25] " Jiri Olsa
2015-12-22 15:43 ` [PATCH 8/8] perf script: Add stat-cpi.py script Jiri Olsa
2015-12-23 13:44 ` Namhyung Kim
2015-12-23 16:04 ` Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160105225515.GA4932@kernel.org \
--to=acme@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=dsahern@gmail.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox