错误预测的分支

现代CPU尝试预测分支指令的结果(是否被执行)。例如,当处理器看到这样的代码时:

dec eax
jz .zero
# eax 不为 0
...
zero:
# eax 为 0

在上面的例子中,jz 指令是一个分支。现代CPU架构试图预测每个分支的结果以提高性能。这被称为"推测执行",我们在[@sec:SpeculativeExec]中讨论过。处理器会假设,例如,分支不会被执行,并执行相应于 eax 不为 0 的情况的代码。然而,如果猜测错误,这被称为"分支预测错误",CPU需要撤销最近所做的所有推测工作。

错误预测的分支通常会导致10到20个时钟周期的惩罚。首先,根据错误预测获取和执行的所有指令都需要从流水线中清除。之后,一些缓冲区可能需要清理,以恢复从坏的推测开始的状态。最后,流水线需要等待确定正确的分支目标地址,这会导致额外的执行延迟。

Linux perf 用户可以通过运行以下命令来检查分支预测错误的数量:

$ perf stat -e branches,branch-misses -- a.exe
   358209  branches
    14026  branch-misses #    3.92% 的分支错误预测率
# 或者简单地执行:
$ perf stat -- a.exe

results matching ""

    No results matching ""