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

问题描述 投票:0回答:1

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

我这样做是为了实验,我不推荐这样做。

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

所以我有两个问题:

  1. arm 分支预测使用了 gcc/g++ 吗?
  2. 如何禁用它?

我尝试过以下选项:

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

那么我能否确定使用 -fno-if-conversion-fno-guess-branch-probability 完全禁用分支 predicate

c gcc optimization compilation
1个回答
1
投票

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

ARMv7 ISA 中存在谓词指令。当编译器认为它们有益时,就会使用它们。可以使用

-fno-if-conversion -fno-if-conversion2
编译标志禁用此功能。如果分支预测器做得很好,这可能会提高性能。

ARMv8 AArch64 ISA 对分支预测的支持非常有限,因此基本上没有太多需要禁用的内容。谓词指令的数量被减少到最低限度。即使使用

-fno-if-conversion
标志,我也没有看到对执行指令数量有任何影响(为此使用 perf )。这意味着分支预测器更加重要。

© www.soinside.com 2019 - 2024. All rights reserved.