概念
软件应用接口执行通过抽象的的计算机给出的结果,返现给软件应用。
细节
- 计算操作和内存移动(CPU执行指令时数据流动路径)
- 5个阶段的RISC处理器
-
取指 处理器从内存中取指,将IPC指向当前的地址。
-
解码 指令被送入解码单元,确定需要执行的操作(如加法、减法、数据移动等),并识别出 需要用到的寄存器和内存地址。
-
执行 ALU(算数逻辑单元)进行算数或逻辑计算。
-
访存 如果指令被设计加载或存储,处理器会通过内存管理单元与内存交互,读取或写入数据
-
写回 写到指定寄存器中或者内存中,供后续指令使用。
流水线 Pipeline
不要一个一个的执行,需要当一个指令执行到下一个阶段,下一个跟着。
-
遇到的问题 容易访问到不真实的数据,导致最后的结果错误。
-
解决方案 流水线暂停(Pipeline Stall)是一种解决数据冒险的策略,它通过暂停流水线的执行来等待数据变得可用。暂停当前工作,等待上个数据写回后,我们这个再开始,依次类推。
当然,以下是Markdown格式的文本,您可以直接复制:
控制冒险 (Control Hazard)
控制冒险是流水线处理器中的一种冒险类型,它发生在分支指令(如条件跳转)执行时。分支指令会根据某些条件改变程序计数器(PC)的值,从而影响后续指令的取指(Fetch)过程。
分支指令的不确定性
- 分支指令(如
if
、while
、goto
等)可能会改变程序的执行流程。 - 在执行分支指令之前,处理器不知道接下来应该取哪条指令,因为分支的结果可能是跳转到程序的另一个部分。
取指的不确定性
- 在流水线的取指(IF,Instruction Fetch)阶段,处理器需要确定下一条要执行的指令。
- 如果当前执行的是分支指令,处理器必须等待分支条件被评估后,才能决定取哪条指令。
- 这可能导致取指阶段的暂停(stall),因为处理器需要等待分支指令的结果。
分支预测 (Branch Prediction)
- 为了减少控制冒险的影响,现代处理器通常使用分支预测器(Branch Predictor)来猜测分支指令的结果。
- 分支预测器会基于历史信息(如分支历史表,BHT)来预测分支是向前(taken)还是不向前(not taken)。
- 这样,处理器可以在分支条件评估完成之前,提前取指,从而减少停顿。
分支延迟 (Branch Delay)
- 即使有分支预测器,分支指令仍然可能导致流水线停顿,因为预测可能是错误的。
- 当预测错误时,处理器需要撤销错误的指令执行,并将流水线恢复到正确的状态,这称为分支延迟。
控制冒险是流水线处理器设计中必须考虑的问题之一。通过使用分支预测器和其他技术(如延迟槽,Delay Slots),处理器可以减少控制冒险对性能的影响。然而,完全消除控制冒险是不可能的,因为它本质上与程序的控制流的不确定性有关。
数据依赖
-
完全(pure)依赖(RAW) Add R1,R2,R3 Sub R4,R5,R1
-
部分(Anti)依赖 (WAR) Add R3,R2,R1 Sub R1,R4,R5
-
输出依赖 (WAW) Add R1,R2,R3 Sub R1,R4,R5
内存墙
CPU发展太快了,但是内存RAM这些发展太慢了受制于底层物理设计。
- 解决方案 通过设置缓存策略:L1,L2,L3.还有一个就是并行执行。