存储缓冲区和重新排序缓冲区是否都用于推测指令?

Are the store buffer and reorder buffer both used for speculative instructions?

我知道重新排序缓冲区可以用作推测执行需求的历史缓冲区,它还允许将寄存器重命名为 ROB 条目(打破命名依赖关系,如寄存器重命名)。

在线阅读resources/manuals,似乎存储缓冲区也用于推测执行。 ROB 是否足以在路径预测错误的情况下丢弃值?

Everything 被视为推测性的,直到它退役 - 按顺序退赛是 CPU 检查在执行到达某些稍后执行的指令之前应该发生的异常的方式。以及分支预测错误等。所以两者都是。


Isn't the ROB sufficient to discard values in case of a wrong path prediction?

否,register 重命名仅处理寄存器,而不处理要存储到内存中的值。

需要一个存储缓冲区,这样你就可以尽早执行存储而不会让其他内核看到潜在的错误推测!否则存储会必须等到他们达到有序退休阶段,这样他们才知道在执行之前是非投机性的。 (并且缓存行必须以独占或修改状态存在)。

存储缓冲区对于将执行与缓存未命中分离也很有价值;如果您可以将缓存行留在存储缓冲区中,则无需等到缓存行到达。这甚至适用于有序管道。它甚至在退休后也适用于 OoO exec,因此缓存未命中存储有更大的 window 来不停止管道,不依赖于有序退休顺序。

更多详情:

相关: and probably a bunch of other SO answers I've written. https://whosebug.com/search?q=user%3A224132+%5Bcpu-architecture%5D+store+buffer


it also allows registers to be renamed into ROB entries

听起来你在谈论英特尔 P6 系列的实现细节。大多数其他设计(Sandybridge 系列和 AMD)使用单独的物理寄存器文件 (PRF),并且 ROB 只有指向 PRF 条目的指针。这对于寄存器大小较大的 64 位架构更有意义,尤其是当我们考虑 128 位 XMM 寄存器时。

参见 https://www.realworldtech.com/sandy-bridge/ - SnB 是从 P6 系列到 SnB 系列的主要变化。