0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何帮助提高CPU分支跳转的正确率

麦辣鸡腿堡 来源:OPPO内核工匠 作者:Rock 2023-12-13 11:25 次阅读

我们还是先看一个例子:

图片

看上面的两个函数,它们都是calloc一个全零数组x(这里不能直接用数组赋值,否则编译器会足够聪明进行自动的优化),遍历x中的每个数,如果等于0,执行分支A,否则执行分支B。

唯一的不同就是在分支判断的时候,prog2.c加了likely。我们先看下实际的结果如何:

图片

图片

可以看出,加了likely的prog2,明显用时变短。原因何在?

为了理解上面的例子,我们先介绍CPU流水线相关知识:

3.1. CPU流水线简介

CPU流水线是一种使用多级缓存来提高处理器性能的技术。它是指将CPU操作分为多个阶段,每个阶段单独完成一个操作,然后将结果传递给下一个阶段,以此类推。每个阶段都有一个独立的部件,并且所有部件都能同时处理不同的指令。现代CPU都会采用这种技术来提高CPU的运行效率。

CPU流水线通常包括以下五个阶段:

1)取指令(Instruction fetch):从存储器中读取指令。

2)指令译码(Instruction decode):将指令转换为可执行的指令。

3)执行指令(Instruction execute):执行指令的操作。

4)写回(Write back):将执行指令得到的结果写回内存中。

5)更新程序计数器(Update program counter):将程序计数器加1,使它指向下一个指令。

举个简单的例子:

我们假设每一个步骤执行时间都是一个时钟周期,那么一条指令执行需要3个时钟周期

图片

CPU 执行指令的3个时钟周期里,取值单元只在第一个时钟周期里工作,其余两个时钟周期都处于空闲状态,其它两个执行单元也是如此,效率太低了。

解决方法就是引入流水线,引入流水线工作模式后可以看到,除了刚开始第一个时钟周期大家还可以偷懒外,其余的时间都不会闲着

图片

CPU流水线的优点是可以同时执行多个指令,从而提高了处理器的效率。但它也存在一些问题,例如数据相关性(Data dependency)和控制相关性(Control dependency),这些问题可能导致流水线停滞,降低CPU的性能。

执行的程序指令如果是顺序结构,没有中断或跳转,流水线确实可以提高执行效率。但是当程序指令中存在跳转、分支结构时,下面预取的指令可能就要全部丢掉了,需要到要跳转的地方重新取指令执行。一般来说分支预测错误的处罚大约是19个时钟周期。(具体计算方法这里不做详细介绍了)。

我们看下前面提到的例子汇编出来的结果:

图片

prog2,这里汇编是”jne”,意思是如果判断结果不为0,就跳转到地址 800的地方执行。我们知道这里的判断一直是0。所以,cpu指令顺序向下执行,并不会发生预判错误,预取的指令也不会丢弃。这样就不会遭到分支预测错误的惩罚,效率会提高。

所以有些情况下,当我们根据实际的情况可以判断出哪条分支的可能性更高的时候,我们就可以站在上帝视角给予一定的提示,这样就可以降低分支预测错误,减少CPU的无用功了,从而可以有效的提高性能,同时也节省了功耗。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10444

    浏览量

    206566
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66772
收藏 人收藏

    评论

    相关推荐

    CPU分支预测对程序的影响

    分支预测的英文名字是“Branch Prediction”,如果大家在Google上搜索这个关键字,可以看到关于分支预测的很多内容。不过,要搞清楚分支预测是如何工作的,才是问题的关键。
    发表于 09-23 14:11 885次阅读

    提高继电保护动作正确率的策略

    和复杂,一旦发生局部电网和设备事故,而得不到有效控制,就会造成电网的稳定破坏和大面积停电事故。现代化大电网对继电保护的依赖性更强,对其动作正确率的要求更高。2 提高继电保护动作正确率的措施2.1
    发表于 08-20 14:58

    labview如何立即退出当前事件分支

    `想按Stop按键起到急停作用,想法就是:按Stop按钮,立即停止当前执行的事件分支跳转到另一个急停事件中,所有的阀门和泵全部关闭。考虑到当前分支的执行时间比较但是我想只要按下Stop键就会停止当前
    发表于 10-28 15:12

    优化技巧:提前if判断帮助CPU分支预测

    分支预测(branch prediction)和指令流水线(instruction pipeline),这两个结合可以极大提高CPU效率。对于像简单的if跳转
    发表于 06-13 16:27

    arm汇编跳转指令总结

    目前所知道的跳转指令有 b,bl,bep,bne.他们共同点是都是以b开头,首先从字面上分析:b:是Branch,表示分支。bl:是Branch Link表示带连接的分支。bep:Branch
    发表于 04-26 02:39

    怎样去正确的配置CAN协议的波特

    正确配置了它?我是否正确使用标称同步跳转宽度?(我没有在网站上看到同步跳转宽度的提及)。如果我犯了任何错误,我将不胜感激一些反馈!(请注意,我此时没有示波器访问权限,这就是我首先在这
    发表于 12-02 11:08

    S32K118如何使用S32K Design Studio正确地从Bootloader跳转到App?

    ?(参见 main.c)设置、链接器文件是否正确跳转到应用程序或我是否需要不同的地址?(请参阅链接器文件)如何正确跳转到应用程序?需要采取什么步骤?(也许我忘记了什么。)提前感谢您的
    发表于 03-21 08:17

    PLC编程的跳转分支实验

    PLC编程的跳转分支实验 一. 实验目的1. 熟悉编程软件及编程方式。2. 掌握跳转分支指令的使用。二.
    发表于 09-30 18:33 5944次阅读

    使用智能外设提高CPU效率

    现代微控制器添加了一个范围广泛的新功能,在正确使用时可以大大提高应用效率。特别是,可以使用独立于CPU独立操作的智能外设和外围设备,允许CPU并行执行其他任务,或者进入低功耗睡眠模式。
    发表于 06-09 14:32 7次下载
    使用智能外设<b class='flag-5'>提高</b><b class='flag-5'>CPU</b>效率

    Thumb指令集之Thumb跳转指令

    进行状态切换可以在程序中设定选择)。 ⑤ 带返回和状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。 ⑥ 第二种形式的带返回和状态切换的跳转指令。 下面详细介绍各指令的特点及用途。 11.3.1 跳转指令B Thumb
    发表于 10-19 10:04 1次下载
    Thumb指令集之Thumb<b class='flag-5'>跳转</b>指令

    ARM嵌入式系统的中断服务例程跳转

    在32位 ARM 系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现 程序跳转 到 中断服务 例程的功能。例如: IRQEntry B HandleIRQ ;跳转范围较小
    发表于 04-10 10:11 2673次阅读

    如何使用蝙蝠优化算法的网络入侵检测模型提高入侵检测的正确率

    网络入侵具有突发性和隐蔽性等特点,传统的技术很难描述其变化规律,这导致入侵检测正确率非常的低。为提高入侵检测正确率,降低误检率,提出了一种基于动态自适应权重和柯西变异的蝙蝠优化算法优化神经网络的入侵
    发表于 11-14 17:34 5次下载
    如何使用蝙蝠优化算法的网络入侵检测模型<b class='flag-5'>提高</b>入侵检测的<b class='flag-5'>正确率</b>

    GPU和CPU芯片的区别

    CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处
    的头像 发表于 05-10 09:04 1.8w次阅读

    cpu和gpu的结构区别

    CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。 CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的
    发表于 11-15 10:24 386次阅读
    <b class='flag-5'>cpu</b>和gpu的结构区别

    CPU中什么是分支预测

    什么是分支预测 在超标量的流水线架构上,我们得知,CPU 在运行指令的时候,会在一个时钟上做多个操作,也就是涉及到调用前后相关的指令,比如我们在一个简单的判断
    的头像 发表于 11-29 17:22 496次阅读