0

我在 linux 中发现,它显示我的 cpu 的缓存线大小为 64 字节,我意识到存在 16/32/128 字节,但现在大多数 cpu 都设计为 64 字节的缓存线大小。为什么不更大或更小?

4

2 回答 2

2

它是一种权衡。更宽的缓存效率更高(就给定缓存大小的面积/功率而言),但会导致更多内存流量用于随机(非顺序/跨步)访问,以及更多并行缓存之间的错误共享争用。

  • 如果您的内存访问模式只需要每个缓存行中的几个字节(例如,沿着分散在内存中的链表进行迭代),则每次访问都需要将整行拉入缓存。因此,将行大小加倍将使内存流量加倍。

  • 如果不同的 CPU,每个都有自己的缓存,正在访问同一缓存行上的内存,则该行将不得不在缓存之间来回“反弹”。避免这种情况意味着在对象之间放置更多的填充。

在这两种情况下,这些问题都可以通过调整软件来避免这些问题,以使内存成为缓存行大小的倍数。缓存行大小越大,工作量就越多。

于 2021-07-09T17:34:59.453 回答
1

正如Chris Dodd 的回答所指出的,缓存行的大小需要权衡取舍。

更大的高速缓存行减少了每个数据字节的标记位数,提供预取,并以过度预取(浪费带宽和高速缓存容量)、错误共享、更高的未命中延迟为代价促进更高的带宽(特别是在内存和 L1 接口) (尤其是没有关键字首次/提前重新启动)和更高的冲突未命中(对于较小的缓存,使用较少的集合,比关联性更多的访问将映射到特定集合的概率增加)。(更大的缓存行还可以通过保证在更大的地址范围和字节数内命中缓存来提供更高的性能可预测性。)

现代系统不会从这种预取中明显受益;可配置的静态预取器逻辑将提供相同的行为,而动态预取可以利用可变资源可用性(例如,缓存容量和内存通道占用率)和实用程序以及提供更灵活的预取(例如非单元步幅)。

就面积而言,标签开销并不是一个重要的问题对于使用 SRAM 存储数据和标签的现代缓存。(IBM 的 Power 和 zArchitecture 实施使用 eDRAM 进行外部缓存数据存储,使用 SRAM 存储标签,这使标签相对于数据的面积成本增加了一倍以上。)但是,访问延迟和访问能量受标签阵列大小的影响。对于 L1 高速缓存,路径预测对于较大的高速缓存行更有效,这既是因为给定高速缓存容量的高速缓存行较少,而且因为空间局部性往往适用于甚至超出合理的高速缓存行大小;只需检查一组标签以获取更广泛或更多的访问次数可降低更高带宽的成本(这在利用空间局部性并牺牲带宽延迟的 GPU 中最为明显)。对于外部缓存级别,经常使用分阶段的标签数据访问(在数据访问开始之前检查标签,节省能源——尤其是考虑到更高的关联性和未命中率);对于给定容量,较小的标签阵列可以减少访问能量和延迟(尤其是对于未命中的情况——50% 的命中率并非闻所未闻)。(请注意,在缺失没有匹配的部分标签的常见情况下,可以使用部分标签提供早期缺失检测。其他过滤机制也是可能的。)

可以通过使用扇区缓存来对抗虚假共享,其中为标签的每个地址部分提供了一个以上的有效性(或一致性状态)条目。这在具有更频繁错误共享的较大高速缓存行和具有较高标记开销的较小高速缓存行之间提供了一个中间设计点。这也固有地支持减少高速缓存行填充延迟。对于传统布局,当错误共享或较少空间局部性更为常见时,这具有大缓存行的大量有效容量成本。对于使用间接的设计,例如提议的非统一缓存架构和 V-Way 缓存,可以通过以更多间接指针存储为代价以更精细的粒度分配数据存储来减少容量利用率问题。

较大的高速缓存行提供三个带宽优势。命令开销更少(地址和操作信息几乎是恒定的——地址每增加一倍,地址就小一点),因此每个数据字节的带宽开销更低;这对于许多消息仅携带元数据的一致性流量更为重要。(很明显,如果有更多的一致性节点,错误共享可能会影响这一优势。)其他每个请求的开销也不会随着请求大小而扩展(例如,DRAM 行激活与随机访问,完成时关闭行管理) . ECC(或带有重传的校验码)也具有较小的每个有效负载字节开销和较大的有效负载(这可用于在使用商品宽度内存模块时存储额外的元数据)。

当突发长度固定时,更大的高速缓存行也有助于更宽的内存接口。增加 DRAM 突发长度有助于提高带宽;DDR5 移动到 16 的突发长度,推动 DIMM 使用两个 32 位宽的通道,以兼容 x86 在 64 字节高速缓存行上的事实上的标准化。虽然这个机会可以被积极地视为增加可用内存级别并行性 (MLP) - 使通道数量增加一倍并减少 DRAM 库冲突 - 当内存的相对延迟更大(大型片上缓存和更快的处理)时,MLP 更为重要,线程级并行性可用(多核和多线程),并且乱序执行(和多线程)公开更多内存访问以隐藏延迟。多核(与多道程序或大块/流通信(如流水线式多线程)相比,与大量数据内存共享一起使用时)也增加了错误共享的重要性,进一步降低了更大缓存线的好处(除了更窄通道的 MLP 好处) . 由于多核处理器的(片上)通信延迟较低且几乎不可避免,多线程编程变得更具吸引力。

对于 L1 缓存,微架构(以及一些 ISA)可能会影响缓存行的大小。较高频率的设计有利于较小容量的 L1 高速缓存的延迟和访问能量,特别是对于无序执行或倾斜流水线(其中执行流水线阶段比地址生成阶段延迟一个或多个阶段)的延迟容忍度更小。

各种权衡的相对大小还取决于工作负载和软件设计。针对从中受益的工作负载的更大缓存容量缓存减少了更大缓存行的过度预取和冲突缺点;更高的关联性降低了冲突劣势,但更有可能发生冲突的工作负载(通常)不太可能从空间局部性中受益(并且冲突劣势通常对于外部缓存级别不太重要)。指针追踪工作负载倾向于降低延迟,从而降低容量,倾向于更小的缓存线(至少在 L1 中)。

软件设计是一个重要因素。避免错误共享会随着缓存行大小的增加而增加填充,从而阻止更大的缓存行。一旦在软件社区中建立了缓存线大小假设(根据 ISA、操作系统和硬件/系统供应商在某种程度上是隔离的),遗留代码和遗留概念化的影响就会限制缓存线大小。

推测:x86 对通用软件和个人计算机使用的定位(成本和工作负载特性偏向于较小的缓存和工作负载可能通常具有较低的空间局部性)可能比针对工作站和服务器工作负载的 ISA/硬件供应商偏向于更小的缓存行。对软件开发工作的更高期望。x86 对 64 字节缓存行进行了标准化,IBM POWER9 使用 128 字节缓存块(分为四个扇区用于 L1 缓存),IBM z15 使用 256 字节缓存块。

(延迟与命中率、访问能量和其他权衡以及软件和程序员遗留问题似乎导致对 32KiB L1 缓存容量的标准化不那么严格。较小或较大缓存的性能影响可能不如虚假共享显着,因此软件约束不如高速缓存行大小重要。)

于 2021-07-15T18:40:13.407 回答