gpt4 book ai didi

memory - 在多处理器系统中,每个核心外部的内存在概念上总是平坦/统一/同步吗?

转载 作者:行者123 更新时间:2023-12-02 11:56:05 24 4
gpt4 key购买 nike

多处理器系统无序且异步地执行“真实”内存操作(那些影响最终执行的操作,而不仅仅是推测执行),因为等待全局状态的全局同步几乎总是不必要地拖延所有执行。另一方面,在每个单独的核心之外,从允许的行为角度(允许的语义)来看,从 L1 缓存开始的内存系统似乎是纯粹同步的、一致的、平坦的;显然时间取决于缓存大小和行为。

因此,在 CPU 上,一个极端被称为“寄存器”,根据定义它们是私有(private)的,而另一个极端则是共享内存;令人遗憾的是,在具有特殊命名或寻址模式的寄存器的微小空间之外,内存始终是全局的、共享的和全局同步的,并且实际上完全受制于所有栅栏,即使它是用作未命名寄存器的内存,对于目的是存储比少数寄存器容纳的更多的数据,而不可能被其他线程检查(除非使用 ptrace 进行调试,它显然会停止、暂停、序列化并存储执行的完整可观察状态)。

现代计算机上总是这样吗(现代=那些可以合理支持 C++ 和 Java 的计算机)?

为什么专用 L1 缓存不为那些仅由特定核心使用的内存单元提供类似寄存器的语义?无论如何,缓存必须跟踪共享的内存。当需要对内存操作进行严格的全局排序时,不必停止对此类本地数据的内存操作,因为没有其他核心正在观察它,并且缓存有能力在需要时停止此类外部访问。缓存只需要知道哪些内存单元是私有(private)的(非全局可读),直到无序操作停止,这使得一致性(缓存可能需要一种方法来要求核心序列化操作并发布一致的状态)内存中)。

是否所有 CPU 都停止并同步栅栏上的所有内存访问或同步操作?

内存可以用作几乎无限的寄存器资源而不受隔离吗?

最佳答案

实际上,与单处理器系统的设计方式相比,在没有其他线程访问的内存上运行的单核并不会为了维护全局内存语义而减慢太多速度。

但是在大​​型多插槽系统上,尤其是 x86,缓存一致性(窥探其他插槽)是导致缓存未命中导致内存延迟比单插槽系统更严重的部分原因,尽管。 (对于私有(private)缓存中丢失的访问)。

<小时/>

是的,所有可以运行单个多线程程序的多核系统都使用 MESI 缓存一致性协议(protocol)的某种变体,在所有内核之间具有一致的共享内存。 (此规则的任何异常(exception)都被认为是外来的,必须专门编程。)

具有多个需要显式刷新的独立一致性域的大型系统更像是一个用于高效消息传递的紧密耦合集群,而不是 SMP 系统。 (普通 NUMA 多插槽系统具有缓存一致性:Is mov + mfence safe on NUMA? 特别针对 x86 进行详细介绍。)

<小时/>

当某个核心的缓存线处于 MESI Modified 或 Exclusive 状态时,它可以对其进行修改,而无需通知其他核心有关更改的信息。一个高速缓存中的 M 和 E 状态意味着系统中没有其他高速缓存具有该行的任何有效副本。但加载和存储仍然必须遵守内存模型,例如x86 核心仍然必须按程序顺序将存储提交到 L1d 缓存。

<小时/>

L1d 和 L2 是现代 CPU 核心的一部分,但您说得对,L1d 实际上并未经过推测性修改。可以推测性地读取它。

您所询问的大部分内容都是由具有存储转发功能的存储缓冲区处理的,允许执行存储/重新加载,而无需等待存储变得全局可见。

what is a store buffer?Size of store buffers on Intel hardware? What exactly is a store buffer?

存储缓冲区对于将推测性无序执行(将数据+地址写入存储缓冲区)从按序提交解耦到全局可见的 L1d 缓存来说是必不可少的。

即使对于有序核心来说,这也非常重要,否则缓存未命中存储将停止执行。通常,您希望存储缓冲区将连续的窄存储合并为单个更宽的缓存写入,特别是对于可以积极执行此操作的弱排序 uarch;许多非 x86 微架构仅对对齐的 4 字节或更宽的 block 进行完全有效的缓存提交。

在强有序内存模型上,推测性乱序加载并稍后检查是否有任何其他核心在我们“允许”读取该行之前使该行无效,这对于高性能也至关重要,从而允许命中-未命中使无序执行继续,而不是一个缓存未命中加载导致所有其他加载停止。

<小时/>

此模型有一些限制:

  • 有限的存储缓冲区大小意味着我们没有太多的私有(private)存储/重新加载空间
  • 强顺序内存模型会阻止私有(private)存储无序地提交到 L1d,因此存储到必须等待来自另一个核心的行的共享变量可能会导致存储缓冲区被私有(private)存储填满。
  • 内存屏障指令,如 x86 mfencelock add ,或ARM dsb ish必须耗尽存储缓冲区,因此存储到实际上不共享的线程私有(private)内存(并从中重新加载)仍然必须等待您关心的存储变得全局可见。
  • 相反,等待您关心的共享存储变得可见(通过屏障或释放存储)也必须等待私有(private)内存操作,即使它们是独立的。

关于memory - 在多处理器系统中,每个核心外部的内存在概念上总是平坦/统一/同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56268226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com