哈喽,大家好,我是程序员秘书LittleG。
ARM Performance Monitor Unit (PMU) 是一种硬件组件,用于跟踪和计数系统中的底层硬件事件。
集成在ARM架构的处理器中,可以用于监控和度量处理器及系统性能的关键指标,对于性能分析、调试、能耗管理和优化软件性能至关重要。
正文
用途说明:
性能分析:通过监测与CPU相关的事件(如执行指令数、捕获异常数、时钟周期数等),与cache相关的事件(如cache访问次数、miss次数等),以及与TLB(Translation Lookaside Buffer)有关的事件,PMU 可以帮助了解程序的执行行为,进而对程序进行性能分析和调优。通过测量执行时间、指令周期数、缓存命中率等,帮助识别程序的性能瓶颈。
系统调试:通过跟踪特定事件的发生,如中断延迟、上下文切换频率,辅助系统级别的调试。
能耗管理:监控处理器活动,协助实现动态电压和频率调整(DVFS),降低能耗。
软件优化:提供数据支持,帮助我们针对特定硬件特性优化代码,提升运行效率。
功能组件:
事件计数器:PMU 包含一组事件计数器,分为两类,一类是cycle counter
,用于计数CYCLES事件;另一类是performance counter
,用于计数其他类型的事件。在ARMv8
架构中,例如Cortex-A53
,有1个cycle counter和6个performance counters。
控制寄存器:PMU 包含用于控制计数器的寄存器,可以通过编程配置计数的事件类型、中断使能/屏蔽等。
寄存器访问:PMU 寄存器可以通过特定的系统控制指令访问,如在ARM架构中,可以通过CP15协处理器或外部APB接口来编程。
中断和溢出:当计数器溢出时,可以产生overflow中断,PMU硬件会根据控制寄存器内设置的中断屏蔽位判断是否将该中断发送给CPU处理。
使用场景
场景1:假设我们要分析一段代码的性能,特别是想了解cache
的miss
次数,可以按照以下步骤使用PMU:
确定监控事件:根据ARM架构的文档,找到代表cache miss的事件编码。
配置PMU:通过编程设置PMU的控制寄存器,选择相应的事件计数器,并将其配置为监控cache miss事件。
启动计数:使能PMU硬件和选定的计数器。
运行代码:执行需要分析的代码段。
读取计数器:代码执行完成后,读取事件计数器的值,这个值就是cache miss的次数。
分析结果:根据计数器的值,分析代码的性能,找出可能的性能瓶颈。
调优代码:根据分析结果,对代码进行调优,比如增加数据的局部性,减少cache miss。
场景2:假设发现有某一款特定应用在某款基于ARM Cortex-A
系列处理器的手机上运行缓慢,想要找出性能瓶颈所在。
确定监控事件:首先,需要确定哪些性能指标可能是瓶颈的来源,例如CPU利用率过高、缓存未命中频繁等。因此,他可能会选择监控“指令周期数”、“L1缓存未命中次数”和“CPU周期空闲比例”等事件。
配置PMU:编写代码,使用适当的系统调用来配置PMU。例如,在Linux环境下,可能使用perf_event_open
系统调用或perf
命令行工具,指定要监控的事件和计数器。
数据收集:应用在目标设备上运行时,PMU自动累积选定事件的计数。开发者可以在应用运行一段时间后,读取计数器的值,或者使用perf record
记录整个运行过程,之后通过perf report
分析数据。
分析与优化:分析结果显示,L1缓存未命中率极高,表明应用频繁访问的数据未有效利用缓存。开发者据此优化数据访问模式,比如通过数据局部性改善来减少缓存未命中,或者调整算法减少不必要的运算。
验证改进:优化后,再次使用PMU监控同样的性能指标,验证优化措施的效果。如果缓存未命中率显著下降,且整体应用响应时间缩短,则证明优化成功。
下期见~