像 F 这样的 RISC-V 扩展到底是如何在流水线处理器中实现的

问题描述 投票:0回答:1

我知道典型的浮点运算比典型的整数运算要慢得多,所以我不太确定哪种方法适合在硬件中实现 RV32IF 处理器。

我能想到的一种方法是,如果我通过实验知道最慢的 FP 执行时间是最慢的 INT 执行时间的两倍,我可以有 2 个浮点“执行”阶段,使整数指令遵循典型的 5 阶段管道和浮动指令点有6个阶段。我知道这会导致一大堆新的危险需要担心,特别是因为并非所有 FP 指令都是相同的,特别是 FDIV 可能需要比最长整数执行时间两倍更长的时间。另一种方法必须是像 Tomasulo 算法这样的硬件记分板方法,但这需要更多的工作和需要实现的区域。

我想了解这个问题通常是如何解决的,特别是如果我资源有限的话。

floating-point cpu-architecture hardware riscv pipelining
1个回答
0
投票

与整数乘法的工作原理类似,通常也是多周期的(没有停顿,除非您尝试过早读取寄存器)。但这更容易,因为 FP 寄存器与整数是分开的,因此您不必检测它们之间的危险,除了在 int / FP 寄存器之间移动数据的指令之外。 (一些 ARMv7 CPU 在将数据从 SIMD/FP 寄存器移动到整数的指令上有很大的停顿,因为它们没有在两个域之间进行详细的依赖性跟踪,所以只是停顿,直到所有运行中的 FP 指令完成,或者类似的事情.)

就经典的 5 级 RISC 管道而言,执行从 EX 阶段开始,但随后您有一个单独的管道用于 FP 操作,并具有自己的写回阶段到 FP 寄存器文件中。

使用不同延迟的指令(例如整数

mul
add
,或者FP add和mul,如果它们具有不同的延迟),WAW和WAR危险成为可能,所以是的,危险检测变得更加复杂。除了绕过转发之外,还有一个更大的窗口来实现真正的依赖关系(原始危险)。

还有回写冲突,即同一寄存器文件中的不同寄存器在同一周期内准备好两个结果。这是一种结构性危险。您可以将管道设计为停止并在下一个周期写回其中一个结果。

经典 5 级 RISC 流水线的讨论 (https://en.wikipedia.org/wiki/Classic_RISC_pipeline) 通常完全忽略这些问题,只考虑单周期延迟 ALU 操作和具有 1 周期负载的缓存-使用延迟(不包括地址数学的 EX 周期)。

经典 MIPS 通过让

mult
div
写入单独的寄存器
hi
lo
,避免了主管道的复杂性,并具有
mflo
的特殊语义(从 LO 移动)等,允许 CPU 给出在极端情况下,软件执行的操作可能会导致管道化变得困难,从而导致不可预测的结果。也就是说,他们通过说“不要这样做”来处理一些极端情况。 Raymond Chen 在一篇不错的短文中进行了解释:MIPS R4000,第 3 部分:乘法、除法以及喜怒无常的 HI 和 LO 寄存器

如果您的晶体管预算“极其”有限,请构建 MIPS I 而不是 RISC-V。 (但是您需要软件来填充加载延迟槽,并且乘法需要mflo)。 RISC-V(以及 MIPS32r1 等,使用 MIPS

mul
而不是 MIPS
mult
)确实需要相互匹配更多寄存器编号以检测危险,并且在较长的管道中需要更长的运行中指令窗口.
    

© www.soinside.com 2019 - 2024. All rights reserved.