我正在阅读一些论文,他们要么可以互换使用存储缓冲区和存储队列,要么与不同的结构有关,而我无法跟进.这就是我认为的商店队列:
我不确定存储缓冲区是什么,但我认为只是一些缓冲区空间来保持退役存储指令的数据等待写入内存(同样,L1).
现在,这就是为什么我感到困惑.在此论文中,指出"我们提出可扩展存储缓冲器[SSB],这使私人/推测值直接进入L1高速缓存,从而避免不可缩放缔搜索常规存储缓冲器的".我认为他们所讨论的不可扩展的关联式可搜索传统结构就是我所知道的商店队列,因为他们也说
SSB通过将处理器可见/推测值直接转发到L1高速缓存的加载,消除了传统存储缓冲区的不可扩展的关联搜索.
正如我上面提到的,据我所知,数据转发到加载是通过存储队列完成的.在第一页的脚注中,也有人说
我们使用"存储队列"来指代在退役之前保存商店值的存储和"存储缓冲区"以在存储到存储器之前引用包含已退休存储值的存储.
这符合我上面解释的内容,但它与第一个引用中的"存储缓冲区"冲突.脚注对应于论文中的参考文献之一.他们说,在那篇参考文献中
存储缓冲区是存在于许多当前处理器中以实现以下一个或多个的机制:存储访问顺序,延迟隐藏和数据转发.
我再次认为实现这些机制的机制称为存储队列.他们后来在同一篇论文中说
通常使用非阻塞高速缓存和缓冲结构,例如写缓冲区,存储缓冲区,存储队列和加载队列.
因此,他们分别提到存储缓冲区和存储队列,但稍后不再提及存储队列.他们说
存储缓冲区维护存储的顺序,并且只有在完成所有先前的指令之后才允许存储
他们的商店缓冲模型与Mike Johnson的模型相同.在约翰逊的书(超标量微处理器设计)中,商店首先以获取顺序进入商店预订站.从那里,它们被发送到地址单元,并从地址单元被发送到"存储缓冲区"及其相应的数据.通过此存储缓冲区处理加载转发.我再一次认为这个结构被称为商店队列.在参考文献#2中,作者也提到了这一点
Alpha 21264微处理器有一个32项的推测商店缓冲区,商店一直存在,直到它退役."
我看了一篇关于Alpha 21264的论文,其中指出了这一点
商店首先将数据通过数据总线传输到推测性存储缓冲区.商店数据保留在推测商店缓冲区中,直到商店退休.退出后,数据将在空闲缓存周期内写入数据缓存.
也,
内部存储器系统维护一个32项加载队列(LDQ)和一个32项存储队列(STQ),用于管理它们在飞行中的引用.[...] Stores在退出并转储到数据缓存后以获取顺序退出STQ.[...] STQ CAM逻辑控制推测数据缓冲区.当较旧的商店之后发生较年轻的负载时,它可以绕过推测商店数据加载.
因此,听起来像在Alpha 21264中有一个存储队列,它以获取顺序保存有关存储指令的一些信息,但它不保留存储指令的数据.存储指令的数据保存在存储缓冲区中.
所以,在所有这些之后,我不确定存储缓冲区是什么.它只是存储队列的辅助结构,还是存储等待写入L1的数据的完全不同的结构.或者是别的什么?当我们说"存储缓冲区"时,我觉得有些作者的意思是"存储队列".有任何想法吗?
您最初的理解是正确的 - Store Buffer 和 Store Queue 是不同的术语和不同的硬件结构,具有不同的用途。如果某些作者交替使用它们,那显然是不正确的。
存储缓冲区:
存储缓冲区是一种更接近内存层次结构的硬件结构,它可以“缓冲”来自处理器的写入流量(存储),以便处理器的回写阶段尽快完成。
根据缓存是否为写分配/写不分配,对缓存的写入可能需要可变数量的周期。存储缓冲区本质上将处理器管道与内存管道分离。您可以在此处阅读更多信息。
存储缓冲区的其他用途通常用于推测执行。这意味着当处理器沉迷于推测执行和提交时(如在硬件事务内存系统中,或者像 transmeta crusoe 这样的系统),硬件必须跟踪推测写入并在错误推测的情况下撤消它们。这是这样的处理器将使用存储缓冲区的地方。
存储队列:
存储队列是一个关联数组,处理器在其中存储动态存储的数据和地址。这些通常用于无序处理器中以消除内存歧义。处理器确实需要一个加载存储队列 (LSQ) 来执行内存消歧,因为它必须查看对同一地址的所有内存访问,然后才能在结束一个内存操作之前安排另一个内存操作。
所有内存消歧逻辑都是通过无序处理器中的加载-存储队列完成的。在此处阅读有关内存消歧的更多信息
如果您的困惑仅仅是因为您引用的论文,请考虑询问作者 - 他们对术语的使用很可能混淆了。
你似乎在用名字做大事,这不是那么重要。缓冲区只是一些通用存储,在这种特殊情况下应作为队列进行管理(以维护程序顺序,如您所述)。所以它可以是一个存储缓冲区(我实际上更熟悉这个,也可以在这里看到),但在其他情况下它可以被描述为一个存储队列(一些设计将它与加载队列结合起来,形成一个LSQ)。
名称并不那么重要,因为正如您在第二个引用中看到的那样 - 人们可能会用它们来描述新事物。在这种特殊情况下,他们选择将存储缓冲区分成 2 部分,由退休指针划分,因为他们相信他们可以使用它来避免某些一致性模型中某些与存储相关的停顿。嘿,这是他们的论文,其余的他们可以定义他们想要什么。
不过有一个注意事项 - 您对存储缓冲区/队列的描述的最后一个项目符号似乎非常特定于体系结构,将本地存储转发到最高优先级的加载可能会错过其他线程到相同地址的后续存储,并且会破坏大多数内存排序模型,除了最放松的那些(除非你防止那样做)。