2016-09-28 1 views
2

Ich verwende derzeit simpleperf, die eine portierte Version von perf für Android ist, in meinem Nexus 5. Was ich hoffe, ist, dynamisch native Funktionen Ausführungsreihenfolge zu bekommen.Welches Ereignis sollte ich für die Option -e verwenden, um Funktionszweig-Ereignisse zu erhalten?

Ich denke, es sollte eine Möglichkeit geben, einen Beispieldatensatz auszugeben, sobald es ein Verzweigungsereignis gibt. Also muss ich simpleperf record -e branch-loads:u -p [pid] ausführen.

Im Folgenden habe ich einige relative Ereignisse aufgelistet, die in meinem Gerät unterstützt werden. Ich habe versucht branch-loads und branch-instructions für meinen Zweck. Aber keiner von ihnen gab das erwartete Ergebnis zurück. Ich glaube, dies liegt an der Verzweigung Funktionen sowie bedingte Sprünge.

[email protected]:/data/local/tmp # ./simpleperf32 list       
List of hw-cache events: 
    ... 
    branch-loads 
    branch-load-misses 
    branch-stores 
    branch-store-misses 
    node-loads 
    node-load-misses 
    node-stores 
    node-store-misses 
    node-prefetches 
    node-prefetch-misses 

List of hardware events: 
    cpu-cycles 
    instructions 
    branch-instructions 
    branch-misses 
    bus-cycles 
    stalled-cycles-frontend 
    stalled-cycles-backend 

Also, wie könnte ich nur Funktionsaufrufe erhalten? Oder wenn ich falsch liege, bitte zeig mir den richtigen. Vielen Dank.

+0

Um die vollständige "native Funktionen" -Ausführungssequenz zu erhalten, sollten Sie versuchen, Tracing, nicht statistische Profiling wie Perf. – osgx

Antwort

2

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.

+0

nicht in libpfm4 auch aufgeführt: https: //sourceforge.net/p/perfmon2/libpfm4/ci/master/tree/lib/events/arm_qcom_krait_events.h – osgx

+0

Danke. Ich gab Nexus 5 wegen Kraits schlechter Unterstützung von ARM CoreSight auf. Stattdessen probierte ich Neuxs 5x mit Coretex A57 CPU. Aber dasselbe Problem ist passiert.Nicht sicher, ob ich richtig getestet habe. – colordancer

+1

colordancer, A57 hat auch kein Performance Event für alle Branchenzahlen: https://sourceforge.net/p/perfmon2/libpfm4/ci/master/tree/lib/events/arm_cortex_a57_events.h Aber es gibt BRANCH_MISPRED und BRANCH_PRED Events, du Überprüfen Sie "Tabelle 11-24 aus dem" Cortex A57 Technisches Referenzhandbuch "" und versuchen Sie, sie als rohe Ereignisse für perf zu codieren. – osgx

Verwandte Themen