目录
- 第1章 导读
- 第一部分 现代CPU性能分析
- 第2章 性能测量
- 第3章 CPU微架构
- 第4章 性能分析中的术语和指标
- 第5章 性能分析方法
- 第6章 性能分析相关的CPU特性
- 第二部分 基于源代码的CPU优化
- 第7章 CPU前端优化
- 第8章 CPU后端优化
- 第9章 优化错误投机
- 第10章 其他调优
- 第11章 优化多线程应用程序
第4章 性能分析中的术语和指标
收集退休指令的数量
1 2
$ perf stat -e instructions ./a.exe 2173414 instructions
获取所有CPU的利用率
1 2
$ perf stat -- a.exe 0.634874 task-clock (mesc) # 0.773 CPUs utilized
获取负载程序的IPC
1 2 3
$ perf stat -e cycles,instructions -- a.exe 2369632 cycles 1725916 instructions # 0.73 inst per cycle
获取负载程序微操作的发射、执行和退休数量
1 2 3 4
$ perf stat -e uops_issued.any,uops_executed.thread,uops_retired.all -- a.exe 2856278 uops_issued.any 2720241 uops_executed.thread 2557884 uops_retired.all
指标cycles统计真正的CPU时钟周期数,即会考虑频率调整
指标ref-cycles统计时钟周期数量,不受动态频率调整的影响
1 2 3 4
$ perf stat -e cycles,ref-cycles ./a.exe 43340884632 cycles # 3.97 GHz 37028245322 ref-cycles # 3.39 Ghz 10.899462364 seconds time elapsed
获取L1缓存未命中数量
1 2 3 4 5 6 7 8
$ perf stat -e mem_load_retired.fb_hit, mem_load_retired.l1_miss, mem_load_retired.l1_hit, mem_inst_retired.all_loads -- a.exe 29580 mem_load_retired.fb_hit 19036 mem_load_retired.l1_miss # 3.5% 加载动作未命中 497204 mem_load_retired.l1_hit 546230 mem_inst_retired.all_loads
获取L1缓存未命中的加载动作在L2缓存中的命中情况
1 2 3 4 5 6
$ perf stat -e mem_load_retired.l1_miss, mem_load_retired.l2_hit, mem_load_retired.l2_miss -- a.exe 19036 mem_load_retired.l1_miss 12360 mem_load_retired.l2_hit 7188 mem_load_retired.l2_miss # 37% 未命中
检查分支预测错误的次数
1 2 3
$ perf stat -e branches,branch-misses -- a.exe 358209 branches 14026 branch-misses # 3.92%