提问者:小点点

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


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

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

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

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

是否所有CPU停止和同步Geofence上的所有内存访问或同步操作?

内存可以用作不受Geofence限制的几乎无限的寄存器资源吗?


共2个答案

匿名用户

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

但是在大型多套接字系统上,尤其是x86,缓存一致性(窥探另一个套接字)是导致缓存未命中的内存延迟比单套接字系统更糟糕的部分原因。(对于私有缓存中未命中的访问)。

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

具有多个需要显式刷新的独立相干域的大型系统更像是一个紧密耦合的集群,用于高效的消息传递,而不是SMP系统。(普通的NUMA多套接字系统是缓存相干的:NUMA上的mov mgrid安全吗?具体针对x86进行了详细介绍。)

当一个内核有一个缓存行处于MESI修改或独占状态时,它可以在不通知其他内核有关更改的情况下对其进行修改。一个缓存中的M和E状态意味着系统中没有其他缓存具有该行的任何有效副本。但是加载和存储仍然必须尊重内存模型,例如x86内核仍然必须按照程序顺序将存储提交到L1d缓存。

L1d和L2是现代CPU核心的一部分,但是你是对的,L1d实际上并没有被推测地修改。它可以被推测地阅读。

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

什么是存储缓冲区?英特尔硬件上存储缓冲区的大小?存储缓冲区到底是什么?

存储缓冲区对于将推测性乱序执行(将数据地址写入存储缓冲区)从有序提交解耦到全局可见的L1d缓存至关重要。

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

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

这个模型有一些限制:

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

匿名用户

内存始终是全局的、共享的和全局同步的,并且实际上完全受制于所有栅栏,即使它的内存用作未命名寄存器,

我不确定你在这里的意思。如果一个线程正在访问私有数据(即不与任何其他线程共享),那么几乎不需要内存栅栏指令1。栅栏用于控制来自一个内核的内存访问被其他内核看到的顺序。

为什么专用L1缓存不为那些仅由特定执行单元使用的内存单元提供类似寄存器的语义学?

我认为(如果我对你的理解正确的话)你所描述的称为暂存存储器(SPM),它是一种硬件内存结构,映射到架构物理地址空间或拥有自己的物理地址空间。软件可以直接访问SPM中的任何位置,类似于主存储器。然而,与主存储器不同,SPM具有比主存储器更高的带宽和/或更低的延迟,但通常尺寸要小得多。

SPM比缓存简单得多,因为它不需要标签、MSHR、替换策略或硬件预取器。此外,SPM的一致性就像主存储器一样,即只有当有多个处理器时才会发挥作用。

SPM已被用于许多商业硬件加速器,如GPU、DSP和多核处理器。我熟悉的一个例子是骑士登陆(KNL)多核处理器的MCDRAM,它可以配置为近内存(即SPM)、主存储器的最后一级缓存或混合。配置为SPM的MCDRAM部分映射到与DRAM相同的物理地址空间,L2缓存(每个磁贴都是私有的)成为该部分MCDRAM的最后一级缓存。如果有一部分MCDRAM配置为DRAM的缓存,那么它将是DRAM的最后一级缓存,而不是SPM部分。MCDRAM的带宽比DRAM高得多,但延迟大致相同。

一般来说,SPM可以放置在内存层次结构中的任何位置。例如,它可以放置在与L1缓存相同的级别。当不需要或几乎不需要在SPM和DRAM之间移动数据时,SPM可以提高性能并降低能耗。

SPM非常适合具有实时要求的系统,因为它提供了关于最大延迟和/或最低带宽的保证,这对于确定是否可以满足实时约束是必要的。

SPM不太适合通用桌面或服务器系统,因为它们可以是多个同时运行的应用程序。这种系统没有实时要求,目前,平均带宽需求并不能证明包含MCDRAM之类的东西的成本是合理的。此外,在L1或L2级别使用SPM会对SPM和缓存施加大小限制,并使OS和应用程序难以利用这种内存层次结构。

英特尔光电DC内存可以映射到物理地址空间,但它与主内存处于同一级别,因此不被视为SPM。

脚注:

(1)单线程(或单处理器)场景下可能仍然需要内存Geofence。例如,如果要测量特定区域的代码在乱序处理器上的执行时间,可能需要将该区域包裹在两条合适的Geofence指令之间。通过写合并内存映射的I/O页与I/O设备通信时也需要Geofence,以确保所有较早的存储都已到达设备。