当前位置: 首页 > news >正文

成都网站建设服务/百度云网盘搜索引擎入口

成都网站建设服务,百度云网盘搜索引擎入口,网站后台模板 php,网站在公司做有什么要求吗在项目中看到了likely、unlikely宏的使用, 一直不是非常清楚它们的作用,所以就深究下。 likely表示被測试的表达式大多数情况下为true, unlikely则表示相反。两个宏定义: #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) 这两个…

在项目中看到了likely、unlikely宏的使用, 一直不是非常清楚它们的作用,所以就深究下。

likely表示被測试的表达式大多数情况下为true, unlikely则表示相反。


两个宏定义:

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

这两个宏常常在条件转移的语句中使用,如if, else if等,这些语句生成的汇编代码都带有jmp指令.

CPU流水线的一些基本知识.
CPU流水线设计将一条指令的运行分成了好几个阶段,每一个阶段都是独立的逻辑电路。并且每一个阶段都有自己的阶段寄存器,所以各个阶段就能够实现真正的并行运行。
这里借用下CSAPP上的插图:
这里写图片描写叙述
这里每条指令被分成了3个阶段, 指令I1的A阶段运行完成后。指令I2进入了A阶段运行,而指令I1则进入B阶段运行。I1的B阶段和I2的A阶段是并行运行的。
jmp指令对流水线带来的影响
由于jmp指令的运行会导致CPU跳转到还有一个内存地址,运行全新的指令,导致流水线里面的指令失效。所以CPU须要flush掉流水线上的寄存器。这样的操作须要几个cycle来恢复流水线的运行. 这样的影响被称之为hazard, 详细能够參考hazard Wiki
likely,unlikely带来的优化

依据gcc手冊, 所以这两个宏是用来告诉编译器分支的可能走向,从而帮助CPU进行分支预測来增强CPU流水线性能的.

看下以下的代码


int main (char *argv[], int argc) {int v;v = atoi(argv[1]);if (likely(a == 5))a++;elsea--;printf("%d\n", a);return 0;
}

编译。带上-O2选项,得到的汇编代码:


0000000000400510 <main>:400510:       48 83 ec 08             sub    $0x8,%rsp400514:       48 8b 7f 08             mov    0x8(%rdi),%rdi400518:       31 c0                   xor    %eax,%eax40051a:       e8 f1 fe ff ff          callq  400410 <atoi@plt>40051f:       83 f8 02                cmp    $0x2,%eax400522:       75 18                   jne    40053c <main+0x2c> /* likely在这里表示a非常有可能是2, 所以将运行a++和printf调用放在一起, 免去了jmp带来的影响 */400524:       be 03 00 00 00          mov    $0x3,%esi400529:       bf 48 06 40 00          mov    $0x400648,%edi40052e:       31 c0                   xor    %eax,%eax400530:       e8 bb fe ff ff          callq  4003f0 <printf@plt>400535:       31 c0                   xor    %eax,%eax400537:       48 83 c4 08             add    $0x8,%rsp40053b:       c3                      retq40053c:       8d 70 ff                lea    -0x1(%rax),%esi40053f:       eb e8                   jmp    400529 <main+0x19> /* jump到调用printf代码处, 导致cpu flush掉流水线上的内容. */400541:       90                      nop
适用场景
gcc手冊表示这两条指令应该在程序猿对分支走向相当确定的情况下使用。只是大多数程序猿还是会预測失败,所以建议经过大量profiling来确定可能性。
在linux内核代码中likely和unlikely常常被用在错误代码处理的情况, 由于发生错误的情况往往是少数的。
http://www.jmfq.cn/news/5174425.html

相关文章:

  • 免费网站建设塔山双喜/百度排名
  • 吉林省工程建设标准网站/运营商推广5g技术
  • 广州网站建设出售/百度识图官网
  • 有哪些做鸭子网站/seo推广一年要多少钱
  • 站长工具搜一搜/中国 日本 韩国
  • 网站建设方案项目书/营销活动
  • 网站空间 程序有限制吗/青岛百度seo
  • 网站系统繁忙是什么意思/seo企业站收录
  • 商标设计免费/杭州seo网站推广排名
  • 网站程序盗版/百度推广账号注册流程
  • 东莞网站搜索排名/天津搜狗seo推广
  • 模板ppt免费/武汉seo系统
  • 手机app开发语言/山东服务好的seo公司
  • 建设网站具备的知识/最新国际新闻事件今天
  • 中小企业组网/windows优化大师可靠吗
  • 衡阳网站定制/上海培训机构整顿
  • 做网站的是怎么赚钱/电子商务
  • 专业做医院网站建设/指数
  • 北京最大的网站建设有限公司/长春网站建设公司哪家好
  • 做外单网站亚马逊/优化英文
  • 免费网站建设企业/百度在线客服系统
  • 平泉县住房和城乡建设局网站/南宁推广软件
  • 做坏事网站/名优网站关键词优化
  • 山西省网站建设/百度推广渠道
  • 建设医院网站多少钱/中央电视台新闻联播
  • wordpress 整站采集/河北网络科技有限公司
  • 如何做农产品网站/建立网站费用大概需要多少钱
  • 广州制作公司网站的公司/seo优化排名易下拉效率
  • 网站建设绿茶/免费自己建网页
  • 安徽网站建设公司/六安seo