perf, tools: Output running time and run/enabled ratio in CSV mode
PATCH 1/3 perf, tools: Output running time and run/enabled ratio in CSV mode
From: Andi Kleen <[email protected]>
The information how much a counter ran in perf stat can be quite interesting for other tools to judge how trustworthy a measurement is.
Currently it is only output in non CSV mode.
This patches make perf stat always output the running time and the enabled/running ratio in CSV mode.
This adds two new fields at the end for each line. I assume that existing tools ignore new fields at the end, so it's on by default.
Only CSV mode is affected, no difference otherwise.
v2: Add extra print_running function
v3: Avoid printing nan
v4: Remove some elses and add brackets.
v5: Move non CSV case into print_running
--- tools/perf/builtin-stat.c | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-)
tools/perf/builtin-stat.c +24 -23
@@ -769,6 +769,18 @@ static int run_perf_stat(int argc, const char **argv)return ret; } +static void print_running (u64 run,u64 ena) +{ +if (csv_output) { +fprintf (output,"%s%" PRIu64"%s%.2f" , + csv_sep, + run, + csv_sep, + ena ?100.0 * run / ena :100.0 ); + }else if (run != ena) +fprintf (output," (%.2f%%)" ,100.0 * run / ena); +} +static void print_noise_pct (double total,double avg) {double pct =rel_stddev_stats (total, avg);
@@ -1252,6 +1264,7 @@ static void print_aggr(char *prefix)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (run, ena);fputc ('\n' , output);continue ; }
@@ -1262,13 +1275,10 @@ static void print_aggr(char *prefix)else abs_printout (id, nr, counter, uval); -if (!csv_output) { +if (!csv_output)print_noise (counter,1.0 ); -if (run != ena) -fprintf (output," (%.2f%%)" , -100.0 * run / ena); - } +print_running (run, ena);fputc ('\n' , output); } }
@@ -1284,6 +1294,10 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)double avg =avg_stats (&ps->res_stats[0 ]);int scaled = counter->counts->scaled;double uval; +double avg_enabled, avg_running; + + avg_enabled =avg_stats (&ps->res_stats[1 ]); + avg_running =avg_stats (&ps->res_stats[2 ]);if (prefix)fprintf (output,"%s" , prefix);
@@ -1303,6 +1317,7 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)if (counter->cgrp)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (avg_running, avg_enabled);fputc ('\n' , output);return ; }
@@ -1316,19 +1331,7 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)print_noise (counter, avg); -if (csv_output) { -fputc ('\n' , output); -return ; - } - -if (scaled) { -double avg_enabled, avg_running; - - avg_enabled =avg_stats (&ps->res_stats[1 ]); - avg_running =avg_stats (&ps->res_stats[2 ]); - -fprintf (output," [%5.2f%%]" ,100 * avg_running / avg_enabled); - } +print_running (avg_running, avg_enabled);fprintf (output,"\n" ); }
@@ -1370,6 +1373,7 @@ static void print_counter(struct perf_evsel *counter, char *prefix)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (run, ena);fputc ('\n' , output);continue ; }
@@ -1381,13 +1385,10 @@ static void print_counter(struct perf_evsel *counter, char *prefix)else abs_printout (cpu,0 , counter, uval); -if (!csv_output) { +if (!csv_output)print_noise (counter,1.0 ); +print_running (run, ena); -if (run != ena) -fprintf (output," (%.2f%%)" , -100.0 * run / ena); - }fputc ('\n' , output); } }
Signature · 1 line
1.9.3
PATCH 2/3 perf, tools, stat: Fix IPC and other formulas with -A
From: Andi Kleen <[email protected]>
perf stat didn't compute the IPC and other formulas for individual CPUs with -A. Fix this for the easy -A case. As before, --per-core and --per-socket do not handle it, they simply print nothing.
--- tools/perf/builtin-stat.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-)
tools/perf/builtin-stat.c +19 -17
@@ -353,39 +353,40 @@ static struct perf_evsel *nth_evsel(int n)* more semantic information such as miss/hit ratios, * instruction rates, etc: */ -static void update_shadow_stats (struct perf_evsel *counter,u64 *count) +static void update_shadow_stats (struct perf_evsel *counter,u64 *count, +int cpu) {if (perf_evsel__match (counter,SOFTWARE ,SW_TASK_CLOCK )) -update_stats (&runtime_nsecs_stats[0 ], count[0 ]); +update_stats (&runtime_nsecs_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_CPU_CYCLES )) -update_stats (&runtime_cycles_stats[0 ], count[0 ]); +update_stats (&runtime_cycles_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_CYCLES_IN_TX ))) -update_stats (&runtime_cycles_in_tx_stats[0 ], count[0 ]); +update_stats (&runtime_cycles_in_tx_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_TRANSACTION_START ))) -update_stats (&runtime_transaction_stats[0 ], count[0 ]); +update_stats (&runtime_transaction_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_ELISION_START ))) -update_stats (&runtime_elision_stats[0 ], count[0 ]); +update_stats (&runtime_elision_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_STALLED_CYCLES_FRONTEND )) -update_stats (&runtime_stalled_cycles_front_stats[0 ], count[0 ]); +update_stats (&runtime_stalled_cycles_front_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_STALLED_CYCLES_BACKEND )) -update_stats (&runtime_stalled_cycles_back_stats[0 ], count[0 ]); +update_stats (&runtime_stalled_cycles_back_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_BRANCH_INSTRUCTIONS )) -update_stats (&runtime_branches_stats[0 ], count[0 ]); +update_stats (&runtime_branches_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_CACHE_REFERENCES )) -update_stats (&runtime_cacherefs_stats[0 ], count[0 ]); +update_stats (&runtime_cacherefs_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_L1D )) -update_stats (&runtime_l1_dcache_stats[0 ], count[0 ]); +update_stats (&runtime_l1_dcache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_L1I )) -update_stats (&runtime_l1_icache_stats[0 ], count[0 ]); +update_stats (&runtime_l1_icache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_LL )) -update_stats (&runtime_ll_cache_stats[0 ], count[0 ]); +update_stats (&runtime_ll_cache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_DTLB )) -update_stats (&runtime_dtlb_cache_stats[0 ], count[0 ]); +update_stats (&runtime_dtlb_cache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_ITLB )) -update_stats (&runtime_itlb_cache_stats[0 ], count[0 ]); +update_stats (&runtime_itlb_cache_stats[cpu], count[0 ]); }static void zero_per_pkg (struct perf_evsel *counter)
@@ -447,7 +448,8 @@ static int read_cb(struct perf_evsel *evsel, int cpu, int thread __maybe_unused,perf_evsel__compute_deltas (evsel, cpu, count);perf_counts_values__scale (count, scale,NULL ); evsel->counts->cpu[cpu] = *count; -update_shadow_stats (evsel, count->values); +if (aggr_mode ==AGGR_NONE ) +update_shadow_stats (evsel, count->values, cpu);break ;case AGGR_GLOBAL : aggr->val += count->val;
@@ -495,7 +497,7 @@ static int read_counter_aggr(struct perf_evsel *counter)/* * Save the full runtime - to allow normalization during printout: */ -update_shadow_stats (counter, count); +update_shadow_stats (counter, count,0 );return 0 ; }
Signature · 1 line
1.9.3
tip-bot for Andi Kleen
merge bot[tip:perf/core] perf stat: Fix IPC and other formulas with -A
perf stat: Fix IPC and other formulas with -A
Commit-ID: 56f0fd45d8df51542930b9b2e1acee5034b53479 Gitweb: http://git.kernel.org/tip/56f0fd45d8df51542930b9b2e1acee5034b53479 Author: Andi Kleen <[email protected]> AuthorDate: Wed, 11 Mar 2015 08:28:01 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 13 Mar 2015 07:46:10 -0300
perf stat: Fix IPC and other formulas with -A
perf stat didn't compute the IPC and other formulas for individual CPUs with -A. Fix this for the easy -A case. As before, --per-core and --per-socket do not handle it, they simply print nothing.
--- tools/perf/builtin-stat.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-)
tools/perf/builtin-stat.c +19 -17
@@ -353,39 +353,40 @@ static struct perf_evsel *nth_evsel(int n)* more semantic information such as miss/hit ratios, * instruction rates, etc: */ -static void update_shadow_stats (struct perf_evsel *counter,u64 *count) +static void update_shadow_stats (struct perf_evsel *counter,u64 *count, +int cpu) {if (perf_evsel__match (counter,SOFTWARE ,SW_TASK_CLOCK )) -update_stats (&runtime_nsecs_stats[0 ], count[0 ]); +update_stats (&runtime_nsecs_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_CPU_CYCLES )) -update_stats (&runtime_cycles_stats[0 ], count[0 ]); +update_stats (&runtime_cycles_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_CYCLES_IN_TX ))) -update_stats (&runtime_cycles_in_tx_stats[0 ], count[0 ]); +update_stats (&runtime_cycles_in_tx_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_TRANSACTION_START ))) -update_stats (&runtime_transaction_stats[0 ], count[0 ]); +update_stats (&runtime_transaction_stats[cpu], count[0 ]);else if (transaction_run &&perf_evsel__cmp (counter,nth_evsel (T_ELISION_START ))) -update_stats (&runtime_elision_stats[0 ], count[0 ]); +update_stats (&runtime_elision_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_STALLED_CYCLES_FRONTEND )) -update_stats (&runtime_stalled_cycles_front_stats[0 ], count[0 ]); +update_stats (&runtime_stalled_cycles_front_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_STALLED_CYCLES_BACKEND )) -update_stats (&runtime_stalled_cycles_back_stats[0 ], count[0 ]); +update_stats (&runtime_stalled_cycles_back_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_BRANCH_INSTRUCTIONS )) -update_stats (&runtime_branches_stats[0 ], count[0 ]); +update_stats (&runtime_branches_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HARDWARE ,HW_CACHE_REFERENCES )) -update_stats (&runtime_cacherefs_stats[0 ], count[0 ]); +update_stats (&runtime_cacherefs_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_L1D )) -update_stats (&runtime_l1_dcache_stats[0 ], count[0 ]); +update_stats (&runtime_l1_dcache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_L1I )) -update_stats (&runtime_l1_icache_stats[0 ], count[0 ]); +update_stats (&runtime_l1_icache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_LL )) -update_stats (&runtime_ll_cache_stats[0 ], count[0 ]); +update_stats (&runtime_ll_cache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_DTLB )) -update_stats (&runtime_dtlb_cache_stats[0 ], count[0 ]); +update_stats (&runtime_dtlb_cache_stats[cpu], count[0 ]);else if (perf_evsel__match (counter,HW_CACHE ,HW_CACHE_ITLB )) -update_stats (&runtime_itlb_cache_stats[0 ], count[0 ]); +update_stats (&runtime_itlb_cache_stats[cpu], count[0 ]); }static void zero_per_pkg (struct perf_evsel *counter)
@@ -447,7 +448,8 @@ static int read_cb(struct perf_evsel *evsel, int cpu, int thread __maybe_unused,perf_evsel__compute_deltas (evsel, cpu, count);perf_counts_values__scale (count, scale,NULL ); evsel->counts->cpu[cpu] = *count; -update_shadow_stats (evsel, count->values); +if (aggr_mode ==AGGR_NONE ) +update_shadow_stats (evsel, count->values, cpu);break ;case AGGR_GLOBAL : aggr->val += count->val;
@@ -495,7 +497,7 @@ static int read_counter_aggr(struct perf_evsel *counter)/* * Save the full runtime - to allow normalization during printout: */ -update_shadow_stats (counter, count); +update_shadow_stats (counter, count,0 );return 0 ; }
PATCH 3/3 perf, tools, stat: Always correctly indent ratio column
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
When cycles or instructions do not print anything, as in being, --per-socket or --per-core modi, the ratio column was not correctly indented for them. This lead to some ratios not lining up with the others. Always indent correctly when nothing is printed.
--- tools/perf/builtin-stat.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/perf/builtin-stat.c +4 -2
@@ -1093,7 +1093,8 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)if (total) { ratio = avg / total;fprintf (output," # %5.2f insns per cycle " , ratio); - } + }else +fprintf (output," " ); total =avg_stats (&runtime_stalled_cycles_front_stats[cpu]); total =max (total,avg_stats (&runtime_stalled_cycles_back_stats[cpu]));
@@ -1162,7 +1163,8 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)if (total) { ratio = avg / total;fprintf (output," # %8.3f GHz " , ratio); - } + }else +fprintf (output," " ); }else if (transaction_run &&perf_evsel__cmp (evsel,nth_evsel (T_CYCLES_IN_TX ))) { total =avg_stats (&runtime_cycles_stats[cpu]);
Signature · 1 line
1.9.3
tip-bot for Andi Kleen
merge bot[tip:perf/core] perf stat: Always correctly indent ratio column
perf stat: Always correctly indent ratio column
Commit-ID: 7910352852f377f6d12286f922299d7ad1cfb2e3 Gitweb: http://git.kernel.org/tip/7910352852f377f6d12286f922299d7ad1cfb2e3 Author: Andi Kleen <[email protected]> AuthorDate: Wed, 11 Mar 2015 08:28:02 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 13 Mar 2015 07:47:44 -0300
perf stat: Always correctly indent ratio column
When cycles or instructions do not print anything, as in being, --per-socket or --per-core modi, the ratio column was not correctly indented for them. This lead to some ratios not lining up with the others. Always indent correctly when nothing is printed.
--- tools/perf/builtin-stat.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/builtin-stat.c +4 -0
@@ -1094,6 +1094,8 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)if (total) { ratio = avg / total;fprintf (output," # %5.2f insns per cycle " , ratio); + }else { +fprintf (output," " ); } total =avg_stats (&runtime_stalled_cycles_front_stats[cpu]); total =max (total,avg_stats (&runtime_stalled_cycles_back_stats[cpu]));
@@ -1163,6 +1165,8 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)if (total) { ratio = avg / total;fprintf (output," # %8.3f GHz " , ratio); + }else { +fprintf (output," " ); } }else if (transaction_run &&perf_evsel__cmp (evsel,nth_evsel (T_CYCLES_IN_TX ))) {
Arnaldo Carvalho de Melo
maintainerEm Wed, Mar 11, 2015 at 08:28:00AM -0700, Andi Kleen escreveu:
Quoted 13 lines
From: Andi Kleen <[email protected]>
The information how much a counter ran in perf stat can be quite interesting for other tools to judge how trustworthy a measurement is.
Currently it is only output in non CSV mode.
This patches make perf stat always output the running time and the enabled/running ratio in CSV mode.
This adds two new fields at the end for each line. I assume that existing tools ignore new fields at the end, so it's on by default.
Quoted 7 lines
Only CSV mode is affected, no difference otherwise.
v2: Add extra
print_runningfunction
v3: Avoid printing nan
v4: Remove some elses and add brackets.
v5: Move non CSV case intoprint_runningReviewed-by Jiri Olsa <[email protected]>
Jiri, have you sent that "Reviewed-by" tag? Don't remember seeing it.
- Arnaldo
Quoted 118 lines
Signed-off-by Andi Kleen <[email protected]>--- tools/perf/builtin-stat.c | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-)tools/perf/builtin-stat.c +24
-23@@ -769,6 +769,18 @@ static int run_perf_stat(int argc, const char **argv)return ret; } +static void print_running (u64 run,u64 ena) +{ +if (csv_output) { +fprintf (output,"%s%" PRIu64"%s%.2f" , + csv_sep, + run, + csv_sep, + ena ?100.0 * run / ena :100.0 ); + }else if (run != ena) +fprintf (output," (%.2f%%)" ,100.0 * run / ena); +} +static void print_noise_pct (double total,double avg) {double pct =rel_stddev_stats (total, avg);@@ -1252,6 +1264,7 @@ static void print_aggr(char *prefix)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (run, ena);fputc ('\n' , output);continue ; }@@ -1262,13 +1275,10 @@ static void print_aggr(char *prefix)else abs_printout (id, nr, counter, uval); -if (!csv_output) { +if (!csv_output)print_noise (counter,1.0 ); -if (run != ena) -fprintf (output," (%.2f%%)" , -100.0 * run / ena); - } +print_running (run, ena);fputc ('\n' , output); } }@@ -1284,6 +1294,10 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)double avg =avg_stats (&ps->res_stats[0 ]);int scaled = counter->counts->scaled;double uval; +double avg_enabled, avg_running; + + avg_enabled =avg_stats (&ps->res_stats[1 ]); + avg_running =avg_stats (&ps->res_stats[2 ]);if (prefix)fprintf (output,"%s" , prefix);@@ -1303,6 +1317,7 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)if (counter->cgrp)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (avg_running, avg_enabled);fputc ('\n' , output);return ; }@@ -1316,19 +1331,7 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)print_noise (counter, avg); -if (csv_output) { -fputc ('\n' , output); -return ; - } - -if (scaled) { -double avg_enabled, avg_running; - - avg_enabled =avg_stats (&ps->res_stats[1 ]); - avg_running =avg_stats (&ps->res_stats[2 ]); - -fprintf (output," [%5.2f%%]" ,100 * avg_running / avg_enabled); - } +print_running (avg_running, avg_enabled);fprintf (output,"\n" ); }@@ -1370,6 +1373,7 @@ static void print_counter(struct perf_evsel *counter, char *prefix)fprintf (output,"%s%s" , csv_sep, counter->cgrp->name); +print_running (run, ena);fputc ('\n' , output);continue ; }@@ -1381,13 +1385,10 @@ static void print_counter(struct perf_evsel *counter, char *prefix)else abs_printout (cpu,0 , counter, uval); -if (!csv_output) { +if (!csv_output)print_noise (counter,1.0 ); +print_running (run, ena); -if (run != ena) -fprintf (output," (%.2f%%)" , -100.0 * run / ena); - }fputc ('\n' , output); } }Signature · 1 line
1.9.3
Quoted 16 lines · Arnaldo Carvalho de Melo
Em Wed, Mar 11, 2015 at 08:28:00AM -0700, Andi Kleen escreveu:
Quoted 15 lines
From: Andi Kleen <[email protected]>
The information how much a counter ran in perf stat can be quite interesting for other tools to judge how trustworthy a measurement is.
Currently it is only output in non CSV mode.
This patches make perf stat always output the running time and the enabled/running ratio in CSV mode.
This adds two new fields at the end for each line. I assume that existing tools ignore new fields at the end, so it's on by default.
Only CSV mode is affected, no difference otherwise.
Quoted 7 lines
Quoted 5 lines
v2: Add extra
print_runningfunction
v3: Avoid printing nan
v4: Remove some elses and add brackets.
v5: Move non CSV case intoprint_runningReviewed-by Jiri Olsa <[email protected]>Jiri, have you sent that "Reviewed-by" tag? Don't remember seeing it.
I might have, but can't find it now..
anyway there's new version, I'll check it
jirka