结构冒险
增加指缓存及数据缓存
数据冒险
- 数据冒险 三种不同的依赖关系
- 先写后读 (数据依赖)
int main() {
int a = 1;
int b = 2;
a = b + a;
b = a + b;
}
- 先读后写 (反依赖)
int main() {
int a = 1;
int b = 2;
a = b + a;
b = a + b;
}
3.后写再写 (输出依赖)
int main() {
int a = 1;
a = 2;
}
-
流水线停顿(流水线冒泡)
4.操作数前推
通过在硬件层面制造一条旁路,让一条指令的计算结果
,可以直接传输给下一条指令,而不再需要“指令 1 写回寄存器,
指令 2 再读取寄存器“这样多此一举的操作
5.cpu中的线程池
控制冒险
1.缩短分支延迟
将条件判断、地址跳转,都提前到指令译码阶段进行,而不需要放在指令执行阶段
2.分支预测(静态分支预测)
3.动态分支预测
- 一级分支预测(1比特饱和计数)
- 双模拟预测器(2比特饱和计数)