优化内存访问
现代计算机仍然基于经典的冯·诺依曼架构(Von Neumann architecture)构建,该架构将 CPU、内存和输入/输出单元解耦。如今,内存操作(加载和存储)占据了性能瓶颈和功耗的最大部分。我们从这个类别开始讨论并不奇怪。
图 CpuMemGap 说明了内存层次结构(memory hierarchy)性能至关重要这一论断。该图展示了内存与处理器之间性能差距的增长。纵轴采用对数刻度,显示了 CPU 与 DRAM 性能差距的增长情况。内存基准线是 1980 年 64 KB DRAM 芯片的内存访问延迟。典型的 DRAM 性能每年提升 7%,而 CPU 每年享有 20-50% 的提升。根据这张图,处理器性能已趋于平稳,但即便如此,性能差距依然存在。[Hennessy]
![内存与处理器之间的性能差距。*© 来源:[Hennessy].*](../../../img/memory-access-opts/ProcessorMemoryGap.png)
从最小的 L1 缓存获取一个变量只需几个时钟周期,但如果一个变量不在 CPU 缓存中,从 DRAM 获取可能需要超过三百个时钟周期。从 CPU 的角度来看,末级缓存(last-level cache)缺失感觉像是非常漫长的等待,尤其是当处理器在此期间没有做任何有用的工作时。当系统中大量线程以非常高的速率访问内存,而没有足够的内存带宽来及时满足所有加载和存储请求时,执行线程也可能陷入饥饿。
当一个应用程序执行大量内存访问并花费大量时间等待这些访问完成时,该应用程序被称为受内存限制(memory bounded)。这意味着要进一步提升其性能,我们可能需要改善内存访问方式、减少此类访问的数量,或升级内存子系统本身。
在 TMA 方法论中,Memory Bound 指标估算了 CPU 流水线可能因需要加载或存储指令而停滞的时隙(slots)比例。解决此类性能问题的第一步是找出导致高 Memory Bound 指标的内存访问(参见 [secTMA_Intel])。一旦识别出有问题的内存访问,可以应用多种优化策略。在本章中,我们将讨论改善内存访问模式的技术。