【问题标题】:What is the difference between a store queue and a store buffer?存储队列和存储缓冲区有什么区别?
【发布时间】:2014-09-18 11:27:42
【问题描述】:

我正在阅读许多论文,它们要么交替使用存储缓冲区和存储队列,要么它们与不同的结构有关,我就是无法理解。这就是我认为的商店队列:

  • 它是一个可关联搜索的 FIFO 队列,以获取顺序保存有关存储指令的信息。
  • 它保存存储地址和数据。
  • 它保留存储指令的数据,直到指令变为非推测性,即它们达到退休阶段。存储指令的数据只有在到达退出阶段时才会从存储队列发送到内存(在这种情况下为 L1 高速缓存)。这一点很重要,因为我们不希望将推测性存储数据写入内存,因为它会扰乱有序的内存状态,并且在发生错误预测的情况下我们将无法修复内存状态。
  • 发生错误预测时,存储队列中与在错误预测指令之后提取的存储指令相对应的信息将被删除。
  • 加载指令向 L1 缓存和存储队列发送读取请求。如果在存储队列中找到具有相同地址的数据,则将其转发到加载指令。否则,使用从 L1 获取的数据。

我不确定什么是存储缓冲区,但我认为它只是一些缓冲区空间,用于保存等待写入内存的 已退休 存储指令的数据(同样,L1)。

现在,这就是我感到困惑的原因。在this 论文中,声明“我们提出了可扩展存储缓冲区 [SSB],它将私有/推测值直接放入 L1 缓存,从而消除了传统存储缓冲区的不可扩展关联搜索。”我认为他们正在谈论的不可扩展的关联搜索传统结构就是我所知道的商店队列,因为他们也说

SSB 消除了传统的不可扩展的关联搜索 通过将处理器可见/推测值转发到 直接从 L1 缓存加载。

正如我上面提到的,据我所知,数据转发到负载是通过存储队列完成的。在第一页的脚注中,还指出

我们使用“存储队列”来指代保存存储值的存储 在退休之前和“存储缓冲区”是指存储包含 在释放到内存之前停用存储值。

这与我上面解释的一致,但是它与第一个引号中的“存储缓冲区”冲突。脚注对应于论文中的references 之一。在那个参考文献中,他们说

存储缓冲区是一种存在于当前许多处理器中的机制 完成以下一项或多项:商店访问排序, 延迟隐藏和数据转发。

再次,我认为实现这些的机制称为存储队列。他们后来在同一篇论文中说

非阻塞缓存和缓冲结构,例如写缓冲区, 通常使用存储缓冲区、存储队列和加载队列。

所以,他们分别提到了存储缓冲区和存储队列,但存储队列稍后不再提及。他们说

存储缓冲区维护存储的顺序并允许 只有在所有先前的指令都已完成后才能执行存储 完成

他们的存储缓冲区模型与 Mike Johnson 的模型相同。在约翰逊的书(超标量微处理器设计)中,存储首先以获取顺序进入存储预留站。从那里,它们被发送到地址单元,并从地址单元将它们连同相应的数据一起写入“存储缓冲区”。负载转发是通过这个存储缓冲区处理的。再一次,我认为这种结构称为存储队列。在参考文献 #2 中,作者还提到了

Alpha 21264 微处理器有一个 32 项的推测存储缓冲区 商店在它退役之前一直存在。”

我看了一篇关于 Alpha 21264 的论文,其中指出

存储第一次传输 它们的数据通过数据总线进入推测存储缓冲区。 存储数据保留在推测存储缓冲区中,直到存储退出。 一旦它们退休,数据就会在空闲缓存周期写入数据缓存。

还有,

内部存储器系统维护一个 32 条目的加载队列 (LDQ) 和 一个 32 条目的存储队列 (STQ),用于管理引用,同时它们 正在飞行中。 [...] 商店在完成后以获取顺序退出 STQ 退休并转储到数据缓存中。 [...] STQ CAM 逻辑控制 推测数据缓冲区。它可以绕过投机 存储数据以在较旧的存储之后出现较年轻的加载问题时加载。

因此,听起来在 Alpha 21264 中有一个存储队列,它以获取顺序保存有关存储指令的一些信息,但它不保留存储指令的数据。存储指令的数据保存在存储缓冲区中。

所以,毕竟我不确定什么是存储缓冲区。它只是存储队列的辅助结构,还是存储等待写入 L1 的数据的完全不同的结构。或者是别的什么?我觉得有些作者说“存储缓冲区”时的意思是“存储队列”。有什么想法吗?

【问题讨论】:

    标签: cpu-architecture


    【解决方案1】:

    您最初的理解是正确的 - Store Buffer 和 Store Queue 是不同的术语和具有不同用途的不同硬件结构。如果某些作者可以互换使用它们,那是完全不正确的。

    存储缓冲区:

    存储缓冲区是更接近内存层次结构的硬件结构 并“缓冲”来自处理器的写入流量(存储),以便 处理器的回写阶段尽快完成。

    根据缓存是写分配/写不分配,对缓存的写入可能需要可变数量的周期。存储缓冲区实质上将处理器流水线与内存流水线解耦。您可以阅读更多信息here

    存储缓冲区的其他用途通常用于推测执行。这意味着当处理器沉迷于推测性执行和提交时(如在硬件事务内存系统中,或其他如 transmeta crusoe 中),硬件必须跟踪推测性写入并在错误推测的情况下撤消它们。这是这样的处理器将使用存储缓冲区的地方。

    存储队列:

    Store Queue 是一个关联数组,处理器在其中存储动态存储的数据和地址。这些通常用于无序处理器中以消除内存歧义。处理器确实需要一个加载存储队列 (LSQ) 来执行内存消歧,因为它必须先查看对同一地址的所有内存访问,然后才能决定在另一个内存操作之前调度一个内存操作。

    所有内存消歧逻辑都是通过乱序处理器中的加载存储队列完成的。阅读更多关于内存消歧的信息here

    如果您的困惑仅仅是因为您所引用的论文,请考虑询问作者 - 他们对术语的使用很可能是混淆了。

    【讨论】:

      【解决方案2】:

      你似乎在用名字做大事,这不是那么重要。缓冲区只是一些通用存储,在这种特殊情况下应作为队列进行管理(如您所述保持程序顺序)。所以它可以是一个存储缓冲区(实际上我更熟悉这个,也可以参见here),但在其他情况下,它可以被描述为一个存储队列(一些设计将它与加载队列结合在一起,形成一个 LSQ)。

      名称并不重要,因为正如您在第二条引文中看到的那样 - 人们可能会用它们来描述新事物。在这种特殊情况下,他们选择将存储缓冲区分成两部分,除以退休指针,因为他们相信他们可以使用它来避免某些一致性模型中某些与存储相关的停顿。嘿,这是他们的论文,剩下的部分他们可以定义他们想要什么。

      不过,请注意 - 您对存储缓冲区/队列的描述的最后一个项目符号似乎非常特定于体系结构,将本地存储转发到具有最高优先级的加载可能会错过以后从其他线程到相同地址的存储,并破坏大部分内存订购模型,除了最宽松的模型(除非您另有保护)。

      【讨论】:

        【解决方案3】:

        这与我上面解释的一致,但随后发生冲突 第一个引号中带有“存储缓冲区”。

        确实没有冲突,您的理解似乎与他们在论文中使用这些术语的方式一致。让我们仔细阅读作者所说的内容。

        SSB 消除了传统的不可扩展的关联搜索 存储缓冲区...

        存储缓冲区保存已停用但尚未写入 L1 缓存的存储。这必然意味着任何较晚发布的加载相对于存储缓冲区中的任何存储在程序顺序上都更年轻。所以要检查加载的目标缓存行的最新值是否还在存储缓冲区中,只需通过加载地址搜索存储缓冲区即可。可以有零个与负载匹配的存储,也可以只有一个存储。也就是说,匹配的商店不能超过一个。在存储缓冲区中,出于转发的目的,您只需要跟踪最后存储到缓存行(如果有)并仅与之比较。这与我将在稍后讨论的存储队列形成对比。

        ...通过将处理器可见/推测值转发给负载 直接来自 L1 缓存。

        在作者提出的架构中,存储缓冲区和一级缓存不在一致性域中。 L2 是相干域中的第一个结构。因此,L1 包含私有值,作者使用它来转发数据。

        我们使用“存储队列”来指代保存存储值的存储 在退休之前和“存储缓冲区”是指存储包含 在释放到内存之前停用存储值。

        由于存储队列包含尚未退役的存储,因此在将负载与存储队列进行比较时,需要检查队列中每个存储的地址和年龄。然后该值从比针对同一位置的负载更旧的最年轻存储转发。

        您引用的论文的目标是找到一种有效的方法来增加存储缓冲区的容量。它只是不对存储队列进行任何更改,因为这不在工作范围内。但是,还有另一个 paper 以存储队列为目标。

        存储缓冲区是一种存在于当前许多处理器中的机制 完成以下一项或多项:商店访问排序, 延迟隐藏和数据转发。

        这些功能适用于存储缓冲区和存储队列。使用存储缓冲区(和队列)是提供这些功能的最常见方式,但还有其他方式。


        一般来说,不同的作者或供应商可能会使用这些术语来指代不同的事物。例如,在 Intel 手册中,只使用了存储缓冲区术语,它同时包含未退休和退休但尚未提交的存储(显然,实现比仅缓冲区复杂得多)。事实上,可以为两种存储都使用一个缓冲区,并使用一个标志来区分它们。在 AMD 手册中,术语存储缓冲区、存储队列和写入缓冲区可互换使用,指代与英特尔所谓的存储缓冲区相同的东西。尽管术语写缓冲区在其他上下文中确实具有特定含义。如果您阅读的文档使用了这些术语中的任何一个而没有对其进行定义,那么您必须从上下文中弄清楚它们是如何使用的。在您引用的那篇特定论文中,这两个术语已被精确定义。不管怎样,我知道因为我去过那里很容易混淆。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-21
          • 2020-06-23
          • 2017-11-24
          • 2018-04-20
          • 2020-12-21
          • 2013-07-21
          • 2019-07-19
          • 1970-01-01
          相关资源
          最近更新 更多