- 大多数指令是寄存器到寄存器:这意味着大部分操作都是在寄存器之间进行,不直接涉及内存访问,这样可以提高速度。
- 执行阶段分为两个部分:
- I(Instruction Fetch):指令获取阶段,处理器读取指令。
- E(Execute):执行阶段,处理器执行指令,如算术逻辑单元(ALU)操作。
- 对于加载和存储指令:
- 添加了D(Memory)阶段,用于从内存地址读取数据或向内存地址写入数据。
- 顺序执行 (a):每个指令依次执行,没有重叠的阶段。每条指令完成所有阶段后,下一条指令才开始。
- 两级流水线 (b):指令被分为两个阶段,如指令获取(I)和执行(E)数据写回(D)。这允许第一条指令在执行阶段时,第二条指令已经开始获取阶段。
- 三级流水线 (c):指令被分为三个阶段,可能包括指令获取(I),执行(E),和数据写回(D)。每个阶段可以同时处理不同的指令。
- 四级流水线 (d):指令进一步细分为四个阶段,如获取(I),两个执行阶段(E1,E2)和数据阶段(D)。这样可以进一步增加在同一时间内处理的指令数量,提高效率。
流水线的优化技术,特别是延迟分支(Delayed Branch):
- 延迟分支:分支指令不会立即改变执行流,而是在执行下一条指令后才生效。
- 延迟槽:紧跟在分支指令后的指令称为延迟槽指令,即使分支发生,这条指令仍然会被执行。
延迟分支是一种流水线优化技术。在RISC架构中,通常会使用这种技术来减少由于分支(如跳转指令)引起的流水线中断。
- 基本概念:在传统的流水线中,当CPU遇到一个需要跳转到程序的其他部分执行的指令时,它必须等待跳转的决定。这个等待过程可能导致流水线停顿,因为CPU需要清空错误路径上的指令并抓取正确路径上的新指令。
- 延迟分支工作方式:延迟分支允许在确定跳转是否发生以及应该跳转到哪里之前,执行一个或多个额外的指令。这些指令位于所谓的“延迟槽”中。
- 效果:这样可以减少因分支指令执行而浪费的时间,因为CPU不需要空闲等待跳转决定。即使发生跳转,位于延迟槽中的指令也会被执行,从而保持流水线的连续性和效率。
- Normal Execution:没有使用延迟分支。指令按照它们在代码中的顺序执行。如果跳转发生,之前的指令已经执行,但跳转后可能需要时间来抓取新路径上的指令,造成流水线中断。
- Delayed Branch:使用了延迟分支。在跳转指令之后有一个或多个指令(延迟槽),这些指令无论跳转是否发生都会执行。这有助于填充因为跳转指令决定而可能产生的空闲CPU周期。
- Optimized Execution:代码经过重新排列,使得在跳转指令的延迟槽中安排了那些不依赖于跳转结果的指令。这样做可以最大限度地减少因跳转决定带来的流水线中断。