【问题标题】:gcc __builtin_expect doesn't seem to generate a correct codegcc __builtin_expect 似乎没有生成正确的代码
【发布时间】:2013-03-17 20:10:27
【问题描述】:

以下两个代码 sn-ps 生成完全相同的汇编代码,即使分支包含不同的分支预测。

假设我们有 test0.c

#define likely(x)       __builtin_expect((x), 1)
#define unlikely(x)     __builtin_expect((x), 0)

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (likely(arg0 > 100)) {
    return bar0();
  } else if (likely(arg0 < -100)) {
    return bar1();
  } else if (likely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

test1.c

#define likely(x)       __builtin_expect((x), 1)
#define unlikely(x)     __builtin_expect((x), 0)

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (unlikely(arg0 > 100)) {
    return bar0();
  } else if (unlikely(arg0 < -100)) {
    return bar1();
  } else if (unlikely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

通过比较两个 sn-ps 可以看出,这两个对每个分支都有不同的分支预测(likely() vs. notible())。

但是,当它是从 linux 机器编译时(ubuntu 12.04 32bit,gcc 4.6.3)。这两个来源产生几乎相同的输出。

$gcc  -c -S -o test0.s test0.c
$gcc  -c -S -o test1.s test1.c
$ diff test0.s test1.s
1c1
<   .file   "test0.c"
---
>   .file   "test1.c"

如果有人能解释这一点,那将是一个很大的帮助。 提前感谢您的帮助!

【问题讨论】:

    标签: c optimization gcc built-in


    【解决方案1】:

    您发布的两个文件是相同的——我认为这不是您真正所做的。

    使用-O2或更高版本编译,需要开启优化。这应该会生成不同的代码。

    【讨论】:

    • 是的,你是对的!我还修复了代码。非常感谢您的帮助!
    【解决方案2】:

    我在 ARM7 (Allwinner sun71 A20) 和 gcc 6.3 (-O3) 上进行了一些测量,#likely 和 #unlikely 之间没有性能差异,尽管从其他测试中很明显采用分支更昂贵即使在完美的分支预测的情况下,也不要不接受它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多