perf list
沒有列出實際的硬件事件,它只是perf預定義列表的列表,並沒有被任何CPU完全支持。某些CPU將幾個事件映射到perf的預定義的其他映射不同的事件集。
您應該檢查CPU核心(Qualcomm krait 400)的文檔以查找實際的硬件性能監視事件(計數器)並將它們用作原始數據(編碼爲perf stat -e rXXXX
或在perf_attr中編碼爲特定體系結構)。您也可以嘗試使用perf stat
/perf stat -d
來檢查哪些事件是從某些默認列表中統計(支持)的。
您的nexus 5基於Krait 400 CPU內核。
有在金環報道了一些問題:How to get perf_event results for 2nd Nexus7 with Krait CPU 並有鏈接補丁,定義爲Krait的標準事件:
http://www.serverphorums.com/read.php?12,850329
有兩套映射從預定義的PERF的實際硬件事件。一個與支持branch-instructions
事件和其他無:
/*
+ * 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,
+};
根據選擇的代碼,這是更高版本的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;
+}
正如我可以解碼CPUID - 金環蛇400和金環蛇600不支持分支指令PMU事件(PC寫入事件)。
更新:爲了您的Nexus 5倍,如果它使用的ARM Cortex A57核心,有「從表11-24‘的Cortex A57技術參考手冊’,」
https://sourceforge.net/p/perfmon2/libpfm4/ci/master/tree/lib/events/arm_cortex_a57_events.h
原始事件的列表,基於
所有分行仍然沒有櫃檯。有BRANCH_MISPRED & BRANCH_PRED,但我無法訪問文檔,不知道他們是否會統計所有分支。
要獲得完整的「本機函數」執行順序「,您應該嘗試跟蹤,而不是像perf那樣進行統計分析。 – osgx