【问题标题】:Write Allocate / Fetch on Write Cache Policy写入缓存策略上的写入分配/获取
【发布时间】:2017-01-12 01:19:34
【问题描述】:

我找不到详细解释该政策如何运作的来源。有兴趣的人在Jouppi's Paper 中解释了写入策略的组合。我是这么理解的。

  1. 写请求从 cpu 发送到缓存。
  2. 请求导致缓存未命中。
  3. 在缓存中为此请求分配了一个缓存块。(Write-Allocate)
  4. 写入请求块从较低的内存中提取到分配的缓存块中。(Fetch-on-Write)
  5. 现在我们可以写入已分配和更新的 fetch 缓存块。

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

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

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

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

【问题讨论】:

    标签: caching computer-science cpu-architecture cpu-cache


    【解决方案1】:

    它被直接写入分配的缓存块,稍后与读取请求合并。

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

    缓存以缓存行粒度跟踪有效性。它无法存储“字节 3 到 6 有效;当数据从内存到达时保留它们”这一事实。这种逻辑太大,无法在缓存数组的每一行中复制。

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


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

    在真正的 CPU 中,multiple outstanding misses can be in flight at once(即使没有完全的乱序推测执行)。这被称为小姐下小姐。 CPUcache 连接需要一个缓冲区来处理可以并行支持的每个未完成的未命中,以保存存储数据。例如一个核心可能有 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 缓存的自适应替换策略,使其在扫描大型阵列时更能抵抗驱逐有价值的数据。

    【讨论】:

    • 我可以知道保存存储数据的缓冲区的名称吗?我知道 CPU 可以有多个未完成的读取请求,因为未命中状态处理寄存器使其成为非阻塞缓存,但我不知道充当存储数据缓冲区的硬件名称,该缓冲区预期将与 fetched 合并AMD K6 情况下来自较低内存的数据。如果您能告诉我此硬件的名称或详细信息或示例,我将不胜感激。
    • @menderft:“存储缓冲区”显然包含此含义。维基百科上的 MESI 文章 uses that term when describing cache-miss stores having to wait while writing to an invalid cache line。在具有强内存排序的架构上,CPU 需要协调事物以确保存储不会以架构上不允许的顺序提交。它还需要为自己的负载窥探存储缓冲区,以保持单个线程按顺序执行的外观。所以缓冲区是存储队列的一部分。
    • 是的,当我搜索存储缓冲区时,有很多与我的问题相关的问题。谢谢。
    猜你喜欢
    • 2021-03-04
    • 2018-06-24
    • 1970-01-01
    • 2018-07-04
    • 2011-03-10
    • 2020-04-06
    • 1970-01-01
    • 2013-05-31
    • 2020-03-28
    相关资源
    最近更新 更多