保留执行管道

时间:2009-12-02 14:30:59

标签: c compiler-construction cpu-architecture micro-optimization

经常检查返回类型是否有错误。但是,可以以不同的方式指定将继续执行的代码。

if(!ret)
{
   doNoErrorCode();
}
exit(1);

if(ret)
{
   exit(1);
}
doNoErrorCode();

重量级CPU的一种方式可以使用简单的统计数据推测近距离/局部采取的分支 - 我研究了分支推测的一个4位机制(-2,-1,0,+ 1,+ 2),其中零是未知和2将被视为真正的分支。

考虑到上面的简单技术,我的问题是关于如何构造代码。我假设主要编译器和主要架构之间必须有一个约定。这是我的两个问题

  1. 当代码不是经常访问的循环时,在填充管道时,布尔值是否有偏差?
  2. 关于分支的猜测必须从真或假或零开始(管道必须填充某些东西)。这可能是什么?

2 个答案:

答案 0 :(得分:2)

行为因CPU而异,编译器通常会重新排序指令。 您可以在这些手册中找到所需的所有信息:http://agner.org/optimize/

在我看来,知道发生了什么的唯一方法是阅读编译器生成的汇编代码。

答案 1 :(得分:2)

在gcc上,您可以使用__builtin_expect为编译器提供分支预测信息。为了使它更容易,你可以借用可能的/不太可能使用的宏,例如在Linux内核中:

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

然后例如

if (unlikely(!some_function())
    error_handling();