在此示例中,数据缓存如何路由对象?

问题描述 投票:4回答:1

考虑图解数据缓存架构。 (ASCII艺术如下。)

  --------------------------------------
  | CPU core A | CPU core B |          |
  |------------|------------| Devices  |
  |  Cache A1  |  Cache B1  | with DMA |
  |-------------------------|          |
  |         Cache 2         |          |
  |------------------------------------|
  |                RAM                 |
  --------------------------------------

假设

  • 一个对象被隐藏在缓存A1的脏线上,
  • 同一个对象的旧版本被屏蔽在一个干净的Cache 2行上,并且
  • 最近通过DMA将同一对象的最新版本写入RAM。

图:

  --------------------------------------
  | CPU core A | CPU core B |          |
  |------------|------------| Devices  |
  |  (dirty)   |            | with DMA |
  |-------------------------|          |
  |     (older, clean)      |          |
  |------------------------------------|
  |          (newest, via DMA)         |
  --------------------------------------

请问三个问题。

  1. 如果CPU核心A试图加载(读取)对象,会发生什么?
  2. 相反,如果CPU核心A试图存储(写入)对象,会发生什么?
  3. 如果,而不是核心A,核心B进行加载或存储,是否会发生任何不明显,有趣和/或不同的事情?

我的问题是理论上的。我的问题没有涉及任何特定的CPU架构,但如果您愿意,可以在答案中参考x86或ARM(甚至RISC-V)。

笔记。如果忽视窥探将简化您的答案,那么您可以自行决定忽视窥探。或者,如果修改后的问题更能说明您认为的主题,则可以修改问题。如果你必须编写代码来回答,那么我更喜欢C / C ++。在我的答案中,你不需要在你的答案中命名MESI或MOESI协议的特定标志,但更简单,更不详细的答案可能就足够了。

动机。我的动机是,我正在阅读C ++标准中的并发性和内存模型。我想学习如果可能的话,在硬件操作方面大致可视化这个模型。

UPDATE

在我理解的范围内,@ HadiBrais建议下面的图表架构比我之前描述的架构更常见,特别是如果实现DDIO(见下面的答案)。

  --------------------------------------
  | CPU core A | CPU core B | Devices  |
  |------------|------------| with DMA |
  |  Cache A1  |  Cache B1  |          |
  |------------------------------------|
  |              Cache 2               |
  |------------------------------------|
  |                RAM                 |
  --------------------------------------
caching cpu-architecture cpu-cache dma memory-model
1个回答
4
投票

您的假设系统似乎包括连贯的,回写的L1缓存和非连贯的DMA。一个非常相似的真正处理器是ARM11 MPCore,除了它没有L2缓存。但是,大多数现代处理器都具有连贯的DMA。否则,软件有责任确保一致性。图中所示的系统状态已经不连贯。

如果CPU核心A试图加载(读取)对象,会发生什么?

它只会读取其本地L1缓存中保存的行。不会发生任何变化。

相反,如果CPU核心A试图存储(写入)对象,会发生什么?

这些行已经在核心A的L1缓存中处于M一致状态。因此它可以直接写入它。不会发生任何变化。

如果,而不是核心A,核心B进行加载或存储,是否会发生任何不明显,有趣和/或不同的事情?

如果核心B向同一行发出加载请求,则核心核心A的L1高速缓存被窥探并且该行被发现处于M状态。该行在L2缓存中更新,并发送到核心B的L1缓存。还会出现以下情况之一:

  • 该行从核心A的L1缓存中失效。该线路以E相干状态(在MESI协议的情况下)或S相干状态(在MSI协议的情况下)插入核心B的L1高速缓存中。如果L2使用监听过滤器,则更新过滤器以指示核心B具有处于E / S状态的线路。否则,L2中的行的状态将与核心B的L1中的行相同,除了它不知道它在那里(因此窥探将不得不总是被广播)。
  • 核心A的L1高速缓存中的线路状态变为S.该线路以S相干状态插入核心B的L1高速缓存中。 L2将线路插入S状态。

无论哪种方式,L1高速缓存和L2高速缓存都将保持该行的相同副本,这与存储器中的副本保持不一致。

如果核心B向同一线路发出存储请求,则该线路将从核心A的高速缓存中失效,并最终在核心B的高速缓存中处于M状态。

最终,该行将从缓存层次结构中逐出,以便为其他行腾出空间。当发生这种情况时,有两种情况:

  • 该行处于S / E状态,因此它将从所有缓存中删除。之后,如果再次读取该行,则将从主存储器读取DMA操作写入的副本。
  • 该行处于M状态,因此它将被写回主存储器并(可能部分地)覆盖由DMA操作写入的副本。

显然,这种不连贯的状态绝不会发生。可以通过在DMA写入操作开始之前使所有高速缓存中的所有相关行无效并且确保在操作完成之前没有核心访问正被写入的存储器区域来防止它。只要操作完成,DMA控制器就会发送一个中断。在读DMA操作的情况下,需要将所有相关线写回存储器以确保使用最新值。

Intel Data Direct I/O(DDIO)技术使DMA控制器能够直接从共享的最后一级缓存读取或写入,以提高性能。


这部分与问题没有直接关系,但我想在某处写这个。

所有商用x86 CPU都是完全高速缓存一致的(即整个高速缓存层次结构是连贯的)。更确切地说,同一共享存储器域内的所有处理器都是高速缓存一致的。此外,所有商业x86多核协处理器(即PCIe卡形式的Intel Xeon Phi)内部完全一致。协处理器是PCIe互连上的设备,与其他协处理器或CPU不一致。因此协处理器驻留在它自己的单独的一致性域中。我认为这是因为没有内置的硬件机制来使PCIe设备具有与其他PCIe设备或CPU一致的高速缓存。

除商用x86芯片外,还有原型x86芯片,它们不具有高速缓存一致性。我所知道的唯一例子是英特尔的Single-Chip Cloud Computer(SCC),后来演变为连贯的Xeon Phi。

© www.soinside.com 2019 - 2024. All rights reserved.