深入理解分支预测原理,揭开AMD Zen 5的高性能秘诀

前言

今年,AMD Zen 5架构随着AMD旗下锐龙、霄龙等新一代处理器的发布而亮相。Zen 5对比上一代架构 Zen 4在性能上有了大幅提升,其中,IPC(每时钟周期执行的指令数量)更是提升了16%。

在Zen 5 高性能的背后,分支预测器的优化功不可没,其中,对2-ahead分支预测的支持尤为重要

本文将从CPU分支预测原理讲起,试图带大家理解Zen 5在分支预测上的优化,揭开性能提升的秘密。

分支预测大体可以分成两部分,分支方向的预测和分支目的地址的预测,本文主要介绍前者。

从CPU流水线说起

在现代计算机体系结构下,程序都会被转换成一条条指令,在CPU中执行。

我们能想到的最简单的指令执行流程是串行执行,比如现有指令A,B,C和D,那么,串行执行流程如下:

然而,串行执行的效率无疑是低下的。为了充分榨干CPU的性能,指令流水线出现了,它把指令执行的流程划分成多个阶段,每个阶段可以独立执行。比如,下图中为2级流水线的示例图:

在流水线下,虽然单个指令执行的耗时不变,但指令执行的吞吐量增大了

分支指令是众多指令中的一种,它伴随着程序中 if/for/while 等可能出现分支跳转的代码而出现。

if (x == 0) {
    // doTingA
} else {
    // doTingB
}

上述的代码,可能会转换成如下的汇编代码:

branch_if_not_equal x, 0, else_label
// doTingA
goto end_label
else_label:
// doTingB
end_label:
// whatever happens later

分支指令的出现使得流水线执行变回了串行,因为在branch_if_not_equal执行完之前,CPU无法不知道下一步应该是doTingA,还是doTingB

我们可以加入分支预测的机制,提前“猜测”下一条指令,虽然猜错了会有惩罚代价,但只要我们猜得足够准确,CPU的性能就会得到大幅的提升。

分支预测的发展

静态分支预测

静态分支预测机制最简单,可认为是工程师根据大多数程序的特征总结出来的规律,常见的有2种机制:

  • Alway taken。每次都执行跳转操作,对循环逻辑效果很好。
  • BTFNT。如果目的地址为向前,则选择不跳转,向后则选择跳转。

静态分支预测机制实现简单、硬件开销低,但在复杂的程序上预测成功率低。因此,在现代处理器中占主导地位的为动态分支预测。

动态分支预测

动态分支预测基本都基于分支执行历史进行,这里有个关键前提,分支行为是重复的,这意味着分支行为是可以学习和预测的

最简单的预测策略是基于最近一次分支执行的结果。在实现上通常使用1 bit来存储最近一次分支执行结果,1表示跳转(taken),0表示不跳转(no taken)。

上图中,分支执行历史被存放到PHT(Pattern History Table)上,并通过分支指令的地址(PC)进行索引。

该策略在分支方向变化不频繁的场景能够取得较高的预测成功率,比如下面的例子1

// 例子1
for(i = 0; i < m; i++) {
    // 循环体
}

该策略下,只会在首次进入循环,以及出循环时会预测失败,因此,预测准确率为(m-2)/m,当m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值