关于CPU分支指令流水线预测

150 篇文章 1 订阅

CPU在执行程式代码指令时,会预测并读入一部分指令到CPU缓存存储器中(注意不是很慢的内存),因为CPU访问内存的效率跟访问CPU内部L1/L2/L3高速缓存存储器的效率根本不是一回事。

所以,如果CPU指令流水线被频繁打断,导致CPU需要不停的擦除缓存并重新从内存中读入数据会导致机器代码指令的执行效率会变低一些。

注意:二进制程式机器代码在 Windows/Linux 之中是存放在共享缓存中,是的,我们执行的PE程式机器代码是放在虚拟内存之中的,这也意味着操作系统可能会将PE程式执行的代码部分放入硬盘IO,当需要重新读回的时,从硬盘IO之中拉回物理内存,这个过程损耗略大。

所以硬盘读写速度不够快,其实会影响到整个操作系统的工作效率的,OK:走题了。

所以:在追求极致效能的场景上面,我们应当考虑并尝试对CPU指令流水线分支预测进行优化,尽量防止CPU频繁的被中断被预读缓存到CPU高速缓存器之中的指令块。

但在此之前,人们需要知晓CPU在什么情况下会导致CPU指令流水线缓存被中断,我的答案很简单,JMP跳转指令的情况,只要人们执行了任何形式的跳转指令都将导致CPU指令流水线被中断,例如:JNE、JE、JLE、JGE、JO、JA、JB、JBE等跳转指令。

以下为一个用于演示分析的 C/C++ 代码:

int add(int x, int y) 
{ 
    if (x == 100) {
        return x - y;
    }
    else {
        return x * y; 
    }
}

以下为上述用于演示分析 C/C++ 代码的目标平台输出指令:

add(int, int):                               # @add(int, int)
        push    rbp
        mov     rbp, rsp
        mov     dword ptr [rbp - 8], edi
        mov     dword ptr [rbp - 12], esi
        cmp     dword ptr [rbp - 8], 100
        jne     .LBB0_2
        mov     eax, dword ptr [rbp - 8]
        sub     eax, dword ptr [rbp - 12]
        mov     dword ptr [rbp - 4], eax
        jmp     .LBB0_3
.LBB0_2:
        mov     eax, dword ptr [rbp - 8]
        imul    eax, dword ptr [rbp - 12]
        mov     dword ptr [rbp - 4], eax
.LBB0_3:
        mov     eax, dword ptr [rbp - 4]
        pop     rbp
        ret

 从上述汇编代码的输出之中,我们可以很明确的看到:

        cmp     dword ptr [rbp - 8], 100
        jne     .LBB0_2

执行了CMP指令并设置JZ标志位,如果JZ为1则不跳转否则跳转到 .LBB0_2 的RVA相对位置进行执行(JNE 不等于时则跳转)。

所以可以得出CPU分支预测时缓存的指令为预读一部分:if (x == 100)  条件成立(真/TRUE)时所需执行的指令。

在 GUN C/C++ 之中提供了 likely、unlikely 两个编译器宏(仅GUN GCC编译器支持)其作用则为显示的约定:IF / ELSE 语句块中,那部分更倾向被编译器优化令CPU分支指令流水线时缓存预读指令,但注意它的效能提升并不巨大,唯有当某个确定行为需被执行的重复次数超级多时,才会获得一定略微显著的提升。

if (likely(条件)) {

...

}

else {

...

}

例如上述代码的分支预测与:if (条件) { .... } else { ... } 是相同的,但并非绝对,例如:我们编写了略微复杂的 condition 情况时,在不提前声明 likey 的情况,IF 条件成立会使用JMP转移到其它位置进行执行,导致CPU分支预测时倾向于ELSE的部分,unlikey的作用顾名思义是相反的,此处不再过多的啰嗦。

C/C++ 20 语言标准中提供两个关键字,其作用与 likely、unlikey 作用一致,拽写的形式为:

[[likey]]、[[unlikey]]    C++ attribute: likely, unlikely (since C++20) - cppreference.com

在现代 C/C++ 编译器之中,编译器输出的代码都倾向于让CPU预测 IF 条件成立时包含的块所执行的指令序列,而非为ELSE,大多数情况下 C/C++ 编译器都可以很好的让代码的执行效率拉到最高,但并非绝对的,具体的优化场景人们需要根据目的实现及编译器输出的目标平台指令最终结果作为实际参考依据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 流水线分支预测是一种在计算机体系结构中常用的技术,用于优化指令执行的效率。在使用Vivado进行流水线分支预测时,我们可以通过以下几个步骤来实现。 首先,需要明确流水线分支预测的目标是为了减少由于条件分支导致的指令流水线的停顿,从而提高程序的执行效率。在采用了流水线分支预测技术后,我们可以在分支指令的执行过程中预测分支的目标地址,并提前取出并执行该目标地址处的指令,从而减少流水线的停顿。 其次,Vivado提供了丰富的资源和工具来帮助我们实现流水线分支预测。其中,重要的组件之一是分支目标缓冲器(Branch Target Buffer,BTB),它可以存储分支指令的目标地址,并根据历史分支的结果来预测分支的目标地址。此外,Vivado还提供了分支预测器,它可以根据分支指令的特征来确定是否进行分支预测,并选择适当的预测策略。 在进行流水线分支预测时,我们还需要考虑分支指令的静态特征和动态特征。静态特征包括分支指令的类型和位置,动态特征则包括分支历史信息,如分支的执行结果。通过综合考虑静态特征和动态特征,我们可以选择合适的流水线分支预测策略,提高分支预测的准确性。 最后,我们需要进行仿真和验证,以确保流水线分支预测的正确性和有效性。通过运行实际程序和对比预测结果和实际结果,我们可以评估分支预测的准确性,并对优化策略进行调整。 总而言之,流水线分支预测vivado是一种有效的优化技术,可以提高分支指令的执行效率。通过合理选择分支预测策略,使用Vivado提供的工具和资源,我们可以实现准确、高效的分支预测。 ### 回答2: 流水线分支预测是指在计算机流水线操作中,为了解决分支指令带来的流水线停顿,采用“猜测”的方式来提前执行分支指令。Vivado是一种适用于FPGA设计的开发软件,通过Vivado可以对FPGA的设计进行综合、实现和生成比特流文件。 在流水线中,分支指令可能会导致流水线中断,因为在执行分支指令之前,无法确定分支的目标地址。为了充分利用流水线的并行性,可以采用分支预测的方法来提前执行分支指令分支预测的基本原理是根据历史分支的结果,采用一定的算法对下一次分支的目标进行预测。如果预测正确,则可以提前执行分支指令;如果预测错误,则需要进行流水线中断和清空部分流水线指令。 Vivado是一种先进的FPGA设计开发软件,它提供了丰富的功能和工具,可以实现高效的FPGA设计。在Vivado中,流水线分支预测可以通过在设计中增加预测器来实现。预测器可以根据历史分支的结果进行训练,然后根据训练结果对下一次分支进行预测。通过使用Vivado中的分支预测功能,可以使得FPGA的设计在执行分支指令时可以更好地利用流水线的并行性,提高整体的性能。 总之,流水线分支预测是为了解决分支指令带来的流水线停顿问题而采用的一种技术。在Vivado中,可以通过增加预测器来实现流水线分支预测,从而提高FPGA设计的性能。 ### 回答3: Vivado 是赛灵思(Xilinx)公司推出的一款用于FPGA(现场可编程门阵列)开发的综合工具。流水线分支预测是一种用于提高CPU性能的技术,在Vivado 中也得到了支持。 流水线分支预测是指在程序执行过程中,当遇到条件分支指令(如if语句或循环)时,预测分支的方向,从而在程序继续执行之前预测下一条指令的位置。这种预测机制可以减少分支带来的流水线停顿,提高CPU指令执行速度。 在Vivado 中,流水线分支预测的实现是通过逻辑电路和控制器相结合来完成的。Vivado 的软件工具提供了一些优化技术,如自动路由和时序优化,以便实现高效的流水线分支预测。这些技术可以帮助开发人员在FPGA中实现更好的预测性能,并最大程度地减少流水线停顿。 通过在Vivado 中配置适当的参数和设置,开发人员可以根据具体的应用需求来调整流水线分支预测的性能。Vivado 还提供了大量的文档和教程,以帮助开发人员理解和使用流水线分支预测功能。 总之,Vivado 是一款强大的FPGA开发工具,提供了流水线分支预测技术的支持。通过使用Vivado,开发人员可以有效地实现流水线分支预测,提高CPU性能和指令执行速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值