Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1336846 > unrolled thread

[PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

Started byAndi Kleen <andi@firstfloor.org>
First post2016-02-17 23:50 +0100
Last post2016-02-22 18:00 +0100
Articles 5 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode Andi Kleen <andi@firstfloor.org> - 2016-02-17 23:50 +0100
    Re: [PATCH 3/6] perf, tools, stat: Support metrics in  --per-core/socket mode Jiri Olsa <jolsa@redhat.com> - 2016-02-21 18:20 +0100
    Re: [PATCH 3/6] perf, tools, stat: Support metrics in  --per-core/socket mode Jiri Olsa <jolsa@redhat.com> - 2016-02-21 18:30 +0100
    Re: [PATCH 3/6] perf, tools, stat: Support metrics in  --per-core/socket mode Jiri Olsa <jolsa@redhat.com> - 2016-02-21 18:30 +0100
      Re: [PATCH 3/6] perf, tools, stat: Support metrics in  --per-core/socket mode Andi Kleen <andi@firstfloor.org> - 2016-02-22 18:00 +0100

#1336846 — [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

FromAndi Kleen <andi@firstfloor.org>
Date2016-02-17 23:50 +0100
Subject[PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode
Message-ID<r3j51-4A2-45@gated-at.bofh.it>
From: Andi Kleen <ak@linux.intel.com>

Enable metrics printing in --per-core / --per-socket mode. We need
to save the shadow metrics in a unique place. Always use the first
CPU in the aggregation. Then use the same CPU to retrieve the
shadow value later.

Example output:

% perf stat --per-core -a ./BC1s

 Performance counter stats for 'system wide':

S0-C0           2        2966.020381      task-clock (msec)         #    2.004 CPUs utilized            (100.00%)
S0-C0           2                 49      context-switches          #    0.017 K/sec                    (100.00%)
S0-C0           2                  4      cpu-migrations            #    0.001 K/sec                    (100.00%)
S0-C0           2                467      page-faults               #    0.157 K/sec
S0-C0           2      4,599,061,773      cycles                    #    1.551 GHz                      (100.00%)
S0-C0           2      9,755,886,883      instructions              #    2.12  insn per cycle           (100.00%)
S0-C0           2      1,906,272,125      branches                  #  642.704 M/sec                    (100.00%)
S0-C0           2         81,180,867      branch-misses             #    4.26% of all branches
S0-C1           2        2965.995373      task-clock (msec)         #    2.003 CPUs utilized            (100.00%)
S0-C1           2                 62      context-switches          #    0.021 K/sec                    (100.00%)
S0-C1           2                  8      cpu-migrations            #    0.003 K/sec                    (100.00%)
S0-C1           2                281      page-faults               #    0.095 K/sec
S0-C1           2          6,347,290      cycles                    #    0.002 GHz                      (100.00%)
S0-C1           2          4,654,156      instructions              #    0.73  insn per cycle           (100.00%)
S0-C1           2            947,121      branches                  #    0.319 M/sec                    (100.00%)
S0-C1           2             37,322      branch-misses             #    3.94% of all branches

       1.480409747 seconds time elapsed

v2: Rebase to older patches
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
 tools/perf/builtin-stat.c | 58 +++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 51 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 6c2c1d2..715e5b5 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -741,6 +741,8 @@ struct outstate {
 	const char *prefix;
 	int  nfields;
 	u64  run, ena;
+	int  id, nr;
+	struct perf_evsel *evsel;
 };
 
 #define METRIC_LEN  35
@@ -756,12 +758,9 @@ static void do_new_line_std(struct outstate *os)
 {
 	fputc('\n', os->fh);
 	fputs(os->prefix, os->fh);
+	aggr_printout(os->evsel, os->id, os->nr);
 	if (stat_config.aggr_mode == AGGR_NONE)
 		fprintf(os->fh, "        ");
-	if (stat_config.aggr_mode == AGGR_CORE)
-		fprintf(os->fh, "                  ");
-	if (stat_config.aggr_mode == AGGR_SOCKET)
-		fprintf(os->fh, "            ");
 	fprintf(os->fh, "                                                 ");
 }
 
@@ -799,6 +798,7 @@ static void new_line_csv(void *ctx)
 	fputc('\n', os->fh);
 	if (os->prefix)
 		fprintf(os->fh, "%s%s", os->prefix, csv_sep);
+	aggr_printout(os->evsel, os->id, os->nr);
 	for (i = 0; i < os->nfields; i++)
 		fputs(csv_sep, os->fh);
 }
@@ -856,6 +856,22 @@ static void nsec_printout(int id, int nr, struct perf_evsel *evsel, double avg)
 		fprintf(output, "%s%s", csv_sep, evsel->cgrp->name);
 }
 
+static int first_shadow_cpu(struct perf_evsel *evsel, int id)
+{
+	int i;
+
+	if (aggr_get_id == NULL)
+		return 0;
+
+	for (i = 0; i < perf_evsel__nr_cpus(evsel); i++) {
+		int cpu2 = perf_evsel__cpus(evsel)->map[i];
+
+		if (aggr_get_id(evsel_list->cpus, cpu2) == id)
+			return cpu2;
+	}
+	return 0;
+}
+
 static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
 {
 	FILE *output = stat_config.output;
@@ -892,7 +908,10 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
 	struct perf_stat_output_ctx out;
 	struct outstate os = {
 		.fh = stat_config.output,
-		.prefix = prefix ? prefix : ""
+		.prefix = prefix ? prefix : "",
+		.id = id,
+		.nr = nr,
+		.evsel = counter,
 	};
 	print_metric_t pm = print_metric_std;
 	void (*nl)(void *);
@@ -962,15 +981,38 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
 
 	perf_stat__print_shadow_stats(counter, uval,
 				stat_config.aggr_mode == AGGR_GLOBAL ? 0 :
-				cpu_map__id_to_cpu(id),
+				first_shadow_cpu(counter, id),
 				&out);
-
 	if (!csv_output) {
 		print_noise(counter, noise);
 		print_running(run, ena);
 	}
 }
 
+static void aggr_update_shadow(void)
+{
+	int cpu, cpu2, s2, id, s;
+	u64 val;
+	struct perf_evsel *counter;
+
+	for (s = 0; s < aggr_map->nr; s++) {
+		id = aggr_map->map[s];
+		evlist__for_each(evsel_list, counter) {
+			val = 0;
+			for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
+				cpu2 = perf_evsel__cpus(counter)->map[cpu];
+				s2 = aggr_get_id(evsel_list->cpus, cpu2);
+				if (s2 != id)
+					continue;
+				val += perf_counts(counter->counts, cpu, 0)->val;
+			}
+			val = val * counter->scale;
+			perf_stat__update_shadow_stats(counter, &val,
+						       first_shadow_cpu(counter, id));
+		}
+	}
+}
+
 static void print_aggr(char *prefix)
 {
 	FILE *output = stat_config.output;
@@ -982,6 +1024,8 @@ static void print_aggr(char *prefix)
 	if (!(aggr_map || aggr_get_id))
 		return;
 
+	aggr_update_shadow();
+
 	for (s = 0; s < aggr_map->nr; s++) {
 		id = aggr_map->map[s];
 		evlist__for_each(evsel_list, counter) {
-- 
2.5.0

[toc] | [next] | [standalone]


#1338849 — Re: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

FromJiri Olsa <jolsa@redhat.com>
Date2016-02-21 18:20 +0100
SubjectRe: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode
Message-ID<r4FPQ-O0-5@gated-at.bofh.it>
In reply to#1336846
On Wed, Feb 17, 2016 at 02:44:02PM -0800, Andi Kleen wrote:

SNIP

>  
>  	perf_stat__print_shadow_stats(counter, uval,
>  				stat_config.aggr_mode == AGGR_GLOBAL ? 0 :
> -				cpu_map__id_to_cpu(id),
> +				first_shadow_cpu(counter, id),
>  				&out);
> -
>  	if (!csv_output) {
>  		print_noise(counter, noise);
>  		print_running(run, ena);
>  	}
>  }
>  
> +static void aggr_update_shadow(void)
> +{
> +	int cpu, cpu2, s2, id, s;
> +	u64 val;
> +	struct perf_evsel *counter;
> +
> +	for (s = 0; s < aggr_map->nr; s++) {
> +		id = aggr_map->map[s];
> +		evlist__for_each(evsel_list, counter) {
> +			val = 0;
> +			for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
> +				cpu2 = perf_evsel__cpus(counter)->map[cpu];
> +				s2 = aggr_get_id(evsel_list->cpus, cpu2);

I think you need to pass cpu's 'idx' into aggr_get_id,
because it will do evsel_list->cpus[cpu2] for you

jirka

[toc] | [prev] | [next] | [standalone]


#1338863 — Re: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

FromJiri Olsa <jolsa@redhat.com>
Date2016-02-21 18:30 +0100
SubjectRe: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode
Message-ID<r4FZx-Tg-41@gated-at.bofh.it>
In reply to#1336846
On Wed, Feb 17, 2016 at 02:44:02PM -0800, Andi Kleen wrote:

SNIP

> +static void aggr_update_shadow(void)
> +{
> +	int cpu, cpu2, s2, id, s;
> +	u64 val;
> +	struct perf_evsel *counter;
> +
> +	for (s = 0; s < aggr_map->nr; s++) {
> +		id = aggr_map->map[s];
> +		evlist__for_each(evsel_list, counter) {
> +			val = 0;
> +			for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
> +				cpu2 = perf_evsel__cpus(counter)->map[cpu];
> +				s2 = aggr_get_id(evsel_list->cpus, cpu2);
> +				if (s2 != id)
> +					continue;
> +				val += perf_counts(counter->counts, cpu, 0)->val;
> +			}
> +			val = val * counter->scale;
> +			perf_stat__update_shadow_stats(counter, &val,
> +						       first_shadow_cpu(counter, id));
> +		}
> +	}
> +}


> +
>  static void print_aggr(char *prefix)
>  {
>  	FILE *output = stat_config.output;
> @@ -982,6 +1024,8 @@ static void print_aggr(char *prefix)
>  	if (!(aggr_map || aggr_get_id))
>  		return;
>  
> +	aggr_update_shadow();

this should be called from perf_stat_process_counter,
not from display function

also please document somewhere (best around shadow stats variables)
what cpus (array members) are used for given AGGR_*

thanks,
jirka

[toc] | [prev] | [next] | [standalone]


#1338865 — Re: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

FromJiri Olsa <jolsa@redhat.com>
Date2016-02-21 18:30 +0100
SubjectRe: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode
Message-ID<r4FZy-Tg-47@gated-at.bofh.it>
In reply to#1336846
On Wed, Feb 17, 2016 at 02:44:02PM -0800, Andi Kleen wrote:

SNIP

> @@ -892,7 +908,10 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
>  	struct perf_stat_output_ctx out;
>  	struct outstate os = {
>  		.fh = stat_config.output,
> -		.prefix = prefix ? prefix : ""
> +		.prefix = prefix ? prefix : "",
> +		.id = id,
> +		.nr = nr,
> +		.evsel = counter,
>  	};
>  	print_metric_t pm = print_metric_std;
>  	void (*nl)(void *);
> @@ -962,15 +981,38 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
>  
>  	perf_stat__print_shadow_stats(counter, uval,
>  				stat_config.aggr_mode == AGGR_GLOBAL ? 0 :
> -				cpu_map__id_to_cpu(id),
> +				first_shadow_cpu(counter, id),

hum, IIUC you need to handle AGGR_NONE in here as well?

thanks,
jirka

[toc] | [prev] | [next] | [standalone]


#1339727 — Re: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode

FromAndi Kleen <andi@firstfloor.org>
Date2016-02-22 18:00 +0100
SubjectRe: [PATCH 3/6] perf, tools, stat: Support metrics in --per-core/socket mode
Message-ID<r5202-eH-15@gated-at.bofh.it>
In reply to#1338865
On Sun, Feb 21, 2016 at 06:15:35PM +0100, Jiri Olsa wrote:
> On Wed, Feb 17, 2016 at 02:44:02PM -0800, Andi Kleen wrote:
> 
> SNIP
> 
> > @@ -892,7 +908,10 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
> >  	struct perf_stat_output_ctx out;
> >  	struct outstate os = {
> >  		.fh = stat_config.output,
> > -		.prefix = prefix ? prefix : ""
> > +		.prefix = prefix ? prefix : "",
> > +		.id = id,
> > +		.nr = nr,
> > +		.evsel = counter,
> >  	};
> >  	print_metric_t pm = print_metric_std;
> >  	void (*nl)(void *);
> > @@ -962,15 +981,38 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
> >  
> >  	perf_stat__print_shadow_stats(counter, uval,
> >  				stat_config.aggr_mode == AGGR_GLOBAL ? 0 :
> > -				cpu_map__id_to_cpu(id),
> > +				first_shadow_cpu(counter, id),
> 
> hum, IIUC you need to handle AGGR_NONE in here as well?

AFAIK it works. aggr_get_id in first_shadow_cpu and cpu_map__id_to_cpu
handle this case, right?

-Andi

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web