Loading AI tools
来自维基百科,自由的百科全书
冒险(hazard)又称作危障或险象,是指在计算机CPU的微体系结构中,指令流水线乱序执行中的一些问题可能会导致得到不正确的计算结果。有3类典型的冒险:
有几种方法用于应对这些风险,如流水线停顿(流水线气泡),寄存器直通等待。
指令在一个流水线处理器中的执行被分为若干阶段,因此在一个时刻有多条指令处于流水线的不同阶段上被处理。如取操作数、执行等等。Intel的Pentium就是处理器流水线。有的处理器进一步是指令乱序执行,如Intel的Pentium Pro开创的Intel P6微体系结构。指令的乱序执行就会引入一些危险的情况。
指令乱序执行时,可能会发生读取数据与写入数据之间的时序与空间的相关性,成为数据冒险。如果不加以处理,可能会导致竞态条件。 有3种可能的数据冒险:
以下为先写后读(RAW)的示例:
i1. R2 <- R1 + R3
i2. R4 <- R2 + R3
第一个指令是计算一个值,并将其储存在R2,而第二个指令是使用这个值计算结果并储存在R4,但是在我们拿出第二步的操作数时,第一步的结果还未被储存。因此我们具有一种数据相关性。 我们可以说那有 一种数据依赖性对于指令i2,他依赖于指令i1的完成。
结构冒险是指多条指令同时要访问处理器一处硬件。典型例子是一个存储单元被一条指令取操作数同时另一条指令要写入结果。[1]
又称分支冒险,指令流水时,处理器遇到分支指令,不能在流水开始阶段就判断出分支结果。
流水线汽泡,也称作流水线停顿,可以同时解决上述3种冒险。指令译码时如果控制器发现可能存在冒险,就插入NOP(No Operation)指令。这样在有风险的指令进入流水线时,上一条指令已经在流水线中经过了充分多的周期,从而化解了冒险。如果插入的NOP的数量等于流水线的级数,那么处理器就排空了整个流水线。这被称为冲刷流水线(flushing the pipeline)。
有几种方案与算法解决数据冒险。
避免控制风险的办法:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.