什么是静态预测?
在**静态预测**技术中,分支采用“总是执行”或“从不执行”的方法。它可以通过调查目标代码的特定属性来进行静态预测。在实际实现中,静态预测要么基于操作码,要么基于位移,要么基于编译器提供的提示,如图所示。

**基于操作码的预测**是通过假设对于某些操作码分支将被“执行”,而对于其他操作码分支将被“不执行”来进行的。例如,在 MC 88110 和 PowerPC 601/603 处理器中使用了这种预测技术。如表所示,展示了如何在 MC 88110(Motorola,1991)中实现基于操作码的预测。
在 MC 88110(1993)中实现的静态预测
| 指令 | |||
|---|---|---|---|
| 指定条件 | 指令代码的第 21 位 | 预测 | |
| = 0 | 0 | 不执行 | |
| ≠0 | 1 | 执行 | |
| Bcnd(条件分支) | >0 | 1 | 执行 |
| <0 | 0 | 不执行 | |
| ≥0 | 1 | 执行 | |
| ≤0 | 0 | 不执行 | |
| bb1(位设置分支) | 执行 | ||
| bb0(位清除分支) | 不执行 | ||
此处理器提供了两种条件分支。第一种称为 bcnd,用于算术检查。第二种称为 bb1(位设置分支)或 bb0(位清除分支),用于布尔检查。如表所示,对于算术检查,条件 ≠0、> 和 ≥0 被假定为满足,因此预测为“执行”。相反,条件 =0、<0 和 ≤0 会导致“不执行”预测,并且第 21 位被重置。
**基于位移的**预测取决于位移的符号。如果 D < 0,则预测为“执行”,在相反的情况下,D≥0,则预测为“不执行”。这里的基本假设是,具有负位移的条件分支用作循环闭合分支。
最后,静态预测也可以从编译器的提示中得出。这种预测称为**编译器定向预测**。在这种情况下,编译器根据编译的控制结构类型或用户提供的提示进行预测。编译器的预测通过设置或清除条件分支指令编码中的一个位(称为**预测位**)来指示。
例如,在 PowerPC 架构中,条件分支编码的第 10 位是预测位。当这样指定时,基于操作码和基于位移的预测的结果将被反转。使用预测位的处理器示例包括 PowerPC 601 和 PowerPC 603。
另一个利用编译器定向预测的处理器是 PA 8000。在这种情况下,编译器定向预测是一个可用的选项。如果指定,它将逐页覆盖动态预测。
这种显著的解决方案使静态预测能够在为 PA 8000 重新编译的程序中使用,如果可以预期更高的预测率。另一方面,较旧的程序(如库例程)可以继续使用动态预测作为默认预测方法。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP