相关疑难解决方法(0)

MIPS 如何在不停止的情况下处理前一个 ALU 指令的分支?

        addiu   $6,$6,5
        bltz    $6,$L5
        nop
        ...
$L5:
Run Code Online (Sandbox Code Playgroud)

除了缓存未命中,经典 MIPS 甚至无法做到这一点,而不会出现停顿,这如何安全?(MIPS 最初代表没有互锁流水线级的微处理器,并且有一个加载延迟槽而不是互锁。)

原始 MIPS I 是经典的 5 阶段 RISCIF ID EX MEM WB设计,通过在 ID 阶段及早检查分支条件,通过单个分支延迟槽隐藏其所有分支延迟(更正:这是错误,请阅读此答案;不要不要被基于这个错误前提的问题中的其他细节所误导)。这就是为什么它仅限于等于/不等于或符号位检查(如 lt 或 ge 零),而不是两个需要通过加法器进行进位传播的寄存器之间的 lt。

这是否意味着分支需要比 ALU 指令早一个周期准备好输入?bltz进入,所述同一周期ID阶段addiu进入EX。

MIPS I(又名 R2000)使用从 EX 输出到 EX 输入的旁路转发,因此普通整数 ALU 指令(如addu/链xor)具有单周期延迟并且可以在连续周期中运行。


MIPS 代表“没有互锁流水线阶段的微处理器”,因此它不检测 RAW 危害;代码必须避免它们。(因此,第一代 MIPS 上的加载延迟插槽,在这种情况下,MIPS II 添加了互锁以停止,使首字母缩略词:P 无效)。

但是我从来没有看到任何关于计算分支条件多条指令以避免停顿的讨论。(addiu/bltz 示例是由 MIPS gcc5.4-O3 -march=mips1 Godbolt上发出的,它确实尊重加载延迟槽,nop …

assembly pipeline mips cpu-architecture

6
推荐指数
1
解决办法
787
查看次数

为什么更长的管线会使单个延迟时隙不足?

我在Patterson&Hennessy的《计算机组织和设计》教科书中阅读了以下声明:

随着处理器同时进入较长的流水线并在每个时钟周期发出多条指令,分支延迟变得更长,并且单个延迟时隙不足。

我可以理解为什么“每个时钟周期发出多个指令”会使单个延迟槽不足,但是我不知道为什么“较长的流水线”会引起延迟。

另外,我不明白为什么更长的管道会导致分支延迟变得更长。即使使用更长的流水线(完成一条指令的步骤),也不能保证周期会增加,为什么分支延迟会增加?

cpu-architecture

3
推荐指数
1
解决办法
48
查看次数

为什么零旗存在?

我了解进位和溢出标志的使用可用于算术中的错误检查,但为什么零标志对系统/程序员有用?

comparison x86 assembly cpu-architecture eflags

0
推荐指数
1
解决办法
429
查看次数

标签 统计

cpu-architecture ×3

assembly ×2

comparison ×1

eflags ×1

mips ×1

pipeline ×1

x86 ×1