• __builtin_expect


    今天在看内核代码中看到:

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

     对 __builtin_expect不是很理解,百度一下,得知:

    在 GCC 手册中对 __builtin_expect() 的描述是这样的:
          由于大部分程序员在分支预测方面做得很糟糕,所以 GCC 提供了这个内建函数来帮助程序员处理分支预测,优化程序。其第一个参数 exp 为一个整型表达式,这个内建函数的返回值也是这个 exp ,而 c 为一个编译期常量。这个函数的语义是:你期望 exp 表达式的值等于常量 c ,从而 GCC 为你优化程序,将符合这个条件的分支放在合适的地方。一般情况下,你也许会更喜欢使用 gcc 的一个参数 '-fprofile-arcs' 来收集程序运行的关于执行流程和分支走向的实际反馈信息。
          因为这个程序只提供了整型表达式,所以如果你要优化其他类型的表达式,可以采用指针的形式。

      现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。  
          所以就引入了 likely 和 unlikely ,目的是增加条件分支预测的准确性,cpu 会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分支的指令。unlikely 表示你可以确认该条件是极少发生的,相反 likely 表示该条件多数情况下会发生。编译器会产生相应的代码来优化 cpu 执行效率。 

      关于内核中的 likely(x) 和 unlikely(x):

    __builtin_expect((x),1) 表示 x 的值为真的可能性更大;
    __builtin_expect((x),0) 表示 x 的值为假的可能性更大。

  • 相关阅读:
    洛谷2444(Trie图上dfs判环)
    【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环
    【做题】POJ3469 Dual Core CPU——第一道网络流
    【做题】atc_cf17-final_E
    【做题】spoj4060 A game with probability——dp
    Matlab AlexNet 识别花
    minutia cylinder code MCC lSSR 匹配算法
    Gabor filter for image processing and computer vision
    MATLAB 去掉数组里面不要的元素
    NBIS指纹特征提取与匹配软件使用
  • 原文地址:https://www.cnblogs.com/rohens-hbg/p/5786429.html
Copyright © 2020-2023  润新知