写分配/获取写缓存策略

Write Allocate / Fetch on Write Cache Policy

我找不到详细说明政策运作方式的资料来源。写策略的组合在 Jouppi's Paper 中为感兴趣的人解释。我是这样理解的。

  1. 写请求从cpu发送到缓存。
  2. 请求导致缓存未命中。
  3. 在缓存中为此请求分配了一个缓存块。(写入分配)
  4. 写入请求块从低位内存获取到分配的缓存块。(写入时获取)
  5. 现在我们可以通过获取缓存块写入分配和更新。

问题是第 4 步和第 5 步之间发生了什么。(假设缓存是使用未命中状态处理寄存器的非阻塞缓存。)

是否 CPU 必须 重试缓存写入请求直到写入命中 发生? (在将块提取到分配的缓存块之后)

如果没有,同时写请求数据被保存在哪里

编辑:我想我已经在 Implementation of Write Allocate in the K86™ Processors 中找到了答案。它直接写入分配的缓存块,稍后与读取请求合并。

It is directly being written into the allocated cache block and it gets merged with the read request later on.

不,AMD 的 pdf 不是这么说的。他们说存储数据与刚刚从内存中获取的数据合并,然后然后存储到L1缓存的数据数组中。

缓存以缓存行粒度跟踪有效性。它无法存储 "bytes 3 to 6 are valid; keep them when data arrives from memory" 这一事实。这种逻辑太大了,无法在缓存数组的每一行中复制。

另请注意,您找到的 pdf 描述了他们的 AMD K6 微体系结构的一些特定行为,该微体系结构仅为单核,并且某些型号只有单级缓存,因此甚至不需要缓存一致性协议。他们确实描述了在 L1 和 L2 缓存之间使用 MESI 的 K6-III(型号 9)。


A CPU 写入缓存必须保留数据,直到缓存准备好接受它。不过,这不是一个重试直到成功的过程。它更像是缓存在准备好接受该存储时通知存储硬件(即它有该行活动,并且如果缓存与使用 MESI protocol 的其他缓存一致)处于修改状态。

在真实的 CPU、multiple outstanding misses can be in flight at once 中(即使没有完全乱序的推测执行)。这叫做小姐下小姐。 CPU<->缓存连接需要一个可以并行支持的每个未命中的缓冲区来保存存储数据。例如一个核心可能有 8 个缓冲区并支持 8 个未完成的加载或存储未命中。在 8 个缓冲区中的一个可用之前,第 9 个内存操作不会开始发生。在那之前,数据必须保留在 CPU 的存储队列中。

这些缓冲区可能在加载和存储之间共享,或者可能有专用的存储缓冲区。 OP 报告说在 store buffer 上搜索发现了很多相关的感兴趣的东西;一个例子是 this part of Wikipedia's MESI article.

L1 缓存实际上是现代高性能设计中 CPU 内核的一部分。它与内存顺序逻辑紧密集成,需要能够有效地支持原子操作,如 lock inc [mem] 和许多其他并发症(如内存重新排序)。例如,参见 https://en.wikipedia.org/wiki/Memory_disambiguation#Avoiding_WAR_and_WAW_dependencies

一些其他术语:

  • 存储缓冲区
  • 存储队列
  • 内存顺序缓冲区
  • 缓存写端口/缓存读端口/缓存端口
  • 全球可见

远距离相关:An interesting post研究英特尔 IvyBridge 的 L3 缓存的自适应替换策略,使其在扫描大型阵列时更能抵抗逐出有价值的数据。