CPU性能优化-CPU特性
现代CPU持续的添加新特性,使用这些特性可以大大简化找到底层问题的方法。
1 自顶向下微架构分析TMA,是一种识别应用程序低效使用CPU微架构的强大技术,识别负载的瓶颈,定位出现问题的代码具体位置,封装了CPU微架构中复杂的技术点。
2 最后分支记录(last branch record)LBR是在执行过程中连续记录最新分支结果的机制,通常用来采集调用栈,热点分支,计算每个分支的错误预测概率等等。
3 基于处理器事件的采样是一种增强的采样技术,主要优势有降低采样开销和提供,精确事件的能力。精确事件可以定位导致特定性能事件的具体指令。
4 Intel 处理器追踪,是一种基于每条指令的时间戳记录和重建程序执行过程的工具,主要用途是对性能故障进行事后分析和根因定位。
6.1 自顶向下微架构分析技术
TMA是识别程序CPU性能瓶颈的一种非常强大的技术,不需要开发者对CPu的微架构和PMC有深入理解,就能有效的找到CPU的性能瓶颈,
TMA能识别程序中每个热点停滞执行的原因,导致停滞瓶颈可能跟前端绑定,后端绑定,退休,错误投机有关。图28描述了TMA性能瓶颈分类的概念,我们知道CPU中有内存缓冲区,它们持续跟踪正在执行的指令的信息。只要信的指令被取地址或者译码,都在回在这些缓冲区中记录新的条目。如果在指定执行周期中指令对应的微操作没有被分配,可能有两种原因,不能对它进行取地址和译码。后端负载过重导致无法为新的微操作分配资源。被分配和调度执行但是没有退休的微操作跟错误投机相关。
TMA通过采集特定指标来观察程序的执行情况,基于这些指标,通过将应用程序关联到某个分类来表征其类型。每个分类中都嵌套更细的分类。可以更好的细分程序中CPU性能瓶颈,我们多次运行被测试程序,每次都关注特定的指标并往下钻。直到找到更详细的性能瓶颈分类。
TMA 槽位,
非停滞 停滞
退休 错误投机 前端绑定 后端绑定
基础轻量 微码序列器 分支预测错误 机器清理 读取延迟 读取带宽 核绑定 内存绑定
浮点算数运算 其他 辅助, ITLB未命中 指令缓冲未命中 分支重定向 读取源1,读取源2, 除法器 执行端口利用率, 存储绑定,L1缓存绑定 L2缓存绑定 Ln缓存绑定 外存绑定。
标量运算,向量运算 3+ 号端口,1或2号端口 0号端口,内存带宽,内存延迟。
在真实的应用场景中,性能可能受限于多种因素,TMA需要同时向下钻多个类别,确定每个类别瓶颈对程序性能的影响,分析工具Intel Vtune Profiler AMD uprof 可以在一次基准测试运行中计算所有相关的指标。
前两层的TMA指标都是通过所有流水线槽位利用率来表示的。
6.1.1 Intel Vtune Profiler中的TMA
TMA在最新的Intel Vtune Profiler的微架构搜索分析中有体现,图30展示了7.zip基准测试的分析总结,从图可以看到,CPU错误投机导致了显著的执行时间浪费。
该工具的精妙之处就是可以单击自己感兴趣的指标,可以展示与该指标相关的函数,例如。 单击错误投机指标,你将会看到图31展示的内容。
如果双击Lzma_DecodeReal2函数,Intel Vtune Profiler会展示代码视图,如图32所示,高亮显示的代码对LzmaDec_DecodeReal2函数的分支预测错误贡献最大。
最图32 微架构搜索,源代码和汇编指令视图
6.1.2 linux perf中的TMA
linux内核从4.8开始,perf增加了一个 --topdown参数,可以在perf stat命令中,打印TMA第一层指标,该层只有4个类别。
retiring bad speculat FE bound BE bound
为了获得高层TMA指标的值,linux perf需要剖析整个系统-a, 所以我们可以看到所有的CPU核指标。但是,通过taskset -c 0可以将基准测试绑定到core 0, 所以可以看到第一行,也就是s0-c0对应的这一行。
可以使用toplev工具获得TMA 的第2,3及其他层指标。