处理器
指令实现计算机控制的关键:多路复用器(multiplexor,缩写 Mux)、译码器(Decoder)。
计算机运行的期间,所有的组合逻辑电路都在执行运算,但只有一个输出是有效的,这个输出将通过 Mux 选择出来。

流水线
流水线的概述
流水线(pipeline)是计算机中一种多条指令重叠执行的技术。核心思想是下一条指令的执行并不需要等待上一条指令结束。
RISC-V 指令集中,执行一条指令通常包括 5 个步骤:
- 从存储器取指令(取指 IF)
- 读寄存器,并进行指令译码(译码 ID)
- 执行指令(执行 EX)
- 从存储器读取数据,或者向存储器写入数据(访存 MEM)
- 将结果写入寄存器(写回 WB) 按这种方式可以将指令划分为五个阶段,这种流水线通常被称为五级流水线(five-stage pipeline)
冒险
下一个时钟周期中的下一个指令无法执行的情况,称为冒险(hazard)。冒险主要包括结构冒险、数据冒险、控制冒险。
结构冒险
因为缺乏硬件支持,指令不能在预定的时钟周期内执行的情况,i.e. 多条指令同时竞争同一个硬件结构的情况,称为结构冒险(structural hazard)。
例如,在只有一个存储器的机器上,从存储器取指令和从存储器取数据之间会发生结构冒险。RISC-V 指令集可以很好地避免结构冒险、
数据冒险
因为一个步骤需要等待另一个步骤的计算结构,而此时无法提供指令执行所需要的数据,这种情况导致的流水线停顿称为数据冒险(data hazard)。
假设有以下汇编程序:
add x19, x0, x1 # x19 = x0 + x1;
sub x2, x19, x3 # x2 = x19 - x3;
此时减法指令的 x19 必须等待加法指令计算完成才能获得,这是一种数据冒险。
可以在 CPU 的硬件中,直接添加 ALU 的输出往输入的数据通路,将 add 指令在 ALU 的输出直接传递给 sub 指令作为输入,这种方法称为前递(forwarding)或旁路(bypassing)。前递可以用下图直观展示:

控制冒险
控制冒险又称为分支冒险,指的是因为分支的存在,流水线提前运行的指令不是所需的指令导致的冒险。
现代计算机通常使用预测的方法来解决控制冒险,提前预测分支的结果。如果预测错误,抛弃当前的结果,再重新取正确的指令。
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表