我试图理解为什么某些 CPU 缓存内存比其他内存快。将高速缓存存储器与主存储器之类的东西进行比较时,存储器类型(SRAM 与 DRAM)以及可能影响访问速度的局部性问题(片上与必须遍历存储器总线)存在差异。但是L1和L2一般都在同一个芯片上,或者至少在同一个die上,而且我认为它们是同一种内存。那么为什么 L1 更快呢?
为什么一级缓存比二级缓存快?
不,它们不是同一类型的 RAM,即使它们位于使用相同制造工艺的同一芯片上。
在所有高速缓存中,L1 高速缓存需要有尽可能快的访问时间(最低延迟),而不是它需要多少容量才能提供足够的“命中”率。因此,它使用更大的晶体管和更宽的金属轨道构建,以牺牲空间和功率来换取速度。更高级别的高速缓存需要具有更高的容量,但可以承受更慢的速度,因此它们使用更紧凑的更小的晶体管。
L1 通常用作解码指令的存储,而 L2 是单核的通用缓存。缓存越低,它的大小越小,通常速度越快。作为 PC 处理器的粗略经验法则:
L1 Cache:2-3个时钟周期访问
L2 缓存:~10 个时钟周期访问
L3 缓存:~20-30 时钟周期访问
L1 缓存的设计应该是最大化命中率(期望的指令地址或数据地址在缓存中的概率),同时保持缓存延迟尽可能低。Intel 使用延迟为 3 个周期的 L1 高速缓存。L2 缓存在一个或多个 L1 缓存之间共享,并且通常要大得多。L1 高速缓存旨在最大限度地提高命中率,而 L2 高速缓存旨在最大限度地减少未命中损失(发生 L1 未命中时产生的延迟)。对于具有 L3 高速缓存的芯片,其用途特定于芯片的设计。对于 Intel,L3 缓存于 2002 年首次出现在 4 路多处理器系统(Pentium 4 Xeon MP 处理器)中。从这个意义上说,L3 缓存极大地减少了多线程环境中的延迟并减轻了 FSB 的负担。当时,
此处引用来自“Pinhedd's”的回复。
速度与大小成反比的原因有几个。首先想到的是导体的物理控制,其中信号传播受限于光速的某些因素。一个操作可能需要一个电信号在内存块内传播最远距离并返回的时间。另一个相关的原因是时钟域的分离。每个 CPU 都使用自己的时钟发生器运行,这允许 CPU 在数 GHz 时钟上运行。一级缓存以 CPU 时钟运行并与 CPU 时钟同步,这是系统中最快的。另一方面,二级缓存必须服务于许多 CPU,并且运行在不同的(较慢的)时钟域中。不仅 L2 时钟较慢(更大的 tile),而且跨越时钟域边界会增加另一个延迟。当然还有扇出问题(已经提到过)。
除了固有的性能特征外,局部性也有一定的作用(L1 更接近 CPU)。根据每个程序员应该了解的内存:
有趣的是,对于片上 L2 高速缓存,很大一部分(甚至可能大部分)访问时间是由线路延迟引起的。这是一个物理限制,只会随着缓存大小的增加而变得更糟。只有缩小工艺(例如,在英特尔的阵容中,从 Merom 的 60nm 到 Penryn 的 45nm)才能改善这些数字。