安卓(基于ARM架构)是否具备硬件性能计数器?

6

就像在Intel处理器上的Linux系统中一样,我们有大量的硬件性能计数器可供访问。之前,使用一个名为perfmon2的用户空间软件,我可以获得缓存未命中率、由于某些原因(例如L1缓存未命中)导致CPU停滞周期等值。

我的问题是,在Android系统中是否也有这些东西?由于它基于ARM,我认为我们没有像在x86中拥有的那样强大的性能监视器计数器支持,对吗?

3个回答

7
ARM11和Cortex-A/R确实拥有硬件性能计数器,您可以在ARM官方网站上的此页面检查:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4237.html 由于Android也运行在Linux之上,您可以通过用户空间软件通过“Perf Events”子系统访问性能计数器。但是,您需要编写包含“perf_event.h”的本机C代码,并使用Android NDK构建它。在开始编写代码之前,建议您查看此项目:platform/external/linux-tools-perf (https://android.googlesource.com/platform/external/linux-tools-perf/),这可能正是您要寻找的东西。我不知道是否有其他替代方法可以直接从Java代码中执行此操作。

KA4237.html的链接已经失效。 - Brian Wright

6
除了Benny的回答,我要补充以下内容:
1. linux-tools-perf 项目已经集成到AOSP中(我使用的是4.2版本)。它位于 $AOSP/external/linux-tools-perf。./linux-tools-perf/Documentation目录下包含了很多有关如何运行所有内容的信息。perf工具被构建在 $PRODUCT_OUT/system/bin/perf 中,作为AOSP的一部分,但不被打包;您需要明确地将其推送到目标设备。
2. 检查Android(Linux)内核以确认其是否支持PM:PERF_EVENTS。Google如何获取.config,但最简单的方法是运行"extract-ikconfig zImage"。
3. 需要在目标设备上拥有root权限,然后运行类似"./perf stat -- testprog1"的命令来查看结果。该命令有很多参数可用于记录/检索不同的PM计数器。
4.记住,大多数ARM实现都有多个核心和很多流水线。Cortex-A9具有乱序执行。因此,这些数字有时可能有点怪异 - 几乎没有意义。
5. 我偶尔使用ARM PMCCNTR寄存器,即ARM PM Cycle Counter来测试代码性能。必须在PL1+级别设置PMUSERENR.EN和PMINTENCLR.C,然后可以在PL0级别管理PMCCNTR。参见ARM ARM以获取所有这些含义和perf子系统以获取示例用法!
注:所有shell变量都在$AOSP/build/envsetup.sh中设置。

我同意。最好的方法是从sysfs中启用核心(如果测量单核性能/单线程),并在空闲系统设置下测试2-3次,然后运行您的测试。这应该会给出更好和更真实的结果。 - shingaridavesh
linux-tools-perf现已更名为Simpleperf并移至platform/system/extras(文档在此处在此处)。 - justarandomguy

2
我认为你可以尝试使用ARM® HWCPipe ExporterARM® HWCPipe Exporter是一个用Java和C++编写的Prometheus导出器,它从运行在ARM®硬件组件上的Android设备中检索指标,并将其导出到Prometheus监控系统。
免责声明:我是ARM HWCPipe Exporter的作者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接