文章

性能优化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. 抽象指标

  • 将底层计数器分组
  • 更适合跨硬件比较
    例如: instructionsinstructions 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 进行授权