这是一个关于计算机体系结构的问题,希望有人能提供线索。更具体地说,它是关于 MIPS 指令流水线流程。但我对它的某些方面感到模糊。因为我目前没有足够的声誉,所以我无法发布图片。
S(停顿)是否意味着没有后续指令可以利用停顿占用的时隙?
两个连续的指令可以在同一个时隙中都有 X(执行)吗?
一条指令的 M(内存访问)和 W(回写)是否有可能在流水线结构中出现在其前身的指令之前????
在循环的情况下,最后一条指令是第一条指令的重复,为什么最后一条指令中有2个F(取指)?
这是一个关于计算机体系结构的问题,希望有人能提供线索。更具体地说,它是关于 MIPS 指令流水线流程。但我对它的某些方面感到模糊。因为我目前没有足够的声誉,所以我无法发布图片。
S(停顿)是否意味着没有后续指令可以利用停顿占用的时隙?
两个连续的指令可以在同一个时隙中都有 X(执行)吗?
一条指令的 M(内存访问)和 W(回写)是否有可能在流水线结构中出现在其前身的指令之前????
在循环的情况下,最后一条指令是第一条指令的重复,为什么最后一条指令中有2个F(取指)?
对于问题 1,在一个简单的标量管道中,停顿会引入一个无法“弹出”的管道气泡。为了允许稍后在程序顺序中的指令填充流水线气泡,该指令必须经过停止的指令。支持这种指令重新排序会增加流水线的复杂性,这往往会增加设计和生产成本,并增加流水线深度或周期时间(以及每个活动周期使用更多能量[无序执行可能会消耗更多能量)即使在活动时使用更多能量时,总体效率也是如此])。支持这种重新排序所需的机制也增加了解释管道的复杂性。
对于问题 2,使用更复杂的流水线可以同时开始执行多条指令。这种处理器称为超标量。在顺序执行中,只有连续序列(按程序顺序)的指令才能同时开始执行,这要求指令没有数据依赖关系,并且有足够的硬件资源来执行指令并处理它们结果。对于有序微架构,早期流水线阶段的宽度通常与后面流水线阶段的宽度相同,尽管缓冲将允许多条指令在停顿后累积。
(即使仅在两个范围内执行,对于可以并行执行的指令类型通常也有额外的限制。例如,一个执行端口可能不处理内存访问或分支,而另一个执行端口可能处理这些指令但不处理移位或倍增。对于相对昂贵的操作(如移位和乘法)拥有两个硬件副本会增加大小并限制内存访问和分支的数据路径,可以简化设计并可能减少延迟。)
对于问题 3,乱序执行允许重新排序指令,因此程序顺序后面的指令可以在较早的指令之前执行并将结果写回寄存器文件。由于在处理异常/中断和仲裁寄存器写入端口使用(或增加写入端口的数量)方面存在一些额外的复杂性,因此也可以按顺序进行处理器按程序顺序写回结果。摩托罗拉 88110(从 1990 年代初开始)就是这样的处理器示例。为了处理异常,88110 有一个历史缓冲区来保存被指令覆盖的数据,这些指令在程序顺序中比异常所在的位置晚。88110 对每个寄存器文件都有两个额外的读取端口,用于读取目标寄存器中的数据并将其写入历史缓冲区。
对于问题 4,我猜你的意思是循环体仅由一条指令组成的情况。对于典型的 RISC 指令集,控制循环的分支指令是与执行计算或内存访问的指令分开的指令,因此循环实际上包含两条指令。(Power,以前的 PowerPC,可以有一个单指令延迟循环,它使用计数器上的分支来递减特殊的计数器寄存器,但是为这种特殊代码的简单实现优化指令获取将是愚蠢的。)
对于具有延迟分支的简单经典 5 级流水线,从性能角度来看,避免指令缓存访问是没有意义的,因为即使采用循环分支也不会引入流水线气泡。这意味着没有机会执行更多指令。但是,在将取指重定向到非顺序地址的一些微架构中会引入流水线气泡(特别是如果取指需要多个周期),提供一个小的快速访问缓冲区可以提高性能。(指令获取带宽限制也可以证明缓冲区的性能是合理的;小缓冲区可以提供比大缓存或片外存储器更高的带宽。)此外,为了减少能源使用, 循环缓冲区的使用非常有意义,但几乎可以肯定的是,我们不想将缓冲区的大小限制为仅两条指令(分支加上一条“主体”指令),因为这种微小的循环很少见,甚至会增加缓冲区大小为 8 条指令只会增加少量的硬件。
为了专门处理小体循环的情况,必须检测这种循环。虽然缓冲区总是可以用最后 N 条指令填充(以避免第一次遇到短后向分支未“命中”循环缓冲区中的情况——并且这样的缓冲区还可以平衡可能由以下原因引起的指令获取的变化跨越缓存线边界、缓存未命中、获取重定向延迟等),则有必要检查每个分支指令以查看它是否针对缓冲区内的指令。(甚至可以为循环分支指令提供一个特殊的存储,因为只需要存储检查的条件、循环缓冲区的小索引和分支在哪里的指示,但短循环可能不够常见对于这样的专用硬件。非常小的0级指令缓存
(分支目标指令缓存 [BTIC] 是一种类似于循环缓冲区的机制,但 BTIC 不是仅缓存来自最近循环分支目标的指令,而是缓存来自多个最近分支目标的指令。BTIC 主要是用于隐藏指令获取延迟。)
在教授管道时,通常一开始就避免了这些复杂的因素。