完全同时执行两条指令 (RISCV)

Completely simultaneous execution of two instructions (RISCV)

问题来自 RISCV 实现,但我认为它也可能适用于许多其他架构。

来自具有两个完全独立的顺序指令的代码(通用 ISA 表示法):

REG1 = REG2 + REG3
REG4 = REG5 + REG6

在流水线实现中,假设没有其他危险(同时r/w访问寄存器是可能的,并且有两个独立的加法器),如果执行两条指令是否违反了ISA完全并行?

换句话说,在同一个时钟沿,3个寄存器(RE​​G1、REG4和PC)是否可以同时更新(PC+8对于RISCV-32示例)?

不,显然没有问题,因为真正的 CPU 一直都在这样做。 (例如,自从 Haswell 以来,英特尔每个时钟可以 运行 4 个独立的 add 指令:https://www.realworldtech.com/haswell-cpu/4/ https://uops.info/ https://agner.org/optimize/)。

它只需要保持错觉一次有运行条指令,遵循ISA的顺序执行模型。应用与 C“假设”规则相同的概念。

如果 ISA 不保证任何关于时序的事情,比如你可以用 N nop 或其他指令延迟 N 个时钟周期,没有什么能阻止特定的实现在一个时钟内做尽可能多的工作循环。 (一些微控制器确实有特定的时序保证或规范,因此代码 可以 使用延迟循环延迟 N 个周期。或者至少某些 ISA 的特定实现有这样的保证。)

对于现代 CPU 而言,平均每个时钟执行超过 1 条指令是 100% 正常的,尽管有时会因缓存未命中和分支预测错误而停顿,因此这显然意味着在其他周期中每个时钟周期获取、解码和执行多条指令。另见 现代微处理器 90 分钟指南! 超标量有序和无序管道的一些基础知识。