您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页CPU性能优化--最后分支记录

CPU性能优化--最后分支记录

来源:爱问旅游网

现代Intel CPUAMD CPU都有一个叫做最后分支记录特性我们可以大段忽略基本其他指令因为分支跳转指令总是基本中最后一条指令实际上Intel处理器跟踪PT技术做的LBR早于PT使用上有区别

我们可以使用LBR分支跳转指令进行采样但是每次采样期间都需要查看LBR已经执行分支跳转指令可以实现比较合理热点代码路径控制覆盖度并且也不会采集太多无用信息因为所有分支跳转指令只有很小一部分检查需要重点注意的是依然是采样并不是所有执行分支跳转指令都能检查到通常CPU执行太快至于LBR有时并不能正常工作

1)最后分支记录LBR Skylake系列CPU提供32MSR用于记录最近执行分支跳转指令起点终点

2)最后分支记录栈顶 LBR包含一个指向MSR指针MSR包含最近记录分支跳转指令中断异常信息

需要注意的是LBR机制只会记录分支跳转指令信息下面一个例子介绍了LBR分支跳转指令如何跟踪记录

mov edi,DWORD PTR [rbx]

test edi,edi

jns 4edale

mov eax,edi

shl eax, 0x7

lea edi, [rax + rdi * 8]

call 4edb26

add rbx, 0x4

mov DWORD PTR [rbx+0x4],eax

cmp rbx,rbp

jne 4eda10

下面执行CALL指令我们期望LBR看到的因为JNS分之没有执行所以不会记录也不会出现LBR

Haswell架构开始LBR条目增加检测分支预测错误组件LBR条目有一个专用标记信息Skylake系列开始又在LBR条目中添加LBR_INF组件有个Cycle Count字段可以用来记录从最近一次更新LBR开始时钟计数

6.2.1 采集LBR栈

使用linux perf工具我们可用如下命令采集LBR

LBR也可以使用命令perf record--call-graph lbr采集但是采集信息量要比命令perf record -b命令perf record--call-graph lbr采集不到分支预测错误时钟周期数据

因为每次采样都会捕捉完整LBR所以采集 数据perf.data大小明星没有启用LBR时候大很多

perf script -F brstack

LBR有很多重要使用场景下面我们讨论最重要的几个场景

6.2.2 获取调用图

我们5,4,3 讨论如何采集调用图以及重要性即使编译程序没有指针(通过编译选项-fomit-frame-pointer控制,)调试信息LBR也可以采集调用图信息

perf record --call-graph lbr -- ./a.exe

perf report -n --stdio

main foo zoo

从上面信息可以看到我们识别程序最热函数bar外层调用函数foo绝大部份时间都花在函数bar我们可以看到91%采样都在函数foo调用函数bar

使用LBR特性我们可以识别超级所谓超级快就是整个程序中一条执行频繁基本链条链条基本物理上不一定连续但是在执行顺序连续

6.2.3 识别热点分支

LBR还可以识别频繁选取分支

perf report -e cycles -b -- ./a.exe

perf record Woken up 3 times to write data

从这个例子可以看50%以上分支选取函数bar内部20%函数foo函数bar调用其他以此类推注意perf工具cycles事件分析LBR变化虽然只有670样本每个样本都有一个完整LBR这样就有

67x32 = 21440LBR条目分析

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务