为啥不能提供从一个处理器到另一个处理器的缓存的直接访问?

Posted

技术标签:

【中文标题】为啥不能提供从一个处理器到另一个处理器的缓存的直接访问?【英文标题】:Why can't be provided a direct access from one processor to the cache of another processor?为什么不能提供从一个处理器到另一个处理器的缓存的直接访问? 【发布时间】:2015-07-12 12:39:42 【问题描述】:

在 NUMA 架构(非统一内存访问)中,每个处理器都有自己的一级缓存,因此有一个用于处理器通信的协议 (MESI)。但是为什么每个处理器不能直接连接到其他的缓存呢?我读到“连接根本不够快”,但这并没有解释太多。

谢谢。

【问题讨论】:

【参考方案1】:

首先,拥有 L1 缓存并不意味着 NUMA 架构,主板拓扑仍然是制造机器 UMANUMA。

其次,使用的Cache Coherence 协议依赖于架构,可能与MESI 不同(实际上MESIF 更适合NUMA机器)。


转向您的问题

每个处理器都可以连接到彼此处理器缓存。事实上,每个缓存一致性协议都这样做,只是不允许直接读/写,因为它需要大量的努力且可重用性差

但是,可以将 CPU 直接连接到另一个 CPU 缓存,实际上它是在 Intel CPU 上以某种方式实现的。 逻辑内核(即超线程内核)可以共享 L2 缓存,并且同一包中的某些物理内核可以共享 L3 缓存。 但是这里有两个重要方面:第一,共享缓存的 CPU 数量很少,第二它们在同一个内核/包中

直接连接所有缓存将失去CPU(整体)内部与CPU外部之间的界限。 隔离 CPU 让我们可以创建非常可定制和模块化的系统,外部协议是一个让我们隐藏实现细节的接口,这比紧密连接的缓存所带来的速度增益更有价值。 当我们需要这样的速度时,我们会构建专用的集成系统组件,例如coprocessor。

缓存没有直接连接的原因有很多,我不能代表行业领导者,但这里有一些通用的想法。

    它无法扩展。 2 个处理器表示 1 个链路,3 个处理器表示 3 个链路,4 个处理器表示 6 个链路,依此类推。n 个处理器需要 C(n,2) 个链路,即 n * (n-1) / 2 个链接。 此外,您只能连接具有兼容缓存接口的 CPU,这可能意味着您只能连接相同的 CPU。缓存架构是经常变化的东西,行可能会变大,关联性可能会改变,信号的时序可能会更快。 最后,如果一个 CPU 有足够的引脚来连接另外四个 CPU,则您只能创建四核系统。 需要很多引脚。 访问缓存需要很多引脚,每个内核有两个或三个缓存,每个缓存都需要寻址和控制,这需要暴露很多引脚,串行接口不是一种选择,因为它太慢了. 如果您添加每个处理器必须相互连接,则引脚数会呈二次增长。 如果你在缓存之间使用共享总线,你实际上是在使用像 MESI 这样的协议,该协议试图避免总线拥塞,因为即使你的 CPU 很少,共享总线上的流量也会相当大。紧张,等待轮到它使用它所花费的时间会减慢 CPU(即使使用存储缓冲区和失效队列)。 速度很慢。 缓存与内核高度集成,它可以支持多个读/写端口和其他增加并行化的接口。如果没有大量引脚(以及尺寸和成本的巨大增加),所有这些都无法从封装/内核中暴露出来。 缓存在物理上靠近核心,这样可以最大限度地减少传播延迟,考虑到 3GHz CPU 的周期是 1/3 * 10^-9,在那个时候光最多可以传播10 cm,或往返5 cm,并且信号不会以光速传播。 此外,当缓存仅由内核访问时,设计人员可以根据内核的内部架构进行一些优化。如果核心属于另一个可能不同的 CPU,则这是不可能的。 很复杂。 让多个 CPU 访问高速缓存需要复制大量电路,例如作为关联高速缓存,这意味着当请求地址时,必须在一组可能的候选者之间验证标签,并且必须复制该电路以允许其他 CPU 异步读取/写入缓存。

简单地说:可以直接连接缓存,只是不值得分立组件。它是针对集成组件完成的。

【讨论】:

非常感谢您的回答!

以上是关于为啥不能提供从一个处理器到另一个处理器的缓存的直接访问?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在浏览器缓存处理缓存时使用服务工作者进行缓存?

从硬件缓存模型到Java内存模型原理浅析

为啥多个 WebView 不能共享缓存?

为啥不能在主线程中直接捕获和处理工作线程抛出的异常?

为啥我不能从将一个列表附加到另一个列表中获取元素

为啥我不能将数据从 RecyclerView 传递到另一个 RecyclerView - AndroidX