【问题标题】:Preserving the Execution pipeline保留执行管道
【发布时间】:2010-12-22 10:33:18
【问题描述】:

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

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

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

重量级 CPU 可以使用简单的统计数据推测在附近/本地获取的分支的一种方式 - 我研究了一种用于分支推测 (-2,-1,0,+1,+2) 的 4 位机制,其中 0 是unknown 和 2 将被视为真正的分支。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    #define possible(x) __builtin_expect((x),1) #define 不太可能(x) __builtin_expect((x),0)

    然后例如

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-07
        • 2017-08-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        相关资源
        最近更新 更多