是否在ARM的gcc中使用了分支预测,我们如何禁用它?

时间:2015-05-14 08:36:58

标签: c gcc optimization compiler-construction compilation

我正在为ARMv8和ARMv7设备编译一些二进制文件,我想禁用 branch predication 。我知道这个问题曾被问过一次( here ),但目标是x86机器。我正在使用linaro gcc for arm。

我是为了实验而这样做的,我不建议这样做。

我使用perf来测量分支指令/分支未命中数。

所以我有两个问题:

  1. 分支预测是否使用gcc / g ++ for arm?
  2. 如何禁用它?
  3. 我尝试了以下选项:

    • fno-branch-target-load-optimize(2) - 对二进制大小没有影响但生成了不同的程序集。但是,分支统计信息与不使用选项相同。
    • -fno-if-conversion(2) - 二进制大小相同,程序集不同。这增加了正在执行的分支的数量以及分支未命中率。这个选项看起来很有用。
    • -fno-guess-branch-probability - 与上述相同,但影响较小。

    我可以确定使用 -fno-if-conversion -fno-guess-branch-probability 完全禁用分支预测

1 个答案:

答案 0 :(得分:1)

经过更多的研究和测试后,我得到了答案。

ARMv7 ISA中有预测指令。编译器在认为有益时会使用它们。可以使用-fno-if-conversion -fno-if-conversion2编译标志禁用此功能。如果分支预测器做得很好,这可能会提高性能。

ARMv8 AArch64 ISA对分支预测的支持非常有限,因此基本上没有太多禁用功能。预测指令的数量至少减少。即使使用-fno-if-conversion标志,我也没有看到对执行指令数量的任何影响(为此使用 perf )。这意味着分支预测器更为重要。