0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux中提高指令缓存命中率

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者: Vincent 2023-10-04 15:45 次阅读

提高指令缓存命中率

前面说的是数据缓存,现在看看指令缓存命中率该如何提高。

有一个数组array,数组元素内容为0-255之间的随机数:

int array[N];
for (i = 0; i < TESTN; i++) 
 array[i] = rand() % 256;

现在,要把数组中数字小于128的元素置为0,并且对数组排序。

大家应该都能想到,有两种方法:

  • 先遍历数组,把小于128的元素置为0,然 后排序
  • 先对数组排序再遍历数组 ,把小于128的元素置为0。
for(i = 0; i < N; i++) {
 if (array [i] < 128) 
  array[i] = 0;
}
sort(array, array +N);

先排序后遍历的速度会比较快,为什么?

因为在for循环中会执行很多次if分支判断语句,而CPU拥有分支预测器。

如果分支预测器可以预测接下来要执行的分支(执行if还是执行else),那么就可以提前把这些指令放到缓存中,CPU执行的时候就会很快了。

如果一个数组的内容完全随机的话,那么分支预测器就很难进行正确的预测。但如果数组内容是有序的,它就会根据历史命中数据的情况对未来进行预测,那命中率就会很高,所以先排序后遍历的速度会比较快。

怎么验证指令缓存命中率的情况呢?

Linux下,可以使用Perf性能分析工具进行验证。通过-e选项,指定branch-loadsbranch-loads-misses事件,可以分别统计出分支预测成功的次数分支预测失败的次数 ,通过L1-icache-load-misses事件也能统计一级缓存中指令未命中的次数。但是,这些性能事件都属于硬件事件,perf工具能否统计这些事件取决于CPU是否支持以及芯片原厂是否去实现了该接口,我看很多都是不支持或者没实现的。

另外,在Linux内核中,可以看到大量的likelyunlikely宏,并且它们都出现if语句中,这 两个宏的作用就是为了提高性能

这是显示预测概率的宏,如果你觉得CPU的分支预测不准,但if中条件为"真"的概率很高,那么你就可以使用likely()括起来,以此提升性能。

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
if (likely(a == 1)) …
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206742
  • 指令
    +关注

    关注

    1

    文章

    580

    浏览量

    35379
  • 缓存
    +关注

    关注

    1

    文章

    220

    浏览量

    26444
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
收藏 人收藏

    评论

    相关推荐

    CPU一级缓存与二级缓存深度分析

    CPU缓存:通过优化的的读取机制,可以使CPU读取缓存命中率非常高,也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取。
    的头像 发表于 04-16 10:52 1.9w次阅读
    CPU一级<b class='flag-5'>缓存</b>与二级<b class='flag-5'>缓存</b>深度分析

    AM335x SDK关于cache的命中率,请问有能改善cache命中率的有效方法吗?请问怎么才能控制RAM映射到cache?

    ()④CP15DCacheEnable()⑤CP15DCacheCleanFlush()①~④确定能使cache无效/有效吗?⑤是否有清除cache的功能?■二:关于cache的命中率 请问有能改善cache命中率的有效方法
    发表于 06-21 04:06

    缓存命中率低的原因是什么?

    汇编中加载数据用的是LDW,5个cycle之后就会到达寄存器,并没有体现出缓存命中率的问题。LDW是固定5个cycle,请问缓存命中率低,带来的延迟体现在什么地方?难道是LDW之前,有
    发表于 05-25 08:46

    缓存的作用和设计模式

    ,高并发查询这个key,击穿缓存,直接请求数据库;缓存雪崩:缓存Key大批量到过期时间,导致数据库压力过大;命中率缓存设计的是否合理要看
    发表于 01-05 17:57

    架构设计应用级缓存回收策略

    命中率。什么是缓存命中率缓存命中率是从缓存中读取数据的次数与总读取次数的比例,
    发表于 01-14 17:08

    高速缓存Cache介绍

    存储器位置。内存交换数据的最小粒度• 缓存命中(cache hit),要访问的数据/指令已经存在缓存里• 缓存缺失(cache miss),
    发表于 09-07 08:22

    一种高能效的结构不对称指令缓存

    据不完全对应的简化标记管理位。该结构采用了命中推断和变长指令取指两种创新技术,其中基于命中推断技术解决了指令缓存
    发表于 11-22 10:52 2次下载
    一种高能效的结构不对称<b class='flag-5'>指令</b><b class='flag-5'>缓存</b>

    基于节点中心性度量的缓存机制

    为了降低内容中心网络的缓存内容冗余度和提高缓存内容命中率,提出一种基于节点中心性度量的缓存机制(CMC)。CMC利用控制器获取整个网络的拓扑
    发表于 01-17 11:00 0次下载
    基于节点中心性度量的<b class='flag-5'>缓存</b>机制

    Web代理服务器缓存优化

    Web代理服务器缓存能在一定程度上减少网络拥塞现象和用户的访问延迟,减轻服务器负载。然而Web代理缓存缓存命中率和字节命中率较低,并不能很
    发表于 03-06 10:00 0次下载
    Web代理服务器<b class='flag-5'>缓存</b>优化

    基于节点热度与缓存替换率的ICN协作缓存

    内容,考虑网络流量在不同区域和不同时间段内的差异性,周期性地计算节点热度和缓存替换率,并将其作为内容是否被缓存在节点上的度量指标。实验结果表明,相对于LCE和CLFM策略,该策略能有效降低平均请求跳数和源端命中率,获得
    发表于 03-29 15:17 1次下载

    Linux文件缓存使用情况和命中率查看的工具详细概述

    这里总结几个Linux文件缓存(page cache)使用情况、命中率查看的工具。
    的头像 发表于 06-18 17:51 8614次阅读
    <b class='flag-5'>Linux</b>文件<b class='flag-5'>缓存</b>使用情况和<b class='flag-5'>命中率</b>查看的工具详细概述

    一种基于内容优先级的缓存替换策略PFC

    ,将其作为缓存替换的参考因子进行缓存替换决策,以提高重要内容的命中率和可用性。在 ndnsim仿真平台上的测试结果表明,相比LRU和FIFO策略,PF℃策略在不影响全局
    发表于 03-24 14:48 9次下载
    一种基于内容优先级的<b class='flag-5'>缓存</b>替换策略PFC

    把进程绑定到某个 CPU 上运行是怎么实现?

    、L2缓存,而L3缓存是共用的。如果一个进程在核心间来回切换,各个核心的缓存命中率就会受到影响。相反如果进程不管如何调度,都始终可以在一个核心上执行,那么其数据的L1、L2
    的头像 发表于 07-02 09:55 2189次阅读

    一个GPU工作负载的调查

    通过减少指令缓存命中提高 GPU 性能
    的头像 发表于 07-05 16:30 511次阅读
    一个GPU工作负载的调查

    CPU缓存那些事儿

    被拜访过之后,与它相邻地址的数据有很大概率也会被拜访,将更多或许被拜访的数据存入缓存,可以进步缓存命中率
    的头像 发表于 09-10 10:57 388次阅读
    CPU<b class='flag-5'>缓存</b>那些事儿