重新排序缓冲区:指针值满时?

Posted

技术标签:

【中文标题】重新排序缓冲区:指针值满时?【英文标题】:Reorder Buffer: Pointer values when it is full? 【发布时间】:2020-03-24 15:14:47 【问题描述】:

Tomasulo 算法中用于乱序执行和分支推测的重排序缓冲区有 2 个指针。

头指针:指向最旧的指令。这将是下一个 要提交的指令。 尾指针:将添加最新指令的点。

每个 ROB 条目有 4 个字段:指令类型、目标、值和就绪字段。

我已经看到很多资源都是这样教的。 ROB 条目不需要提交位或忙碌位。

对于大小为 N 的 ROB。

如果 ROB 为空或已刷新,则 TAIL=HEAD。 如果 ROB 有一个空闲槽且 HEAD=0,则 TAIL=N-1。 如果 ROB 已满且 HEAD=0,则 TAIL=?

如果 TAIL=HEAD,我们如何知道 ROB 是满的还是空的?

【问题讨论】:

【参考方案1】:

通常它是一个 循环 缓冲区(索引环绕);几乎满的状态不必 HEAD=0,只要是任意位置即可。

是的,如果您使用 HEAD 和 TAIL 读/写索引,则完整与空之间存在歧义。正如wikipedia article 解释的那样,解决这个问题的一种方法是跟踪已用容量,它可以从 0..n 开始,而不仅仅是 0..n-1。

考虑到 CPU,这是一个实现细节,硬件如何解决它并不重要;可以安全地假设它正确有效地实现了一个可以使用其所有条目的循环缓冲区。 (或者不太可能,有效 ROB 大小比物理 ROB 大小小 1。)


顺便说一句,您的带有HEAD=0 的模型对应于在当前尾部添加指令,但通过将所有条目向下移动到低1 个索引而不是移动HEAD 来退出(提交)。在 循环 缓冲区中,要注意的条件是 HEAD = (TAIL-1)%n 或类似的东西。

【讨论】:

以上是关于重新排序缓冲区:指针值满时?的主要内容,如果未能解决你的问题,请参考以下文章

在读取缓冲区已满时使用 select 检查可写套接字

cudaMemcpy 无效参数

MYSQL存储引擎InnoDB(二十三):排序索引构建

线程协作-生产者/消费者问题

平均 UDP 数据包丢失和数据包重新排序

linux文件缓冲区