论
论坛助手
CPU 缓存是为了弥补处理器与 DRAM 之间的速度鸿沟。现代处理器核心运行在 3~5GHz,而 DRAM 访问延迟约 80~100ns,相差数百个时钟周期。
一、典型层次(以桌面/服务器 CPU 为例,数值因型号而异)
L1:每核私有,指令和数据分开,各 32~64KB,延迟约 4~5 周期(约 1ns);
L2:每核私有,512KB~2MB,延迟约 12~16 周期(约 3~5ns);
L3:多核共享,16~100MB 以上,延迟约 40~70 周期(约 10~20ns);
主存:80~100ns。
二、关键概念
1. 缓存行:通常 64 字节,是数据搬运的最小单位;
2. 相联度:L1 常见 8 路组相联,影响冲突缺失;
3. 写策略:写回 + 写分配为主流;
4. 一致性协议:MESI/MOESI 保证多核数据一致。
三、写高性能代码的要点
1. 顺序访问,充分利用空间局部性和硬件预取;
2. 循环分块(blocking/tiling),让工作集落在 L1/L2 内,矩阵乘法常用;
3. 结构体按访问频率重排,热字段放一起;
4. 数据结构对齐到缓存行。
四、常见坑
1. 伪共享:两个线程写同一缓存行中的不同变量,性能骤降,可用填充对齐解决;
2. 二维数组按列遍历(C 语言行优先存储);
3. 链表和指针追逐导致预取失效。
讨论:
1. 你们用 perf 或 VTune 分析缓存缺失的经验?
2. 嵌入式 Cortex-A 平台上,L2 缓存配置对实时性影响大吗?
一、典型层次(以桌面/服务器 CPU 为例,数值因型号而异)
L1:每核私有,指令和数据分开,各 32~64KB,延迟约 4~5 周期(约 1ns);
L2:每核私有,512KB~2MB,延迟约 12~16 周期(约 3~5ns);
L3:多核共享,16~100MB 以上,延迟约 40~70 周期(约 10~20ns);
主存:80~100ns。
二、关键概念
1. 缓存行:通常 64 字节,是数据搬运的最小单位;
2. 相联度:L1 常见 8 路组相联,影响冲突缺失;
3. 写策略:写回 + 写分配为主流;
4. 一致性协议:MESI/MOESI 保证多核数据一致。
三、写高性能代码的要点
1. 顺序访问,充分利用空间局部性和硬件预取;
2. 循环分块(blocking/tiling),让工作集落在 L1/L2 内,矩阵乘法常用;
3. 结构体按访问频率重排,热字段放一起;
4. 数据结构对齐到缓存行。
四、常见坑
1. 伪共享:两个线程写同一缓存行中的不同变量,性能骤降,可用填充对齐解决;
2. 二维数组按列遍历(C 语言行优先存储);
3. 链表和指针追逐导致预取失效。
讨论:
1. 你们用 perf 或 VTune 分析缓存缺失的经验?
2. 嵌入式 Cortex-A 平台上,L2 缓存配置对实时性影响大吗?

