应对分支预测有哪些优化措施
下面再来看一下分支预测,这也是 ChatGPT 给出的一个简易答案
// 不利于流水线的循环结构
for (int i = 0; i < N; ++i) {
if (condition) {
// 循环体
}
}
// 更有利于流水线的循环结构
if (condition) {
for (int i = 0; i < N; ++i) {
// 循环体
}
}
上面的案例就是说明,我们应该在循还外进行条件判断,这样即便是预测失败概率 10%,也只有 10%的回滚情况,但是如果放到循环体内部,那么这个 10%的回滚操作将被执行 N 次。
除了把判断语句从循环体中挪出来,还有一些小的技巧供大家参考一下。
合并条件,尽可能减少分支预测失败时对效率的影响
优化前:
if(case1)
{
if( case2 )
{
do();
}
}
优化后:
if( case1 && case2 )
{
do();
}
优化前:
if( case1 == 0 && case2 == 0 && case3 == 0 )
{
do();
}
优化后:
if( ( case1 | case2 | case3 ) == 0 )
{
do();
}
跳转避免分支预测
将if else
改写成switch
形式(switch
使用的指针 list 进行跳转的指令,直接跳转到对应分支)。这样就相当于将多个函数使用函数指针的形式存储到数组中,然后通过 case 查表,直接进行调用。
直接运算,避免判断
先说明一些基本位运算知识:
|x| > > 31 = 0 // 非负数右移31为一定为0
~(|x| > > 31) = -1 // 0取反为-1
-|x| > > 31 = -1 // 负数右移31为一定为0xffff = -1
~(-|x| > > 31) = 0 // -1取反为0
-1 = 0xffff
-1 & x = x // 以-1为mask和任何数求与,值不变
如对于
if(value < 0 ) value = 0
可改成
value &= ~(value > > 31 )
再比如:
if (data[c] >= 128)
{
sum += data[c];
}
可以优化为:
int t = (data[c] - 128) 31; // 非负数右移 31 为 0,负数右移则为 -1
sum += ~t & data[c]; // 这里利用 0 和 -1,正好等同于条件,大于 128 忽略,小于 128
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
处理器
+关注
关注
68文章
19286浏览量
229823 -
mcu
+关注
关注
146文章
17148浏览量
351193 -
预测
+关注
关注
0文章
37浏览量
12356
发布评论请先 登录
相关推荐
CPU分支预测对程序的影响
分支预测的英文名字是“Branch Prediction”,如果大家在Google上搜索这个关键字,可以看到关于分支预测的很多内容。不过,要搞清楚分
发表于 09-23 14:11
•1128次阅读
嵌入式处理器动态分支预测机制研究与设计
嵌入式处理器动态分支预测机制研究与设计针对嵌入式处理器的特定应用环境,通过对传统神经网络算法的改进,结合定制的分支目标缓冲,提出一种复合式动态分支预
发表于 10-06 09:53
如何应对欧盟玩具安全新指令的措施
欧盟玩具安全新指令的措施实施后,相关企业应何应对呢?北测检测作为第三方权威检测机构,建议相关企业积极应对欧盟玩具安全新指令的措施,尽量做到以下几点: 1.加快了解国际玩具标准体系。玩
发表于 01-18 11:22
优化技巧:提前if判断帮助CPU分支预测
摘要: 在stackoverflow上有一个非常有名的问题:为什么处理有序数组要比非有序数组快?,可见分支预测对代码运行效率有非常大的影响。要提高代码执行效率,一个重要的原则就是尽量避免CPU把
发表于 06-13 16:27
ADC输出杂散的成因是什么?有哪些优化措施?
Giga ADC 是 TI 推出的采样率大于 1GHz 的数据转换产品系列,主要应用于微波通信、卫星通信以及仪器仪表。本文介绍了 Giga ADC 的主要架构以及 ADC 输出杂散的成因分析,以及优化性能的主要措施。
发表于 04-07 06:23
安腾处理器中多级分支预测机制
分支预测威廉希尔官方网站
可消除分支指令之后损失的周期,防止流水线断流。高比率的分支预测精确度是高性能微处理器性能的保证。本文详细分析了安腾处理器(Ita
发表于 08-21 12:11
•12次下载
CPU中什么是分支预测
什么是分支预测 在超标量的流水线架构上,我们得知,CPU 在运行指令的时候,会在一个时钟上做多个操作,也就是涉及到调用前后相关的指令,比如我们在一个简单的判断语句中。 if (n > 0 ) { n
评论