性能优化PPT5
性能优化PPT5
Lecture 5:Performance Measurements
🎯 本讲目标:Roofline 分析 & 性能测量
🧠 Exercise 4:Roofline for Matrix-Vector Multiply
目标计算: \(y = Ax = \sum_{j=1}^{n_{col}} A_{ij}x_j\)
🌄 Roofline 模型概述
- 用于不同硬件配置的对比
- 提供代码性能的高层次概览
- 给出优化方向的建议
🔍 Performance Measurements 作用
- 获取更多关于性能瓶颈的信息
- 用于验证通过 roofline 分析形成的性能假设
🛠️ 性能测量手段
使用特殊寄存器(Performance Counters)
现代硬件中常见,用于记录底层性能事件:
- 不同类型的 FLOPs(标量、SSE、AVX)
- 多级缓存的 miss/hit 数量
- 分支预测的成功率
- …
⚠️ 注意:
- 信息庞杂复杂
- 最好用于验证模型中提出的性能瓶颈假设
⚠️ Caveats(注意事项)
这些测量提供的是:
- 实际实现的算法的信息
- 实现方式的信息
- 当前运行中实际移动的数据
但它不会考虑:
- 可能更好的算法
- 更优的实现方式
- 不同运行中可能移动的数据
🔑 因此:仅可作为性能模型的补充手段
🔬 Granularity(粒度)
1. 直接读取硬件计数器
- 最详细
- 与硬件强相关,不可移植
2. 抽象指标
- 将底层计数器分组
- 更适合跨硬件比较
例如:instructions
→instructions per cycle
🧪 如何测量?(Tools)
使用 likwid-perfctr
:
- 在 Hamilton 集群上通过
likwid
模块提供 - 命令行工具,使用友好
- 可访问原始计数器 & 常用预设指标组
📌 我们会用 likwid-perfctr
来对比不同实现中 memory reference 的数量
💻 示例:STREAM TRIAD
Scalar 实现
1
2
3
4
5
6
7
for i = 0 to n:
reg1 = load a[i]
reg2 = load b[i]
reg4 = load c[i]
reg3 = reg1 * reg2
reg4 = reg3 + reg4
store c[i] = reg4
SSE 实现(每次处理 2 个)
1
2
3
4
5
6
7
for i = 0 to n by 2:
vreg1 = vload a[i:i+2]
vreg2 = vload b[i:i+2]
vreg4 = vload c[i:i+2]
vreg3 = vmul vreg1, vreg2
vreg4 = vadd vreg3, vreg4
vstore c[i:i+2] = vreg4
AVX 实现(每次处理 4 个)
1
2
3
4
5
6
7
for i = 0 to n by 4:
vreg1 = vload a[i:i+4]
vreg2 = vload b[i:i+4]
vreg4 = vload c[i:i+4]
vreg3 = vmul vreg1, vreg2
vreg4 = vadd vreg3, vreg4
vstore c[i:i+4] = vreg4
AVX2 实现(使用 fused multiply-add)
1
2
3
4
5
6
for i = 0 to n by 4:
vreg1 = vload a[i:i+4]
vreg2 = vload b[i:i+4]
vreg3 = vload c[i:i+4]
vreg3 = vfma vreg1, vreg2, vreg3
vstore c[i:i+4] = vreg3
📊 模型分析
对于 $N = 10^6$,每轮循环有:
- 3 次加载(load)
- 1 次存储(store)
向量宽度为 $W$,则总共需要:
- $ \frac{3N}{W} $ 次 load
- $ \frac{N}{W} $ 次 store
本文由作者按照 CC BY 4.0 进行授权