listet keine tatsächlichen Hardwareereignisse auf, es ist nur eine Liste der vordefinierten Listen und wird von keiner CPU vollständig unterstützt. Einige CPUs ordnen mehrere Ereignisse dem vordefinierten, anderen Map-Event-Set von perf zu.
Sie sollten die Dokumentation Ihres CPU-Kerns (qualcommrait 400) überprüfen, um tatsächliche Hardware-Performance-Überwachungsereignisse (Zähler) zu finden und sie als Rohdaten zu verwenden (Codierung zu perf stat -e rXXXX
oder zu RAW in perf_attr ist ebenfalls architekturspezifisch). Sie können auch versuchen perf stat
/perf stat -d
zu überprüfen, welche Ereignisse von einigen Standardlisten gezählt (unterstützt) werden.
Ihr Nexus 5 basiert auf dem Krait 400 CPU-Kern.
Es gab einige Probleme in krait berichtet: How to get perf_event results for 2nd Nexus7 with Krait CPU und es gab Link zu Patch definieren Standardereignisse für krait:
http://www.serverphorums.com/read.php?12,850329
Es gibt zwei Gruppen von Mapping von vordefinierten perf zu tatsächlichen hw Ereignisse. Ein mit Unterstützung von branch-instructions
Ereignisse und andere ohne:
/*
+ * Krait HW events mapping
+ */
+static const unsigned krait_perf_map[PERF_COUNT_HW_MAX] = {
+ [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
+ [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
+ [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED,
+ [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED,
+ [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
+ [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
+ [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
+};
+
+static const unsigned krait_perf_map_no_branch[PERF_COUNT_HW_MAX] = {
+ [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
+ [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
+ [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED,
+ [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED,
+ [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = HW_OP_UNSUPPORTED,
+ [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
+ [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
+};
Auswahlcode Laut, ist dies Merkmal der späteren Versionen von Krait CPU:
+static int krait_pmu_init(struct arm_pmu *cpu_pmu)
+{
+ u32 id = read_cpuid_id() & 0xffffff00;
+
+ armv7pmu_init(cpu_pmu);
+ cpu_pmu->name = "ARMv7 Krait";
+ /* Some early versions of Krait don't support PC write events */
+ if (id == 0x511f0400 || id == 0x510f0600)
+ cpu_pmu->map_event = krait_map_event_no_branch;
+ else
+ cpu_pmu->map_event = krait_map_event;
+ cpu_pmu->num_events = armv7_read_num_pmnc_events();
+ cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
+ return 0;
+}
Wie ich cpuid dekodieren kann - Krait 400 und Krait 600 keine Unterstützung des PMU-Ereignisses für die Verzweigung (PC-Schreib-Ereignis).
Update: Für Ihre Nexus 5-fach, wenn es ARM Cortex Kern A57 verwenden, gibt es Liste der Rohereignisse, basierend auf "Table 11-24 aus der "Cortex A57 Technical Reference Manual""
https://sourceforge.net/p/perfmon2/libpfm4/ci/master/tree/lib/events/arm_cortex_a57_events.h
Noch kein Zähler für alle Filialen. Es gibt BRANCH_MISPRED & BRANCH_PRED aber ich habe keinen Zugriff auf Dokumente und weiß nicht, ob sie alle Zweige zählen oder nicht.
Um die vollständige "native Funktionen" -Ausführungssequenz zu erhalten, sollten Sie versuchen, Tracing, nicht statistische Profiling wie Perf. – osgx