我正在为 ARMv8 和 ARMv7 设备编译一些二进制文件,我想禁用 分支预测。我知道这个问题已经被问过一次(here),但目标是 x86 机器。我在arm上使用linaro gcc。
我这样做是为了实验,我不推荐这样做。
我使用 perf 来测量分支指令/分支未命中数。
所以我有两个问题:
我尝试过以下选项:
那么我能否确定使用 -fno-if-conversion 和 -fno-guess-branch-probability 完全禁用分支 predicate?
经过更多研究和测试后,我有了答案。
在 ARMv7 ISA 中存在谓词指令。当编译器认为它们有益时,就会使用它们。可以使用
-fno-if-conversion -fno-if-conversion2
编译标志禁用此功能。如果分支预测器做得很好,这可能会提高性能。
ARMv8 AArch64 ISA 对分支预测的支持非常有限,因此基本上没有太多需要禁用的内容。谓词指令的数量被减少到最低限度。即使使用
-fno-if-conversion
标志,我也没有看到对执行指令数量有任何影响(为此使用 perf )。这意味着分支预测器更加重要。