三八资料网

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

三八资料网 门户首页 电子技术 查看内容

教你编写对高速缓存Cache友好的代码

2019-6-6 08:37| 发布者: 小管家| 查看: 161| 评论: 0

摘要: 本系列文章的第二篇原想命名为《STM32F7 Cache 介绍与实战》,其中会讲解一些在 STM32F7 上如何使用 Cache 的内容,但是后来发现已经有相当多的文章介绍如何配置 MPU 与 Cache 了,而这些文章我认为已经很优秀了。因 ...
6666666666


此时我们假设 array 数组在内存中是块对齐的存放的,int 类型的所占内存大小为 1 个字,高速缓存块的大小为 4 个字,也就是 4 个 int 类型的大小 ,而 Cache 的初始状态为空。此时,无论是怎样的 Cache 结构,对 array 的引用都会的到下面的命中和不命中模式,我们用  h 表示命中,用 m 来表示不命中:

在这个例子中,对于 array[0] 的引用会不命中,而相应的包含 array[0] ~ array[3] 的块会被从内存加载到高速缓存中。因此,接下来对 array[1] ~ array[3] 的引用都会命中

接下来对 array[4] 的引用会导致不命中,而一个新的块被加载到高速缓存中,接下来 array[5] ~ array[7]  这三个引用都命中,以此类推。这种情况下,四个引用中,三个会命中,在缓存初始化为空的情况下,这是能遇到的最好的情况了。

总的来说,上面的例子说明了两个关于编写高速缓存友好的代码的重要问题:

1、对局部变量的反复引用是优秀的,因为编译器能够将他们缓存在寄存器中(时间局部性)。

2、步长为 1 的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块(空间局部性)。


对多维数组进行操作的程序中,空间局部性尤为重要,可以想象如果我们一列一列地扫描多维数组,且数组要比高速缓存要大,那么有可能每次对数组中元素的访问都会不命中!在这种情况下,Cache 在加快程序运行方面的作用就几乎为 0 了,编写出来程序的运行速度可能会相差几十倍!

总之,作为优秀的软件工程师,我们应当注意程序中的局部性,试着编写利用局部性的程序。

在下一篇中,我们将深入地研究 Cache 的一致性问题,通过对 Cache 一致性问题的研究,我们将会理解在使用 Cache 的过程中遇到的各种问题,并有能力来解决它。


4、附录


1、安富莱 V7 用户手册:

https://pan.baidu.com/s/1gfGIUoNlosJeP9OOWTVkAQ,提取密码: u2ef

2、在上述手册中的第 23、24 章详细介绍了 MPU 以及 Cache 的配置,有兴趣的小伙伴可以下载阅读。

近期活动


RT-Thread线上活动


1、【西安站】物联网操作系统RT-Thread基础入门免费培训全天2019年6月22日 9:30 ~ 2019年6月22日 17:00,培训全程将以【理论+动手】方式进行,通过拆解一个DEMO实例,带你从内核到组件到软件包全面了解RT-Thread的体系框架。


扫码报名


2、6.17 深圳 SiFive&RT-Thread趣味开发竞赛,高含金量赛题助你挖掘自身潜能,,参与即得丰厚礼品,还能现场邂逅开发大牛获得指导


扫我参赛


#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的星

哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread


12

路过

雷人

握手

鲜花

鸡蛋

最新评论

  • 一种绕制微型变压器的方法
  • 自制修电磁炉的好工具机内假负载
  • 十个家电维修技巧一定要看
  • 真诚求助!!!
  • 电脑开机进不了系统
  • 小米65寸电视背光黑屏故障的维修
  • 资料分享
  • 三菱变频器A540电路图(包含电源,驱动 保
  • 户户通电源板应急修复的方法
  • 洗衣机上盖门轴断裂的修复,修制冷有焊炬的
门户最新文章

QQ|门户地图|手机版|小黑屋|家电维修论坛 ( 蜀ICP备14030498号 )

GMT+8, 2024-5-9 00:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部