AGGR_NONE,
AGGR_GLOBAL,
AGGR_SOCKET,
+ AGGR_CORE,
};
static int run_count = 1;
case AGGR_SOCKET:
fprintf(output, "# time socket cpus counts events\n");
break;
+ case AGGR_CORE:
+ fprintf(output, "# time core cpus counts events\n");
+ break;
case AGGR_NONE:
fprintf(output, "# time CPU counts events\n");
break;
num_print_interval = 0;
switch (aggr_mode) {
+ case AGGR_CORE:
case AGGR_SOCKET:
print_aggr(prefix);
break;
print_noise_pct(stddev_stats(&ps->res_stats[0]), avg);
}
-static void aggr_printout(struct perf_evsel *evsel, int cpu, int nr)
+static void aggr_printout(struct perf_evsel *evsel, int id, int nr)
{
switch (aggr_mode) {
+ case AGGR_CORE:
+ fprintf(output, "S%d-C%*d%s%*d%s",
+ cpu_map__id_to_socket(id),
+ csv_output ? 0 : -8,
+ cpu_map__id_to_cpu(id),
+ csv_sep,
+ csv_output ? 0 : 4,
+ nr,
+ csv_sep);
+ break;
case AGGR_SOCKET:
fprintf(output, "S%*d%s%*d%s",
csv_output ? 0 : -5,
- cpu,
+ id,
csv_sep,
csv_output ? 0 : 4,
nr,
case AGGR_NONE:
fprintf(output, "CPU%*d%s",
csv_output ? 0 : -4,
- perf_evsel__cpus(evsel)->map[cpu], csv_sep);
+ perf_evsel__cpus(evsel)->map[id], csv_sep);
break;
case AGGR_GLOBAL:
default:
}
switch (aggr_mode) {
+ case AGGR_CORE:
case AGGR_SOCKET:
print_aggr(NULL);
break;
}
aggr_get_id = cpu_map__get_socket;
break;
+ case AGGR_CORE:
+ if (cpu_map__build_core_map(evsel_list->cpus, &aggr_map)) {
+ perror("cannot build core map");
+ return -1;
+ }
+ aggr_get_id = cpu_map__get_core;
+ break;
case AGGR_NONE:
case AGGR_GLOBAL:
default:
"print counts at regular interval in ms (>= 100)"),
OPT_SET_UINT(0, "per-socket", &aggr_mode,
"aggregate counts per processor socket", AGGR_SOCKET),
+ OPT_SET_UINT(0, "per-core", &aggr_mode,
+ "aggregate counts per physical processor core", AGGR_CORE),
OPT_END()
};
const char * const stat_usage[] = {