首页 > 解决方案 > 是否有半共享缓存之类的东西?

问题描述

我正在对缓存层次结构进行一些研究,并且遇到了共享和私有缓存的概念。我可以看到缓存对于特定核心(更高级别)是私有的,然后在所有核心之间共享缓存的示例。

是否有任何此类缓存在中间层次结构级别跨某个核心子集共享的示例,如果没有,为什么?我的印象是,这将充当延迟和命中率之间权衡的中间立场,尽管我无法找到这种结构的示例。

标签: cachingmemorycpuprocessorcpu-cache

解决方案


在多个内核之间共享一个中间级缓存——但少于共享最后一级缓存——并不是一个常见的设计点。然而,有一些设计与共享 L2 缓存的内核数量一样多。

POWER4 和 POWER5 都在两个内核之间共享 L2 缓存,而 L3 也在两个内核之间共享。由于 L3 缓存数据存储在芯片外(标签在芯片上)并且每个芯片只有两个内核,这更类似于仅共享最后一级缓存。总 L2 容量受到芯片尺寸的强烈限制,并且 L3(具有片外数据)具有较高的延迟,因此共享以增加有效容量比最近的片上 L3 设计更具吸引力。

SPARC M7 是一个更有趣的例子。M7有一个256 KiB L2数据缓存在两个核心之间共享,一个L2指令缓存在四个核心之间共享,L3在四个核心之间共享(我看到的文档并不完全清楚L3不统一,但证据普遍指向L3对每个由四个核心组成的集群是私有的)。由于数据 L2 仅在两个内核之间共享,因此即使指令 L2 与与 L3 相同数量的内核共享,这也可能算作在比 L3 更少的内核之间共享 L2。

由于 M7 内核是 8 路线程的(并且只有两个宽度的乱序执行),L2 延迟不太重要(从乱序执行中提取的线程级并行性和指令级并行性都可以隐藏延迟和更窄的内核可减少给定数量的停顿周期造成的执行潜在损失)。由于处理器针对具有高线程级并行度和低指令级并行度的商业工作负载,因此增加核心和线程数是主要目标;共享 L2 缓存可以利用通用指令和数据使用——前者尤其重要,但数据共享并不罕见——有助于降低总容量,为更多内核留出空间。

SPARC M8 与此类似,但 L2 数据高速缓存是私有的,并且问题宽度翻了一番,达到四宽。问题宽度的增加增加了 L2 延迟的重要性,尤其是对于中等大小 (16 KiB) 的 L1 缓存。指令高速缓存在一定程度上可以容忍延迟,因为它能够在指令流中提前获取。

中级缓存共享权衡取舍的一些考虑

通过共享增加 L2 缓存的大小将在容量需求不平衡时降低容量未命中率(不仅在一个内核处于非活动状态时,即使同一程序的不同阶段在不同内核上处于活动状态),但在多个内核之间共享 L2增加冲突未命中。增加关联性可以以更高的每次访问能量为代价来消除这种影响。

当两个内核在很短的时间内访问相同的内存位置时,共享缓存可以通过减少复制以及潜在地改进替换决策和提供有限的预取来增加有效容量。如果写入器和读取器共享二级缓存,共享也可以减少缓存块乒乓;然而,明确地利用这种优势会增加软件核心分配的复杂性。如果共享频繁写入的值不可避免地普遍存在,那么即使是随机减少 ping-ponging 也可能很有吸引力,但随着所涉及的内核数量的增加,好处会迅速减少。

当 L2 是中级缓存时,访问延迟非常重要,因为较小的 L2 的容量缺失通常会在 L3 中命中。容量翻倍会增加 40% 以上的访问延迟(延迟大致与容量的平方根成正比)。多个请求者之间的仲裁也往往会增加延迟。(非统一缓存架构,其中不同的缓存块具有不同的延迟可以弥补这种情况。例如,在两个内核之间共享的情况下,四分之一的容量可能位于最靠近每个内核的位置,而剩余的一半则位于中间距离两个核心的距离。但是,NUCA 引入了分配的复杂性。)

虽然增加 L2 容量会使用 L3 缓存(或更多内核或其他功能)本来可以使用的区域,但 L3 切片的大小通常比 L2 容量大得多,因此这种影响不是主要考虑因素。

在两个内核之间共享 L2 也意味着所提供的带宽必须适合两个高度活跃的内核。虽然可以使用银行来促进这种情况(并且单个活动核心可能可以利用额外的带宽),但这种增加的带宽并不是完全免费的。

共享 L2 还会增加缓存分配和替换的复杂性。人们宁愿避免一个核心浪费能力(甚至是关联性)。有时会为最后一级缓存提供这种调节机制(例如,英特尔的缓存分配技术),因此这不是硬性障碍。一些调节机制通常也可以促进更好的替换,L2 机制可以利用与 L3 缓存相关的元数据(减少元数据跟踪的标记开销)来调整行为。

共享 L2 缓存还引入了频率调整方面的复杂性。如果一个核心支持较低的频率,核心和 L2 之间的接口会变得更加复杂,从而增加访问延迟。(理论上,像上面提到的这样的 NUCA 设计可能有一小部分以本地频率运行,并且只在访问更远的部分时支付时钟边界交叉惩罚。)

当 L2 高速缓存专用于单个内核时,电源门控也得到了简化。与其拥有三个电源域(两个内核和 L2),不如使用其内核关闭私有 L2,因此只需要两个电源域。(请注意,添加电源域并不是非常昂贵,并且已提议通过动态降低缓存容量来降低功耗。)

共享的 L2 缓存还可以为片上网络提供方便的合并点,从而减少更广泛网络中的节点数量。(这种合并也可以在 L2 缓存之后完成,从而在两个内核之间提供更低的延迟和更高的带宽通信,同时还提供隔离。)

结论

从根本上说,共享提高了利用率——这对吞吐量(粗略地说,效率)有利,但对延迟(本地性能)不利——但阻碍了通过专业化进行的优化。对于具有后备 L3 缓存的 L2 缓存,专业化优势(更低的延迟)往往超过通用设计的利用优势(通常以吞吐量和效率换取更低的延迟)。片上 L3 缓存降低了 L2 容量未命中的成本,因此更高的 L2 未命中率和更快的 L2 命中时间可以减少平均内存访问时间。

以设计复杂性和一些开销为代价,可以使共享更加灵活,或者可以降低共享成本。增加复杂性会增加开发风险和营销风险(不仅仅是上市时间,功能复杂性也会增加买家选择的难度,而营销简化似乎具有欺骗性)。对于 L2 缓存,更细微的共享成本似乎通常被认为不值得潜在的好处。


推荐阅读