存储队列和存储缓冲区之间有什么区别?

时间:2014-07-26 21:05:17

标签: cpu-architecture

我正在阅读一些论文,他们要么可以互换地使用商店缓冲区和商店队列,要么与不同的结构有关,而我无法跟进。这就是我认为的商店队列:

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

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

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

  

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

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

  

我们使用"存储队列"指代存储商店价值的存储   退休前和"商店缓冲区"引用包含的存储   退休商店价值在被释放到记忆之前。

这符合我上面解释的内容,但它与“存储缓冲区”相冲突。在第一个引用。脚注对应于论文中的references之一。在该参考文献中,他们说

  

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

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

  

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

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

  

商店缓冲区维护商店的订购并允许   只有在所有先前的指令完成后才能执行的商店   完成

和他们的商店缓冲模型与迈克约翰逊的模型相同。在约翰逊的书(超标量微处理器设计)中,商店首先以获取顺序进入商店预订站。从那里,它们被发送到地址单元,并从地址单元被发送到"存储缓冲区"以及他们的相应数据。通过此存储缓冲区处理加载转发。我再一次认为这个结构被称为商店队列。在参考文献#2中,作者还提到了

  

Alpha 21264微处理器具有32项推测存储缓冲区   商店一直存在,直到它退休。"

我看了一篇关于Alpha 21264的文章,其中说明了

  

存储首次转移   他们的数据通过数据总线进入推测性存储缓冲区。   商店数据保留在推测商店缓冲区中,直到商店退休。   退出后,数据将在空闲缓存周期内写入数据缓存。

此外,

  

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

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

所以,在所有这些之后,我不确定存储缓冲区是什么。它只是存储队列的辅助结构,还是存储等待写入L1的数据的完全不同的结构。或者是别的什么?我觉得有些作者的意思是"存储队列"当他们说"存储缓冲区"。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

你似乎从名字中做了大事,但这并不重要。缓冲区只是一些通用存储,在这种特殊情况下应该作为队列进行管理(按照您的说明维护程序顺序)。所以它可以是一个存储缓冲区(我实际上对这个更熟悉,另见here),但在其他情况下它可以被描述为存储队列(有些设计将它与负载结合起来)队列,形成一个LSQ)。

这些名字并不重要,因为正如你在第二句话中所看到的那样 - 人们可能会超负荷来描述新事物。在这种特殊情况下,他们选择将存储缓冲区拆分为2个部分,除以退出指针,因为他们认为可以使用它来避免某些一致性模型中某些与存储相关的停顿。嘿,这是他们的论文,剩下的就是定义他们想要的东西。

但需要注意的是 - 您对存储缓冲区/队列的描述的最后一个子弹看起来非常特定于体系结构,将本地存储转发到具有最高优先级的加载可能会错过以后存储到其他线程的相同地址,并且会破坏大部分内存除了最放松的模型之外的订购模型(除非你保护不这样做)。

答案 1 :(得分:4)

您最初的理解是正确的 - 存储缓冲区和存储队列是不同的术语和具有不同用途的不同硬件结构。如果一些作者可以互换地使用它们,那很明显是错误的。

存储缓冲区:

  

存储缓冲区是更靠近内存层次结构的硬件结构   和"缓冲区"从处理器上写入流量(存储)以便   处理器的回写阶段尽快完成。

根据缓存是写分配还是写分配,对缓存的写入可能需要不同的循环次数。存储缓冲区实质上将处理器管道与存储器管道分离。您可以阅读更多信息here

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

商店队列:

  

Store Queue是一个关联数组,处理器存储机上商店的数据和地址。这些通常用于无序处理器以用于存储器消歧。处理器真正需要一个加载 - 存储队列(LSQ)来执行内存消歧,因为它必须通过对所有内存访问来查看同一个地址,然后才能完成另一个内存操作的调度。

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

如果您的混淆完全是因为您提到的论文,请考虑询问作者 - 他们对术语的使用可能会混淆。

答案 2 :(得分:0)

  

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

实际上没有冲突,您的理解似乎与本文中使用这些术语的方式一致。让我们仔细研究一下作者所说的话。

  

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

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

  

...通过将处理器可见/推测值转发给负载   直接从一级缓存中获取。

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

  

我们使用“商店队列”来指代拥有商店价值的商店   退役之前,“存储缓冲区”是指包含   退休的存储值释放到内存之前。

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

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

  

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

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


但是,通常,这些术语可能会被不同的作者或供应商用来指代不同的事物。例如,在英特尔手册中,仅使用了存储缓冲区一词,它既包含未退休的也包含已退休但尚未提交的存储区(显然,实现不仅比缓冲区还复杂得多)。实际上,两种存储都可以有一个缓冲区,并使用一个标志来区分它们。在AMD手册中,术语“存储缓冲区”,“存储队列”和“写缓冲区”可互换使用,以表示与Intel所谓的存储缓冲区相同的事物。尽管术语“写缓冲区”在其他上下文中确实具有特定含义。如果您在阅读使用这些术语中的任何一个而未定义它们的文档,则必须从上下文中弄清楚它们的用法。在您引用的那篇论文中,这两个术语已被精确定义。无论如何,我知道容易迷惑,因为我去过那里。