鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

Top-Down模型分析调优

原理

通过Perf命令或者Tuning Kit工具收集应用软件运行期间的Top-Down信息。

Top-Down结果示例:

++++++++++++++++++Top-down Microarchitecture Analysis Summary+++++++++++++++++
Total Execution Instruction:                    11705799905
Total Execution Cycles:                          9265629085
Instructions Per Cycle:                               1.263

Front-End Bound:                                   61.990%
Front-End Latency:                          31.796%
iTLB Miss:                         0.018%
L1 iTLB Miss:               0.018%
L2 iTLB Miss:               0.000%
iCache Miss:                         0.495%
L1 iCache Miss:              0.367%
L2 iCache Miss:              0.128%
BP_Misp_Flush:                      0.075%
OoO Rob Flush:                       0.000%
Static Predictor Flush:                   0.041%
Front End Bound Bandwidth:                     30.193%

Bad Speculation:                                        1.687%
Branch Mispredicts:                             0.292%
Indirect Branch:                        0.087%
Push Branch:                           0.004%
Pop Branch:                            0.081%
Other Branch:                          0.205%
Machine Clears:                                1.395%
Nuke Flush:                            0.220%
Other Flush:                           1.175%

Retiring:                                             31.584%

Back-End Bound:                                      4.739%
Resource Bound:                               3.691%
Sync_stall:                            0.000%
Rob_stall:                             0.089%
Ptag_stall:                            0.011%
SaveOpQ_stall:                        0.000%
PC_buffer_stall:                       0.433%
Core Bound:                                 59.466%
Divider:                             0.001%
FSU_stall:                           0.000%
Exe Ports Util:                       59.465%
ALU BRU IssueQ Full:        19.347%
LS IssueQ Full:               1.037%
FSU IssueQ Full:              0.000%
Memory Bound:                               35.199%
L1 Bound:                           18.958%
L2 Bount:                            0.045%
Intra Cluster Remote L2 Bound:          0.571%
Local LLC Bound:                     0.726%
Inter Cluster Local LLC Bound:          7.886%
Intra Chip Remote LLC Bound:          -3.371%
Inter Chip Remote LLC Bound:           8.203%
Intra Chip Local DDR Bound:            1.267%
Intra Chip Remote DDR Bound:          0.705%
Inter Chip Remote DDR Bound:          0.210%
Store Bound:                          0.000%
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

使用方法

  • Frontend bound(前端依赖)指的是通过CPU预加载、乱序执行技术获得的额外性能。
  • Backend bound(后端依赖)指的是传统的CPU负责处理事务的能力。由于这一个部分相对其他部分来说,受程序指令的影响更为突出,这一块又划分出了两个分类。core bound(核心依赖)意味着系统将会更多的依赖于微指令的处理能力。memory bound(存储依赖)这里的memory包含了CPU L1~L3缓存的能力和传统的内存性能。
  • Bad speculation(分支预测错误)这一部分指的是由于CPU乱序执行预测错误导致额外的系统开销。
  • Retiring(拆卸)字面理解是退休的意思,事实上这里指的是等待指令切换,模块重新初始化的开销。

在前端依赖中,如果iTLB miss率较高,可采用hugepage来进行优化,参考调整内存页大小

如果分支预测开销较大,可以通过编译器参数-funroll-loops来进行优化,参考编译器调优;也可以对指令进行重新排布,尽量让跳转指令分布在不同的内存区间中;另外使用PGO/FDO进行预编译来提高分支预测的准确率。

在核心依赖中的开销占比可以通过增加计算核心来降低。存储依赖的开销中,如果L1及L2 cache miss率较高,可以更新编译器,使用编译优化参数来减少指令条数。如果是内存的话就可以通过升级内存带宽或者更高频、更低潜伏期的内存来获得性能提升。