百科问答小站 logo
百科问答小站 font logo



为什么编程语言中没有一种 if,来判断大概率为真(或假)的情况,来提升 CPU 分支预测的速度呢? 第1页

  

user avatar   redlightasl 网友的相关建议: 
      

gcc中提供了实现这种功能的宏,相关内容可以看其他答主,本人其实也没用过(

可能因为这部分功能已经被现代CPU以硬件的形式实现了,再加上编译器的优化,已经不需要开发者再手动写了,所以知道的人也不多(大概)

经典的分支预测器就是一比特分支预测:每次分支指令执行后就会使用此计数器记录上次的方向,采用下一次分支指令永远采用上次记录的方向作为本次的预测。或者是它的改进版本两比特饱和计数器:设置两个状态,当前状态和预测状态,当前状态有两个比特位的深度,分别标记为“强”和“弱”如果当前状态=强不需要跳转弱不需要跳转,则预测该指令方向为 不需要跳转;如果当前状态=弱需要跳转 强需要跳转,则预测该指令方向为 需要跳转;如果预测出错,则反向更改当前状态:从 强需要跳转 要出错连续2次才能变为变为 弱不需要跳转,因此具有一定的切换缓冲,其在复杂程序流中预测精度一般比简单的一比特饱和计数器更高

现代CPU中有一个专门用于预测的结构,是上面所说两比特预测器的超进化,叫相关预测器,这个器件会在CPU取指后和执行前分得一个周期处理分支跳转——对于每条分支,将有限个两比特饱和计数器组织成PHT(Pattern History Table),使用该分支跳转的历史作为PHT的索引,然后在执行后面的分支跳转指令的时候再使用历史缓存中的历史值所引导对应的PHT进行跳转

可以理解成保存之前指令的历史记录,后面的指令执行的时候会先看前面指令是怎么跳的,然后按照特定的全局预测算法进行跳转

为了提高分支跳转的命中率,还有一个分支目标缓存BTB(Branch Target Buffer)机制。就是使用容量有限的缓存(有的实现中采用的是FIFO)保存最近执行过的分支指令的PC值及它们的跳转目标地址。对于后续需要取指的每条PC值,将其与BTB中存储的各个PC值进行比较,如果出现匹配则预测这是一条分支指令,使用对应存储的跳转目标地址作为预测的跳转地址

PHT和BTB一个根据历史记录预测,一个根据之前跳转过的PC值预测,双管齐下基本上比街边算命的还能算,配合上编译器优化至少是个半仙等级的精度,再从编译器层面引入指令其实多少也算是脱裤子放屁

不过有一说一,PHT也就能在大个CPU上用一下,这玩意太占面积,所以说对于小型的CPU(Cortex-M3这种的)使用编译器优化还是挺有必要的,可能这也是gcc还保留着__builtin_expect的原因吧


user avatar   guo-zhong-ming-26 网友的相关建议: 
      

这次舆论的重点在于警察到底是多久赶到的。

没拜码头,收保护费,打砸门面这种原因我们都知道,也不怕;

但是公权力私用或者黑白勾结这种事,就会让人非常害怕;

如果西安公权力真的黑白勾结,还睁眼说瞎话,那就需要处理整顿了。

我朝的治安也不是一直这么好的,人民也不是软弱无比的,60年代西安打的也很凶的。难不成西安各公司以后都要雇佣保安公司保护经营?

这次出警距离1公里,走路10分钟都到了,所以就坐等这次真实的出警时间是多少了。





  

相关话题

  英特尔斥资 20 亿美元收购 AI 芯片公司 Habana Labs,此举会产生哪些影响? 
  为什么总有一些人推荐计算机学生把重点放在高数和线代? 
  现在有哪些中国大陆产 CPU 和操作系统?现状如何? 
  为什么有些数学系学生会瞧不起 CS(计算机)系学生? 
  核武器和CPU哪个更难制造? 
  如何评价「编程成为英国小学生的必修课」? 
  用了几年的华为p10稍微有点卡顿,cpu是麒麟960,我希望开启强制GPU渲染解决卡顿,请问可行吗? 
  Visual Studio 是不是坑了一代人?为什么? 
  为什么大学老师教编程上课都不敲代码? 
  为什么 AI 理解不了逻辑问题? 

前一个讨论
如何能够做到将激光的波长覆盖全光谱?
下一个讨论
参考光学显微镜和电镜关系。可见光的光波衍射限制分辨率,因而用电子束。那光刻机是否也能用电子束操作呢?





© 2025-01-30 - tinynew.org. All Rights Reserved.
© 2025-01-30 - tinynew.org. 保留所有权利