L2·专家经验
计算与内存 — 专家经验
Compute & Memory
资深工程师的深度洞察
核心抽象:指令执行与存储6 分钟阅读2,029 字更新于 2026/09/19
专家经验
1. 深入 CPU 微架构
超标量执行: 现代 CPU 每个周期可发射 6 条微操作到 8 个执行端口。
乱序执行: 当一条指令因数据未就绪而无法执行时,CPU 会跳过它,先执行后面已准备好的指令。
分支预测: 现代处理器的分支预测准确率可达 95-98%,一次预测失败浪费 14-19 个时钟周期。
2. CPU 性能计数器的使用
bash
perf stat -e cycles,instructions,cache-misses,branch-misses ./my_program关键指标:
- IPC > 3:优秀
- IPC 1-3:一般
- IPC < 1:很差
3. 内存带宽 vs 延迟
- 延迟:从请求到收到第一个字节的时间(~100ns)
- 带宽:单位时间内可以传输的数据量(~50-100 GB/s)
高延迟可以通过内存级并行(MLP)来隐藏,但带宽不足无法通过软件优化解决。
4. 缓存一致性协议
MESI 协议:
- M(Modified):已修改,独占
- E(Exclusive):独占,与内存一致
- S(Shared):共享
- I(Invalid):无效
5. TLB 与虚拟内存
使用大页(2MB 或 1GB)可以显著减少 TLB 压力:
c
void *ptr = mmap(NULL, size,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
-1, 0);6. 内存级并行
c
// 高 MLP 代码
float dot_product_mlp(float *a, float *b, int n) {
float sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
for (int i = 0; i < n; i += 4) {
sum0 += a[i] * b[i];
sum1 += a[i+1] * b[i+1];
sum2 += a[i+2] * b[i+2];
sum3 += a[i+3] * b[i+3];
}
return sum0 + sum1 + sum2 + sum3;
}7. 性能分析技术
bash
perf record -F 99 -g -- ./my_program
perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg8. 缓存无关算法
c
void transpose_recursive(float *dst, float *src, int n, int dst_stride) {
if (n <= 32) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
dst[j * dst_stride + i] = src[i * dst_stride + j];
} else {
int half = n / 2;
transpose_recursive(dst, src, half, dst_stride);
// ... 递归处理四个象限
}
}9. 硬件事务内存
c
#include <immintrin.h>
void increment_counter() {
unsigned status = _xbegin();
if (status == _XBEGIN_STARTED) {
shared_counter++;
_xend();
} else {
pthread_mutex_lock(&mutex);
shared_counter++;
pthread_mutex_unlock(&mutex);
}
}10. GPU 内存架构
| 内存类型 | 大小 | 延迟 | 带宽 |
|---|---|---|---|
| 寄存器 | 256/线程 | ~1 cycle | 极高 |
| 共享内存 | 48-164KB/SM | ~20-30 cycles | 极高 |
| L1 缓存 | 与共享内存共享 | ~30 cycles | 高 |
| 全局内存 | 数 GB-数十 GB | ~400-600 cycles | 极高 |
11. 专家级性能调优工作流
1
确定瓶颈类型(前端、后端、分支、内存)
2
定位热点(火焰图、VTune)
3
分析根因
4
实施优化
5
验证效果
黄金法则:
- 先测量,再优化
- 关注最大的瓶颈
- 算法优化优先于微优化
- 保持代码可维护性
交互沙盒
亲手操作验证本层概念,沙盒状态可编码进 URL 分享。