Bootstrap

CPU性能优化--skylake 微架构事件编码示例

Event 事件 编码 Umask 掩码 事件掩码助记 描述

C0H 00H INST_RETIRED.ANY_P 退休指令数量

C4H 00H BR_INST_RETIRED 退休的分支跳转指令

linux perf提供常用性能计数器的映射,可以通过映射的事件名称来访问,而不是指定Event 和Umask十六进制值。例如,branches只是BR_INST_RETIRED.ALL_BRANCHES的同义词,可以测量相同的东西,可以通过perf list查看可用的映射名称列表。

perf list

然而,linux perf 并没有为每个CPU架构的所有性能计数器提供映射,如果要找的PMC没有映射,则可以使用如下语法来采集它。

perf stat -e cpu

此外,围绕linux perf还有一些封装工具,可以用来处理映射工作,例如oprofile和ocperf.py 下面是用法

ocperf -e uops_retired ./a.exe

性能计数器并不是在每个环境中都可以,因为访问PMC需要root权限,

5.3.3 事件多路复用和缩放

在某些情况下,我们想同事统计许多不同的事件,但是一个计数器一次只能统计一个事件。这就是为什么PMU中有多个计数器,即便如此,固定计数器和可编程技术起的数量也总是不够用的。显然,CPU没有那么多计数器这时多路复用技术可以发挥作用了。

如果事件多余计数器,则分析工具使用时间多路复用技术使每个事件都有机会访问监控硬件。

性能事件1 第一组 PMC1 PMC2 PMC3 PMC$

性能事件2

性能事件3

性能事件4 第二组

性能事件5

性能事件6

使用多路复用技术时一个事件不会一直测量只有一部分能被测量运行结束剖析工具需要根据运动时间启动事件换算原始计数

5.4 采样

采用最常见分析方法a 调试器运行程序 b 10s暂停一次程序 c 记录程序停止位置 每次捕获新样本所分析程序执行都会被中断中断剖析收集程序状态快照快照构成一个样本针对每个样本收集信息可能包括中断执行指令地址寄存器状态调用收集样本数据存储数据文件中这些可以进一步用于显示调用程序最耗时部分统计意义重要代码控制

5.4.1 用户模式采样和基于硬件事件的采样。

用户模式采样基于硬件事件采样EBS用户模式采样是一种纯软件方法代理嵌入被分析应用程序代理应用程序每个线程设置OS计时器计时器计时完成时应用程序接受SIGPROF信号用户模式下只能识别热点EBS可以用于涉及PMC其他分析例如缓存未命中采样TMA

用户模式采样EBS产生更多运行时开销使用10ms 默认采样间隔用户模式采样平均开销约为5%,采样1ms采样间隔EBS平均开销2%. 因为可以更高频率收集样本所以通常EBS更准确

5.4.2 寻找热点

我们可以任何想要查看性能事件进行采样比如想知道程序哪里发生L3缓存未命中最多可以对应事件(MEM_LOAD_RETIRED.L3_MISS)进行采样

准备工作完成后我们开始计数运行基准测试需要配置统计时钟周期PMC计数器每个时钟周期递增一次最终会溢出计数器溢出硬件发起PMI剖析工具配置成捕获PMI 记录计数器溢出CPU执行指令然后计数器重置N并且恢复基准测试执行现在我们会到N使用可以控制获取终端频率

多次重复古城以获取足够样本接下来汇总这些样本可以构成程序中热点位置直方图就像下面Linux Perf record 输出显示那样

linux perf工具收集调用栈三种可能方法

1 指针 perf record--call-graph fp 需要二进制文件编译构建时带上 --fnoomit-frame-pointer参数因为指针RBP 无须弹出所有参数就能获取调用所以以前用于调试

;