62 Star 19 Fork 5

同济大学计算机开放实验室/计算机基础_汇编语言_硬件技术基础

深入理解CPU的分支预测(Branch Prediction)模型

已完成
拥有者
创建于  
2023-09-07 20:45

本文以stackoverflow上Why is it faster to process a sorted array than an unsorted array?为原型,翻译了问题和高票回答并加入了大量补充说明,方便读者理解。
https://zhuanlan.zhihu.com/p/22469702

评论 (51)

XilongPei 创建了任务 2年前

C/C++ 分支预测(likely unlikely)
https://www.cnblogs.com/xudong-bupt/p/7337240.html
指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到指令执行完所需的全部。
  预取指令具体方法就是在不命中时,当数据从主存储器中取出送往CPU的同时,把主存储器相邻几个单元中的数据(称为一个数据块)都取出来送入Cache中。预取指令可以更好的利用 cpu资源。简单说就是从内存取指令很慢, cpu要等待这个过程。如果能提前预测可能执行的指令,就提前从内存把指令读到 cache, 由于 cache的访问速度较内存快,cpu要执行时就不用等很长时间了。
  如果开发人员可以告诉编译器,哪个分支更有可能发生(likely) 或者 非常不可能发生(unlikely), 可以帮助编译器进行代码编译。

2251762胡沛荻
了解了分支预测的相关知识,简单来说就是在分支处提前猜哪一支的可能性更大,优先在可能性大的分支提前准备,这样就能减少很多不必要的分支转换,提高效率。
比如c语言中的if-else分支,经常是else的情况更多,可能性更大,https://www.cnblogs.com/xudong-bupt/p/7337240.html 其中的cpp编译成汇编语言后,发现if对应的语句被放在了后面,else被放在前面,因为else发生的可能性更大。

结合已给文章,以及网上查找的文章,简单总结一下。

CPU的分支预测是指在程序执行过程中,当遇到分支指令(如条件判断语句、循环语句等)时,CPU会尝试预测分支的走向,然后提前执行相应的代码路径,以提高程序执行的效率。
分支预测的原理通常基于历史分支执行的统计信息,比如过去该分支的走向是经常取反还是经常不取反。根据这些统计信息,CPU会采用一些算法来预测当前分支的走向,通常有两种预测方式:静态预测和动态预测。
静态预测是根据分支指令的类型或者是程序员的一些编码规范来进行预测,例如默认预测分支不会发生改变或者根据分支指令的类型来判断。
动态预测是根据历史分支的统计信息来进行预测,通过记录每个分支指令的历史执行情况,CPU可以根据历史数据进行预测。常见的动态预测方法有:1) 一位饱和计数器;2) 两位饱和计数器;3) Tournament predictor 等。
分支预测技术在现代CPU中起到了重要的作用,它可以减少因分支带来的流水线停顿,提高指令级并行度,从而加速程序的执行。然而,分支预测也可能出现预测错误,导致额外的开销和性能下降。因此,CPU设计者在优化分支预测算法时需要权衡预测的精度和开销之间的关系。

2252538 陈凯洁
从内存中读取指令很慢,cpu要等待这个过程,如果能提前预知可能执行的指令,就提前从内存把指令读到cache。由于cache访问速度比内存块,这可以节省时间。
如果代码告诉编译器哪个分支是likely哪个分支是unlikely,在编译代码的时候会把unlikely的分支编译到最后。
分支预测可以节省状态切换的时间
一般来说,pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).
分支预测器在分支指令执行之前猜测哪一个分支能运行,可以提高pipelines的性能

2252557 王小予
分支预测(Branch Prediction)模型在现代CPU中扮演着至关重要的角色。它解决了程序中分支指令带来的性能挑战,通过预测分支的执行路径,提高了指令执行的吞吐量。让我们更深入地了解CPU的分支预测模型。分支指令根据条件的真假来选择执行不同的代码路径。然而,因为条件在执行前是未知的,CPU需要在分支指令执行前进行预测,以便加载正确的指令,减少等待时间。这种不确定性是性能挑战的核心。
分支预测模型利用历史信息来预测分支的结果。它维护一个分支历史表,记录过去分支的行为。根据历史数据,模型尝试预测下一次分支的行为,通常表示为“taken”(分支被执行)或“not taken”(分支未执行)。分支目标缓冲器存储分支指令的目标地址,以确保加载正确的执行路径。
高效的分支预测模型可以显著减少分支指令的预测错误,降低CPU清空和重新加载操作的频率。这种改进提高了指令执行的吞吐量,加速了程序的运行速度。 随着计算机体系结构的发展,分支预测模型变得更加复杂和智能化。现代CPU采用了多级分支预测,包括两级分支预测、TAGE预测器等,提高了准确性和适应性。

2252315 龙俊宇
1.关于Pipeline:CPU的instruction pipeline(指令流水线),以下简称pipeline。 Pipieline假设程序运行时有一连串指令要被运行,将程序运行划分成几个阶段,按照一定的顺序并行处理之,这样便能够加速指令的通过速度。绝大多数pipeline都由时钟频率(clock)控制。
一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).
2.关于分支预测器:分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。条件分支通常有两路后续执行分支,not token时,跳过接下来的JMP指令,继续执行, token时,执行JMP指令,跳转到另一块程序内存去执行。
3.分支预测模型利用历史信息来预测分支的结果。它维护一个分支历史表,记录过去分支的行为。根据历史数据,模型尝试预测下一次分支的行为,通常表示为“taken”(分支被执行)或“not taken”(分支未执行)。分支目标缓冲器存储分支指令的目标地址,以确保加载正确的执行路径。

2252403 赵唯旭
CPU的分支预测模型对于提高指令流水线的效率具有重要意义。分支预测模型主要用于预测程序中的分支指令 (如条件分支、循环等) 的结果,以便CPU可以提前执行后续的指令,从而减少指令流水线的停顿。这样的模型可以提高CPU的执行效率,提高计算机系统的整体性能。
评价CPU的分支预测模型需要考虑以下几个方面:1.预测准确率:一个好的分支预测模型应能在大多数情况下正确地预测分支的结果。如果预测准确率较高,可以有效地减少流水线停顿带来的性能损失。2.延迟和开销:分支预测模型的预测需要一定的时间和资源,如果预测延迟过高或者预测开销过大,可能会降低CPU的整体性能。3.可扩展性:随着计算机程序的复杂性不断增加,分支预测模型需要能够适应更多的分支指令和程序结构。一个可扩展的分支预测模型可以适应不断变化的计算需求。

2252659 冯甘雨
pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back)
分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。条件分支通常有两路后续执行分支,not token时,跳过接下来的JMP指令,继续执行, token时,执行JMP指令,跳转到另一块程序内存去执行。
对分支预测来说:代码并不是按照顺序生成的。

2251645 曲意展
1.通过学习了解到,分支预测是一种解决处理分支指令(if-then-else)导致流水线失败的数据处理方法,由CPU来判断程序分支的进行方向,能够加快运算速度,它包含编译时进行的静态分支预测和硬件在执行时进行的动态分支预测。
有关排序与计算的先后,通过代码以及实验,类比火车选择轨道的示例,可以知道,使用分支预测: 是否排序严重影响performance,在大规模循环逻辑中要尽量避免数据强依赖的分支(data-dependent branching).
2.pipeline是CPU的instruction pipeline(指令流水线),Pipieline假设程序运行时有一连串指令要被运行,将程序运行划分成几个阶段(读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back))按照一定的顺序并行处理之,以此来加快运行速度。
3.常见的分支预测器有静态分支预测器和双模态预测器两种。其中双模态预测器是一个四状态状态机,对应两个选择: token, not token。通过判断二进制状态高位是否跳转来判断对应的选择,这种方法正确率很高

2251021 陈森
通过学习得知,为了提高cpu工作效率,cpu执行的时候,并不是“等概率”地执行,而是会通过一些规则来进行调整,使得运行效率更高。这让我想起了之前模拟cpu的游戏,在那里我就提到,如果按照一定的规则,将会提高执行效率,看来分支预测这便是更高一级的,优化规则的规则。同时也联想到大语言模型,也是通过一定的规则,预测概率训练得出的

分支预测是指遇到分支指令时 自动预测结果进行跳转不影响其他指令的进程 首先 cpu的流水通常来说最少都有5条 而在执行指令时 没有依赖关系的流水会同时进行(但分支指令中 显然分支指令本身和跳转之后的命令有强依赖关系) 如果其余的流水都等待执行分支指令的流水工作完了再恢复执行 那么那一段代码的效率将会成倍的降低 因此用分支预测来一边执行分支指令本身 一边“执行”跳转后的指令(不会真的执行 但会在cpu内运行并保存 类比缓存区)最后返回了验证正确性 正确则继续 错误则回到跳转后的指令还未执行的状态(这里应该用栈指针保存过)
因此为了提高效率 首先分支预测只能优化分支指令执行的时候的效率 更多的如果能不用(优化算法)分支当然更好(降低指令之间的依赖性) 如果必须要 那么完全可以通过排序 或者用加入unlikely的方式使程序变快

2251884 陈若晞
cpu的分支预测是指cpu通过分析历史运行记录,识别出一种隐含的模式来预测指定分支的下一步走向,从而达到提高效率的目的,在计算机中实现分支预测的一个重要器件是分支预测器,常见的分支预测器分为静态和双模态两种,高效率的分支预测能够极大提升CPU的运行效率

2253372 康嘉玮
分支预测就是在程序出现分支时预测其下一步应该沿哪一条分支运行,猜测正确则大大减少花费的时间,否则反而会浪费大量时间。因此合理的预测策略显得比较重要。而CPU采取的策略是分析历史运行记录。
大多数应用的分支都是状态良好的,因此现代化的分支预测器“猜对”的可能性很大。但在一些情况下,分支预测器也无能为力。这种“不好的”分支有时候可以采用位运算优化。尽管如此,在大规模循环中,还是要尽量避免数据强依赖的分支,以减少运行时间。
常见的分支预测器有静态和双模态等。

2253314 拓凯文
学习了CPU的分支预测模型。
指令周期是指执行一条指令所需要的时间,而预取指令则在提前预测可能执行的指令,并从内存把指令读入,从而提升CPU的运行效率。使用分支预测模型,意味着需要由人类告诉编译器什么指令更可能发生,并运行该指令,如果正确就可以继续运行,此时节省了很大的时间成本,如果错误则需要返回。常用的分支预测模型有静态分支预测器和双模态预测器。

CPU的指令流水线:
pipeline的意义与流水线相近,它将程序划分成了几个阶段,再按照一定顺序处理。RISC流水线就属于pipeline的一种

2253110 杨思懿
通过学习了解到,CPU(中央处理单元)的分支预测是一种计算机处理器优化技术,旨在提高程序执行的效率。在计算机程序中,分支是指程序根据某种条件(如 if-else 语句)选择执行不同的代码路径。分支预测尝试在分支指令执行前预测哪个分支会被执行,以便提前加载相应的指令和数据,从而避免在实际执行时因等待分支判断结果而产生的延迟。常用的分支预测模型有静态分支预测器和双模态预测器。

2251022 田鸿飞
学习了CPU的分支预测,CPU通过分析历史记录,识别出概率较高的一种隐含的模式并在后续的应用中尝试使用这种模式。但是面对无法预测的分支,且没有识别出可应用的的模式时,分支预测器就无用武之地了。
Pipieline假设程序运行时有一连串指令要被运行,将程序运行划分成几个阶段,按照一定的顺序并行处理之,这样便能够加速指令的通过速度。绝大多数pipeline都由时钟频率(clock)控制。一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).
分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。常见的分支预测器有静态分支预测器和双模态预测器。

2253692 龚佳灿
学习CPU branch prediction,了解到CPU通过下个分支的预测从而提高程序运行速度。所以程序中的数组是否排序会大幅度影响程序运行速度,因为排序后会提高预测的准确性。
CPU pipeline。pipeline将程序划分为几个阶段,然后按一定顺序并行处理,从而加快通过速度。一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).

2251079 隋建政
学习了CPU的分支预测模型,实际进行了代码运行时间的实验,以下为虚拟机中的结果:


显然test2中注释掉了排序运行结果就大大延长了。

而使用位运算的方法二者运行速度则相差不大
因此分支预测器的引入大大提升了计算机的运行效率,而一个好的分支预测器又是十分重要的,因为预测正确率低的分支预测器反而会增大程序的运行时间,而现常用的双模态预测器可以达到93.5%的正确率。

2252933 李海禄
CPU的分支预测模型是CPU流水线在遇到条件分支语句时,预判分支走向的一种机制。当程序代码出现条件分支语句时,条件分支语句的下一条指令直到条件结果计算完毕后才能确定。在结果计算完毕前,CPU流水线无法进行指令预取和指令解码,导致流水线停滞,效率降低。为了解决这一问题,CPU的分支预测模型在条件结果计算完毕前,根据程序的历史运行记录,预判下一条指令的位置并将其应用于流水线。如果预判正确,CPU的流水线就不会停滞,效率得到提升。引入分支预测后,CPU流水线有一定几率不stall,提升了执行效率。特别地,当程序编写时有意迎合CPU分支预测机制,那么程序就能高效的执行。

2254228 朱雨欢
学习了CPU的分支预测概念和基本理论
如果能够在取指令阶段,就可以“预知”本周期所取出的指令中是否存在分支指令,并且可以知道它的方向(跳转或者不跳转),以及目标地址(target address)的话,那么就可以在下个周期从分支指令的目标地址开始取指令,这样就不会对流水线产生影响,提高了处理器的执行效率。这种不用等到分支指令的结果真的被计算出来,提前预测结果的过程就是分支预测。

分支预测本质上是对分支指令的结果进行预测,分支指令一般包含两个要素:方向和目标地址。对于RISC指令集来说,目标地址在指令中可以有两种存在形式:直接跳转和间接跳转

2251753 杨乐
结合文章以及网上查的资料总结:CPU的分支预测模型是指在计算机中用于预测程序中条件分支(如if语句、循环等)的执行路径的模型。由于计算机程序中存在大量的条件分支,分支预测模型的准确性对于提高计算机性能至关重要。
pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back)
常见的CPU分支预测模型包括:
静态分支预测:静态分支预测模型假设程序中的分支总是按照某种固定的模式执行,例如总是选择一个特定的分支路径。这种预测方法简单且易于实现,但对于复杂的程序效果不佳。
动态分支预测:动态分支预测模型根据程序运行时的历史信息来预测分支的执行路径。它通过记录和分析过去的分支执行结果,以确定下一次相同分支的执行情况。其中,常见的动态分支预测模型有2位饱和计数器模型等。
全局分支历史预测:全局分支历史预测模型考虑了整个程序的分支历史信息,通过记录和分析所有分支的执行情况来预测下一次分支的执行路径。常见的全局分支历史预测模型有全局分支历史缓冲器模型,它使用一个缓冲器来存储程序中所有分支的历史执行结果。
局部分支历史预测:局部分支历史预测模型只考虑某个特定分支的历史信息,通过记录和分析该分支的执行情况来预测下一次该分支的执行路径。常见的局部分支历史预测模型有局部分支历史缓冲器模型,它为每个分支维护一个对应的缓冲器,用于存储该分支的历史执行结果。

2250681 赵嘉禾
学习了分支预测。
分支预测本质是一种对条件分支的判断模型,是CPU流水线在遇到条件分支语句时,预判分支走向的一种机制。大致分为四个阶段:读取指令、指令解码、运行指令、写回运行结果。
操作方法是:当取指令时,判断所取指令中是否有分支指令,而且知道分支指令是否跳转、跳转地址,便可以在下次取指令时直接跳转到分支指令地址,从而不会对原有队列造成影响,以此保证运算的高效。
同时,动态的分支预测还可以对历史数据分析,以过去分析当下所取地址。

2252658 彭怀龙
学习了CPU的分支预测
分支预测是CPU针对if指令的一种机制。在if指令执行之前先预测执行的结果,将其放入流水线。分支预测有静态分支预测、动态分支预测、全局分支历史预测和局部分支历史预测四种。
在分支预测中,分支预测器扮演着重要的角色,这种数字电路在分支指令执行前,猜测哪一个分支会被执行,能显著提高流水线的性能。
分支预测对CPU的性能有巨大的提升

2251024 卫星
学习了CPU的分支预测和运行机制,可知CPU内存取指令相对较慢,而cache的访问速度较内存快,则分支预测模型便是按分支可能执行的概率高低来决定搬运内存指令到cache的顺序,以此大幅度地提高慢步骤的效率,以此来缩短CPU处理大量内存指令的时间。
一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).
常见的分支预测器有静态分支预测器和双模态预测器等。

2253057 石子圣
分支预测是一种对条件分支的判断模型,为提高CPU存取指令的效率,当CPU流水线在遇到条件分支语句时,可以提前预判分支走向,当预判正确时,CPU的流水线正常运行,效率因此得到大幅度的提高并节省了很大的时间成本。
Pipieline将程序运行划分成几个阶段(一般包括读取指令、指令解码、运行指令、写回运行结果),按照一定的顺序并行处理之,这样便能够加速指令的通过速度。
输入图片说明

2253157 杨淞
是解决在处理分支指令(if-else之类)时导致指令流水线停顿的处理方法,由CPU来预先判断程序分支的进行方向,能够加快运算速度,预测成功率越大,程序性能将会越好。当有流水线技术的处理器处理分支指令就会有一个问题,在处理分支指令之前处理器无法确定该指令的下一条指令,这就会打断流水线线中的指令处理,导致流水线停顿,流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。分支预测技术便是为解决这一问题。

2254230 黄嘉祺
分支预测是一种CPU优化技术,旨在提高程序执行效率。它通过预测程序中的条件分支(例如if语句或循环)的结果,从而在分支指令执行之前就预测并执行可能的下一条指令。分支预测模型基于两个基本原则:局部性和历史性。局部性指的是根据分支指令的历史,预测该指令的下一个分支指令的可能结果。历史性指的是根据程序执行的全局历史信息,预测分支指令的可能结果。一种常见的分支预测模型是局部历史分支预测器(Local History Branch Predictor)。该模型使用一个小的历史记录表(Branch History Table)来存储分支指令的历史信息。每个分支指令对应一个记录表项,记录表项中存储了该分支指令的历史执行结果。当CPU执行分支指令时,它会根据历史记录表中存储的信息预测下一条指令的执行路径。

2253222 殷贺秋
分支预测是对条件模型的CPU优化技术,通过预测,提前将指令从内存送入cache,从而提高程序执行效率。
静态分支预测是软件侧的分支预测实现,更准确的说是通过编译器来达到更好的分支预测结果,减少pipeline flush、static branch prediction,不需要额外的CPU的支持。
现代处理器通常采用动态分支预测,即硬件(CPU front end)有单独的分支预测逻辑(对软件透明)。总的来说,动态分支预测的核心就是根据分支历史信息来预测当前分支的方向。最基础的动态分支预测为Bimodal branch predictor,Two level分支预测建立在bimodal之上,已经可以达到95%的准确率。

2251696 洪毅
学习了CPU的分支预测。CPU的分支预测是一种技术,用于在程序中发现分支(例如条件语句或循环)并预测其可能的结果。它的目的是通过提前预测分支的结果,来减少因分支所带来的延迟和对CPU性能的影响。分支预测通过观察过去分支的执行历史和模式,来推测未来分支的行为。它使用了分支历史记录、预测缓冲区和分支目标缓冲区等机制。当CPU执行到分支处时,它会根据预测结果选择一个分支路径执行,从而避免了等待分支结果的延迟。分支预测的意义在于加快程序执行速度,优化CPU性能。由于分支语句在大多数程序中非常常见,正确的预测可以避免控制流的中断和等待,降低CPU空转的时间,提高指令级并行性。当分支预测错误时,CPU需要舍弃预测并回退到正确的分支路径,这会引入一定的额外延迟和性能损失。因此,分支预测的准确性至关重要。现代CPU使用了多种分支预测算法和技术,并且不断优化和改进分支预测的准确性,以提供更好的性能。

2252431 孙骁远
学习分支预测的相关知识。分支预测是对if-else语句的判断模型,它通过对历史运行记录的推测和理解提前预测分支的结果,减少在大型程序中因分支过多所带来的延迟和对操作系统的影响。预测正确,处理器不需要暂停,继续往下执行,程序性能越好,运行越流畅。预测错误则处理器要flush掉pipelines, 回滚到之前的分支,然后重新热启动,选择另一条路径。
分支预测器是一种数字电路,在分支指令执行前,猜测哪一个分支会被执行,能显著提高pipelines的性能。常见的分支预测器有静态分支预测器和双模态预测器。双模态预测器的正确率可达到93.5%。预测期一般在分支指令解码前起作用

2253180 丁瀚洋
CPU的分支预测是一种处理器技术,旨在提高程序执行的效率。分支预测器是CPU中的一个重要组件,它评估程序中的条件分支(例如if语句、循环等),并预测分支的结果。
当遇到程序中的条件分支时,CPU需要在决定执行分支之前获得该分支的结果。分支预测器的作用是在分支指令尚未执行完成时提前猜测分支的结果,并根据这个猜测来预加载相关的指令和数据,以减少流水线的停顿,并提高指令级并行性。如果猜测正确,CPU可以顺利继续执行预测的分支路径;如果猜测错误,CPU需要废弃已经预测的指令和数据,重新开始执行正确的分支路径。
分支预测器的准确性对CPU性能至关重要。如果预测准确率高,CPU可以更好地隐藏分支延迟,提高指令执行的效率。但是,如果预测错误率较高,CPU将浪费时间和资源处理错误的分支预测,导致性能下降。

2251499 桂欣远

  1. CPU预测程序中条件分支指令的执行结果是taken还是not taken。
  2. 根据预测结果,提前把预测taken的分支路径上的指令取出并执行。
  3. 如果预测正确,可以省去分支的评估时间,提高流水线效率。预测错误则需要flush pipeline。
    现代CPU使用了非常复杂的分支预测器,可有很高的预测准确率。但对某些代码依然存在误预测。
    分支预测可以明显提升指令级并行性,是一项非常重要的编译器和处理器优化技术。需要程序员根据profile结果进一步优化代码,减少失误预测。对其原理和实现也需要深入理解。

2251275 王文俊
1.分支预测是CPU设计中一项重要的技术,用于预测程序中条件分支的结果,从而优化程序的执行效率。
2.当我们编程时使用if-else语句、while循环等结构时,实际上是在创建分支。这些分支会根据某个条件的真假来决定程序的执行路径。而分支预测就是要预测这些分支的结果,从而让CPU提前执行正确的代码路径。
3.分支预测通常使用一种或多种算法,如静态预测、动态预测、适应性预测等。静态预测基于程序的历史信息来预测分支结果,而动态预测则基于程序在运行时的行为来预测。适应性预测则是结合了静态和动态预测的方法。

2250728 丁子昂
学习了CPU的分支预测模型。分支预测是对条件模型的CPU优化技术,通过预测,提前将指令从内存送入cache,从而提高程序执行效率。当CPU流水线在遇到条件分支语句时,可以提前预判分支走向,当预判正确时,CPU的流水线正常运行,效率因此得到大幅度的提高并节省了很大的时间成本。

ray 任务状态待办的 修改为已完成 2年前
ray 任务状态已完成 修改为进行中 2年前

2254231 成嘉怡
分支预测是CPU性能优化的关键技术之一,通过预测分支指令的行为来降低流水线停滞,提高计算机程序的执行效率。不同的CPU架构和制造商可能采用不同类型的分支预测技术,以优化性能。对于程序员和系统设计师来说,理解分支预测的原理和性能特征是优化代码和系统的关键一步。

2251697 黄宇豪 已完成
了解了CPU的分支预测模型是一种预测程序流程的技术,它利用历史信息预测未来程序流程,从而提高程序的执行效率。
1、静态预测,利用程序中已知的信息,如函数调用表、跳转表等,对程序流程进行预测。静态预测通常使用以下两种方法:
直接预测:根据程序中已知的跳转表,直接预测程序流程。
间接预测:根据程序中已知的函数调用表,通过函数调用关系,预测程序流程。
2、动态预测,利用程序运行时的信息,如指令执行历史、寄存器状态等,对程序流程进行预测。动态预测通常使用以下两种方法:
基于历史信息的预测:根据指令执行历史,利用历史信息进行预测。
基于模型预测:根据指令执行历史和寄存器状态,利用模型进行预测。

2253119 唐梓程
按照跳转地址是否可以从指令中直接得到,可以将分支指令分为直接分支和间接分支指令。按照分支指令是否一定会跳转,可以将分支指令分为无条件分支和条件分支指令。很显然,一旦CPU解码出无条件分支,就可以省略预测方向的步骤。而所有的分支预测算法都可以归为两大类:静态预测和动态预测。
静态预测中最简单的方法就是判定所有分支都跳转或者所有分支都不跳转。这种简单策略的最大优点就是不怎么消耗资源和功耗,所以经常用在那些追求极致成本和功耗,并且不怎么关心性能的处理器产品上。而我们日常接触到的大多数处理器还是有点性能追求的,这时候简单的静态预测就不够用了,所以动态预测成为了大家关注的重点。
面对分支指令时,动态预测利用程序运行时的信息,如指令执行历史、寄存器状态等,对程序流程进行预测。而且其有个基本的假设:一条分支指令历史上的行为和这条指令未来的行为很大概率是一致的。所以几乎所有算法的背后无非就是一句话:历史的轨迹指引了未来的方向。

2254328 奚睿豪
CPU的分支预测是为了在综合层面上加快运算的方式,通过预测执行哪一部分代码(taken/not taken),来综合上减少运行耗时。
主要的预测方法:
1、静态预测:事先预测都跳转或都不跳转,这样准确率不高,因为很多程序依赖于不同输入有不同结果,这样固定预测是不科学的。
2、动态预测:基本的方法是使用两位二进制数来表示:00, 01, 10, 11分别对应strongly not taken, weakly not taken, weakly taken, strongly taken,从历史数据中预测哪个分支会被执行。
此外,我们在写代码时也可以自己指定(likely/not likely)来告诉编译器如何优化汇编代码提高效率,或者使用别的技巧规避跳转此类耗时长的命令。

2253091 李捷
1.CPU分支预测是一种在CPU执行分支指令时,提前预测分支的结果,从而提高流水线的效率的技术。
2.分支预测可以减少流水线的暂停和冲刷,提高指令的吞吐量。
3.分支预测有不同的算法和实现方式,例如静态分支预测、动态分支预测、局部分支预测、全局分支预测等。

2252661 李晨铭
了解了分支预测的相关知识,简单来说就是在程序出现分支时,通过猜测的方式,猜哪一支的可能性更大,优先在可能性大的分支提前准备,这样就能提高一些效率。(比如c语言中的if-else分支。)
分支预测的原理通常基于统计信息,根据这些过去的走向信息,CPU会采用一些算法来预测当前分支的走向,通常有两种预测方式:静态预测和动态预测。
分支预测在现代CPU中扮演着至关重要的角色。当CPU流水线在遇到条件分支语句时,可以提前预判分支走向,当预判正确时,CPU的流水线正常运行,效率因此得到大幅度的提高并节省了很大的时间成本。

2252024 王玮烨
了解了关于分支预测的相关知识。分支预测是现代处理器用来提高CPU执行速度的一种手段。在CPU执行程序的过程中,条件分支语句的出现可能会导致流水线暂停,等待条件结果计算完毕后才能确定下一条指令,这种情况被称为“流水线停顿”或“分支停顿”。这种停顿会大大降低程序的执行效率,因此,分支预测的引入就是为了解决这个问题。分支预测的模型有多种,如简单条件预测、复杂条件预测、间接跳转预测等。简单条件预测是假设每个条件分支指令的执行结果都是根据前面指令的执行结果确定的,即“顺序执行”的假说。复杂条件预测则考虑了更多的情况,例如一些指令的执行结果可能不受前面指令的影响,或者影响的程度不同等。间接跳转预测则针对的是间接跳转指令,这种指令的执行结果不是直接指定的,而是需要根据前面的指令计算得出。分支预测的精度对CPU的性能影响非常大。如果预测准确,CPU可以提前读取并解码可能要执行的指令,从而减少等待译码器的时间,提高程序的执行效率。反之,如果预测不准确,CPU需要重新读取并解码指令,这会导致时间的浪费,并可能打乱CPU的执行计划,降低程序的执行效率。分支预测的精度很难达到100%,因此,许多处理器采用了适应性的算法来动态调整分支预测策略。例如,当预测错误时,处理器会记录下这个分支指令在最近几次中的执行结果,并根据这些结果调整预测策略。分支预测是现代处理器设计中的重要部分,对于提高程序的执行效率和CPU的性能至关重要。然而,由于分支预测的精度受到多种因素的影响,如程序的结构、指令的执行顺序等,因此,如何提高分支预测的精度一直是计算机架构设计中的一项重要任务。

2253726 黄子棋
了解了分支预测的知识,同时学习了热重载这个概念,以及了解了在写代码进行优化的时候可以通过写likely和unlikely来进行代码在执行的时候的优化,并在自己的电脑上跑了上课的示例程序
输入图片说明
输入图片说明

2252936马樱萍
分支预测是一种计算机处理器中的技术,用于预测程序中分支指令的执行路径。分支指令是指在程序中会根据某个条件来选择执行哪一条指令的语句,例如if语句或循环语句。
由于分支指令的执行路径是根据运行时的条件决定的,而条件的结果在指令执行之前通常是不可知的,这就给处理器的流水线带来了困难。流水线是处理器中的一种高效执行指令的方式,但遇到分支指令时,由于需要等待条件结果才能确定下一条指令的位置,就会导致流水线暂停等待,从而影响性能。
为了解决这个问题,处理器引入了分支预测技术。分支预测器根据历史分支执行信息和其他的预测策略,尽可能准确地预测分支指令的执行路径。常见的分支预测策略包括静态预测、动态预测和多级预测等。
静态分支预测是根据分支指令的类型或位置等静态规则进行预测。例如,根据某些规则认为循环结构一般会重复执行多次,就可以预测循环分支的下一个执行路径为循环体内。然而,静态预测不考虑运行时的条件,因此准确性有限。
动态分支预测通过分析程序在运行时的历史分支行为来进行预测。处理器会维护一个分支历史缓冲区(Branch History Buffer, BHB)或分支目标缓冲区(Branch Target Buffer, BTB)等,记录最近的分支行为,并根据历史数据来预测下一条分支指令的执行路径。
多级分支预测结合了静态和动态策略,在处理器中使用多级预测器来改善预测的准确性。多级预测器通常包括多个预测阶段,每个阶段都有自己的预测器和策略,并根据前一阶段的预测结果来决定下一阶段使用哪个预测器,以提高整体的预测成功率。
分支预测技术在现代处理器中被广泛应用,能够提高处理器的指令执行效率,充分发挥流水线的优势,从而提升计算机的性能。

2056004 王美丽娜
我对CPU的分支预测有了深入了解。这项技术的目的是提前预测程序中的分支(如条件语句或循环)可能的结果,以减少分支带来的延迟和CPU性能影响。分支预测依靠分析过去的分支执行历史和模式来预测未来的分支行为,它使用了分支历史记录、预测缓冲区和分支目标缓冲区等机制。当CPU执行到分支时,它会根据预测结果选择一个分支路径,以避免等待分支结果的延迟。分支预测的关键意义在于加快程序执行速度,优化CPU性能,特别是在处理常见的分支语句时,可以减少控制流的中断和等待,提高指令级并行性。但当分支预测错误时,CPU必须回退到正确的分支路径,这会带来额外的延迟和性能损失。因此,分支预测的准确性至关重要。现代CPU采用多种分支预测算法和技术,并不断优化以提供更好的性能。

2252329 罗民睿
1.分支预测模型是一种用于预测程序分支行为的模型。在面对有分支的情况(如if-else,循环条件判断等)时,它能够根据分支历史和模式来预测分支的执行路径,以提前采取适当的操作,从而缩短程序运行时间。这些模型的效果通常可以通过命中率来衡量,现代分支预测器通常能够达到超过90%的命中率。因为汇编代码并不是按顺序生成的,即编译器并非按顺序编译,而是在分支处先编译可能发生的,故可在程序里条件判断时加入likely或unlikely帮助编译器进行代码编译,从而提高命中率,缩短运行时间。
2.了解了pipeline。一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back)。
3.此外还了解了一些常见的分支预测器。
静态分支预测器是一种不进行预测的分支预测方法,即分支总是按照某种固定的模式执行。常见的静态分支预测方式包括总是不跳转、总是跳转、BTFN、Profile based和Program based等。
动态分支预测器是在程序运行时进行预测的一种分支预测方法。动态分支预测器通过记录程序的历史执行路径信息来预测分支行为。常见的动态分支预测方式包括1-bit动态预测、n-bit动态预测、下一行预测、局部分支预测、全局分支预测、融合分支预测和循环预测等。
双模态预测器是一种结合了静态和动态预测的方法。双模态预测器根据静态分支预测器和动态分支预测器的预测结果进行权衡,以提高预测准确率。双模态预测器在预测过程中可以动态地选择使用静态预测器还是动态预测器,以根据当前的程序执行情况来决定最佳的预测策略。

2252075 刘文飞
关于分支预测模型,是基于历史记录来判断可能的未来执行路径,达到cpu某些时候不需要一条一条指令执行的目的,从而提高cpu效率,并且有例子来说明一些结论
使用分支预测: 是否排序严重影响performance
使用bithack: 是否排序对performance无显著影响
在大规模循环逻辑中要尽量避免数据强依赖的分支(data-dependent branching).
补充的一些知识:一般的pipeline有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back).

2254280 傅怡天
CPU分支预测是一种能够提高计算机CPU指令执行效率的技术。分支指令是一种程序控制指令,它被用来改变程序执行顺序,如if语句、循环语句等。由于分支指令的存在,CPU指令流会出现“短路”现象,这会导致CPU花费更多的时间来等待分支指令的执行结果,从而影响CPU效率。因此,分支预测技术旨在尽可能准确地预测分支指令的结果,从而使CPU能够更加高效地执行程序。分支预测的实现方式有很多种,常见的包括静态分支预测、动态分支预测和混合分支预测等。

静态分支预测器是一种简单的分支预测方法,但是因为不能适应程序执行路径的变化,其预测效果有限。而动态分支预测器和双模态预测器则能够根据程序的执行情况来动态地调整预测策略和权衡静态和动态预测的结果,更能有效地提高命中率和准确性。此外,在pipeline执行阶段中,读取指令、解码、运行指令和写回运行结果是非常重要的步骤,通过pipeline技术能够对指令执行进行优化,提高整个系统的性能。

傅怡天 任务状态进行中 修改为已完成 2年前
索邓阳 任务状态已完成 修改为进行中 2年前

2252662 索邓阳


  • 了解了CPU的分支预测的存在,通过简单的实例明白了分支预测的基本概念和对CPU效率的优化。
  • 进一步了解了Pipeline(指令流水线的概念),程序会被pipeline分段执行,而pipeline一般有四个执行阶段(execuate stage): 读取指令(Fetch) -> 指令解码(Decode) -> 运行指令(Execute) -> 写回运行结果(Write-back)。

  • 又因此了解了流水线停顿和分支预测器,使用分支预测器可以避免流水线停顿。

    • 静态分支预测器,静态分支预测器有两个解码周期,分别评价分支,解码。即在分支指令执行前共经历三个时钟周期。
      输入图片说明
    • 双模态预测器,也叫饱和计数器,是一个四状态状态机. 四个状态对应两个选择: token, not token, 每个选择有两个状态区分强弱:strongly,weakly。分别是Strongly not taken,Weakly not taken, Weakly taken, Strongly taken。
      输入图片说明
  • 明白了在大规模循环逻辑中要尽量避免数据强依赖的分支。

静态分支预测就是每次都选择一个结果,就像抛硬币每次都猜正面,对于CPU流水线来说都猜指令不跳转,也就有50%的正确率了,这种预测方式简单但是不够高效。
动态分支预测会根据之前的选择情况和正确率来预测当前的情况,做出判断是顺序分支还是跳转分支,因此仍然会有成功和失败两种情况。
比如预测出现跳转时:
预测成功时,尽快找到分支目标指令地址,避免控制相关造成流水线停顿。
预测错误时,要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令。
cpu还会通过历史记录及相关信息来提高预测成功的概率,虽然是一个冒险的行为,但这种冒险有极大的回报率

赵健康 任务状态进行中 修改为已完成 2年前
张凯 任务状态已完成 修改为进行中 2年前

2251647 张凯
分支预测是指当处理器在执行分支指令前,对即将要跳转的指令地址与跳转方向进行预测的方法,它的目的是实现不间断的指令集,从而减少流水线的空转,提高流水线的性能。分支预测包括静态预测和动态预测两种,静态预测是指用某一种特定的规则来跳转到下一条指令集,比如向后跳转总是执行,向前跳转总是不执行。动态预测则会根据以往的跳转记录来判断当前跳转执不执行。

张凯 任务状态进行中 修改为已完成 2年前
杨博 任务状态已完成 修改为进行中 2年前

2252544 杨博
当处理一个分支指令时,有可能会产生跳转,从而打断流水线指令的处理,因为处理器无法确定该指令的下一条指令,直到分支指令执行完毕。流水线越长,处理器等待时间便越长,分支预测技术就是为了解决这一问题而出现的。因此,分支预测是处理器在程序分支指令执行前预测其结果的一种机制。在ARM中,使用全局分支预测器,该预测器由转移目标缓冲器( Branch Target Buffer,BTB)、全局历史缓冲器( Global History Buffer,GHB) MicroBe,以及 Return Stack组成。
采用分支预测,处理器猜测进入哪个分支,并且基于预测结果来取指、译码。如果猜测正确,就能节省时间,如果猜测错误,大不了从头再来,刷新流水线,在新的地址处取指、译码。

杨博 任务状态进行中 修改为已完成 2年前

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(50)
1855899 xilongpei 1627538227 胡沛荻-hupeidi 13259757 jkkjjj 1693385861 星川礼-hoshigawarei 龙俊宇-long-junyu-123 13246574 weixvzhao 1693359720 13259329 feng ganyu 1690639786 ziz-tj-exhibition_0 陈森-chen-sen0609 李明谦-li-mingqian12345 陈若晞-chen_ruo_xi 13262633 kang jw 1694877447
加载更多
C++
1
https://gitee.com/tjopenlab/computer_tech.git
git@gitee.com:tjopenlab/computer_tech.git
tjopenlab
computer_tech
计算机基础_汇编语言_硬件技术基础

搜索帮助