保留执行流水线
问题描述:
通常会检查返回类型的错误。但是,将继续执行的代码可能以不同的方式指定。保留执行流水线
if(!ret)
{
doNoErrorCode();
}
exit(1);
或
if(ret)
{
exit(1);
}
doNoErrorCode();
一个重量级的CPU可以推测使用简单的统计数据极为接近/地区所采用的分支的方式 - 我研究了4位机制的分支预测(-2,-1 ,0,+ 1,+ 2),其中零未知,2将被视为一个真正的分支。
考虑到上面的简单技术,我的问题是关于如何构造代码。我认为主要编译器和主要架构之间必须有一个约定。这些是我的两个问题
- 当代码不是一个经常访问的循环,布尔值被偏向于管道被填满时?
- 有关分支的猜测必须从真或假或零开始(流水线必须填充一些东西)。这可能是什么?
答
不同CPU之间的行为不同,编译器通常会重新排列指令。 您可以在这些手册中找到所需的全部信息:http://agner.org/optimize/。
在我看来,知道会发生什么的唯一方法是读取由编译器生成的汇编代码。
答
在gcc上,您可以使用__builtin_expect
为编译器提供分支预测信息。为了使它更容易一点,你可以借用可能/不太可能的宏,例如在Linux内核中:
#define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0)
然后例如,
if (unlikely(!some_function())
error_handling();
+0
好的一条信息,谢谢。 – 2009-12-02 23:59:25
谢谢,我会给它一个读。 – 2009-12-02 14:56:57
惊人的内容,多 2009-12-24 19:55:08