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

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

3天内不再提示

cache背后的软思考

Linux阅码场 来源:Linux阅码场 2023-03-02 10:34 次阅读

1.前言

Cache在体系架构中占据半边山,读者又多为软件从业者、学者,个人在碰到项目瓶颈时,研读一些ARM手册,以及业内技术论文,发现cache在架构中发挥着被软件工程师低估的能力,本文从其设计角度和软件角度阐述一二;

2.Cache的设计思考

Cache的基础资料很多,多是围绕如下展开说明:cache line,组/全相连,VIVT/VIPT/PIPT等概念,一般初学者阅读后也会云里雾里,cache技术也很少被直接关注到;

所以在linux初级开发者接触cache时,脑海里会不自觉的思考:硬件行为,都是被ICer设计好的;所以他们也并没有深究cache的层次结构,也没有继续挖掘cache和驱动软件的千丝万缕的关系,脑海里想象的拓扑图,大致是这样:

5f4abe14-b813-11ed-bfe3-dac502259ad0.jpg

认为cache的设计就是cpu和memory之间单一的存在,从而忽略了那些ICer对cache的研究和优化,直接影响就是软件层面的优化,以及软件层面的疑难bug;这也是初学者进阶时的第一道阻碍;

那么在原厂工程师的脑海里,cache最基础的样子是这样的:

5f60ae90-b813-11ed-bfe3-dac502259ad0.jpg

它是现在处理器基本的形态,也是最简单的形态,在ICer们的设计上,其内在协议直接影响着指令的流转:load,store等;其内在存在的load buffer和store buffer影响着你的数据一致性,你的读写指令运行速度,数据的共享属性等等,极其简单的实例:

5f6df00a-b813-11ed-bfe3-dac502259ad0.jpg

5f7f9062-b813-11ed-bfe3-dac502259ad0.jpg

一个load执行,一个store执行,哪个快?显然prefetch最快,再深一层次思考:如果工程中,在多cpu和多thread都有数据访问需求,但是CPU和memory直接又有cache这一层大buffer,硬件和软件都做了什么,能够保证实时或访存速度?

硬件上,制定cache的各种参数时,在保证满足设计需求时,ICer们也会做这种动作:即对cache的benchmark;比如cache size和直接映射、组相连带来的收益:

5f8d1688-b813-11ed-bfe3-dac502259ad0.jpg

L2 cache的benchmark:

5f9bd696-b813-11ed-bfe3-dac502259ad0.jpg

各种参数的测试结果呈现就是市面上大家可以查到的某种处理器L1 cache,L2 cache,L3 cache,以及system cache的大小,所以在大家认为很小size的cache,ICer以及架构师们,甚至是学者,都在为其能够发挥出更佳性能,更低功耗的能力,夜以继日的做研究,做实验;

进一步思考:现在处理器设计越来越复杂,越来越强,比如NUMA,大小核等等,其呈现效果又如下简单示例:

5face80a-b813-11ed-bfe3-dac502259ad0.jpg

硬件层面带来了考验和升级,直接的影响给软件层面也带了考验,比如:你的数据一致性问题,IP驱动设计等等,ARM的内存模型又是弱一致性的,那么你设计的驱动,可能被动存在着潜在bug,所以进一步带来的是我们在工程问题上的思考。

1.Cache的工程思考

本人工作于ARM体系架构之上,所以日常在查阅arm官方公开的文档时,知道的愈多,疑问也愈多,思考的也愈多,但是借助linux这个开源社区,众多疑惑也慢慢得到解答,特此在工作之余将一小部分所得分享于大家,比如:cache的多个读写策略在影响着指令行为,直接导致数据的行为不一,如何在工程中认识它们?解决它们?

Cache的策略有如下:write-allocate,no write-allocate,read-allocate,read-through;

上述策略在驱动设计时,也是几乎被忽略的存在,其发挥的作用就是data是否被缓存在cache中,还是 pass到内存中,若两者皆存在,那么你的DMA在搬运数据前,有个动作就是sync,即刷新cache,保持数据在cache与内存中的一致性;

当然在内核驱动设计时,并不会指定使用哪个cache策略,因为kernel已经在某些接口中,潜在的做了相关操作,譬如大家用的ioremap_xxx这类接口就是和cache联系紧密;

可以思考:如果我不需要使用ioremap_xxx这类接口,还需要关注什么cache策略吗?

思考后的结果:dirty数据带来的不同步就是你解决不了问题的噩梦;

Dirty数据怎么处理?借助linux的驱动设计,可以给各位呈现出如下一个接口:

gic_flush_dcache_to_poc();

POC(Pointof Coherency):全局缓存一致性,即系统中所有可以发起内存访问的硬件单元的视角:CPU,DMA等;

所以虽然cache分为:L1 cache,L2 cache,L3cache,以及system cache,但是需要软件设计者必须知道的是:你想干什么?是刷新部分master所感测到的数据,还是所有master都要关注到的数据变化,这就是cache带来的可操作性;

即在不同cache层级的设计中,data的可观测性是不一样的,这也是为什么在我的脑海里,cache一直是多层级,多策略的,所以在驱动设计时,保证IP的视角看到的数据就是我设计的结果;

思考:如果只是CPU之间的data是可观测的,有没有什么指令作用域比POC更小的?

思考后的结果:POC视角太宽泛了,比POC作用域小的,即 POU:Pointof Unification;即处理器看到的视角,比如虚拟内存和物理内存映射的页表数据:TLB,MMU;

进一步思考:POC和POU又太大了,有没有只操作我dword数据的?

因为ARM的内存模型是弱一致性的,所以其在指令排序上有所行为,直接影响就是控制数据的乱序,内存屏障指令运势而生:dmb,dsb,isb;(PS:宋宝华老师的分享文章有详解);

该内存屏障指令宋老师有过介绍,不再赘述,需要关注的是:在使用上述指令时,也有作用域的区别;

Cache带给处理器的是极致性能,带给开发者是一个又一个的隐藏问题,所以剖析cache很有必要;

2.总结

本文因为篇幅问题,分享的是cache的冰山一角。cache又是体系架构中的一角,体系架构又是内核技术的一角,我又是众多读者的一角。

文献参考:论文《WhatEvery Programmer Should Know About Memory》。

审核编辑 :李倩

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

    关注

    134

    文章

    9091

    浏览量

    367507
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10860

    浏览量

    211722
  • Cache
    +关注

    关注

    0

    文章

    129

    浏览量

    28342

原文标题:cache背后的软思考

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    (分享设计)显示器上的思考

    ` 本帖最后由 白菜虫虫 于 2013-5-30 10:23 编辑 昨天无聊,用俩回形针弯了个思考者,晚上加了个LED,用一根旧USB数据线取电。废话少说,上图:加个动态的回复关于参数
    发表于 05-29 10:33

    为什么需要cachecache是如何影响code的呢

    是如何影响这2段code的呢?为什么需要cache思考为什么需要cache之前,我们首先先来思考另一个问题:我们的程序是如何运行起来的?我们应该知道程序是运行在 RAM之中,RAM
    发表于 04-21 11:10

    Cache中Tag电路的设计

    摘要:在SoC系统中,片上缓存(Cache)的采用是解决片上处理器和片外存储器之间速度差异的重要方法,Cache中用来存储标记位并判断Cache是否命中的Tag电路的设计将会影响到整个Cach
    发表于 05-08 09:26 11次下载

    什么是Cache/SIMD?

    什么是Cache/SIMD?   Cache :即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存
    发表于 02-04 11:29 539次阅读

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令缓存)由于系统主内存的速度较慢,当CPU读取指令的时候,会导致CPU停下来
    发表于 02-04 11:51 627次阅读

    什么是Cache

    什么是Cache  英文缩写: Cache 中文译名: 高速缓存器 分  类: IP与多媒体 解  释: 信息在本地的临时存储
    发表于 02-22 17:26 1018次阅读

    高速缓存(Cache),高速缓存(Cache)原理是什么?

    高速缓存(Cache),高速缓存(Cache)原理是什么? 高速缓存Cache是位于CPU和主存储器之间规模较小、存取速度快捷的静态存储器。Cache一般由
    发表于 03-26 10:49 6843次阅读

    cache结构与工作原理

    更详细的讲,cache的结构其实和内存的结构类似,也包含地址和内容,只是cache的内容除了存的数据(data)之外,还包含存的数据的物理内存的地址信息(tag),因为CPU发出的寻址信息都是针对
    发表于 06-03 14:24 1.2w次阅读
    <b class='flag-5'>cache</b>结构与工作原理

    什么是 Cache? Cache读写原理

    由于写入数据和读取指令分别通过 D-Cache 和 I-Cache,所以需要同步 D-Cache 和 I-Cache,即复制后需要先将 D-Cach
    发表于 12-06 09:55 2585次阅读

    CPU Cache伪共享问题

    当CPU想要访问主存中的元素时,会先查看Cache中是否存在,如果存在(称为Cache Hit),直接从Cache中获取,如果不存在(称为Cache Miss),才会从主存中获取。
    的头像 发表于 12-12 09:17 673次阅读

    深入理解Cache工作原理

    按照数据关系划分:Inclusive/exclusive Cache: 下级Cache包含上级的数据叫inclusive Cache。不包含叫exclusive Cache。举个例子,
    的头像 发表于 05-30 16:02 808次阅读
    深入理解<b class='flag-5'>Cache</b>工作原理

    Cache的原理和地址映射

    cache存储系统中,把cache和主存储器都划分成相同大小的块。 主存地址由块号B和块内地址W两部分组成,cache地址由块号b和块内地址w组成。 当CPU访问cache时,CPU
    的头像 发表于 10-31 11:21 1677次阅读

    Cache分类与替换算法

    根据不同的分类标准可以按以下3种方法对Cache进行分类。 •1)数据cache和指令cache •● 指令cache:指令预取时使用的cache
    的头像 发表于 10-31 11:26 976次阅读
    <b class='flag-5'>Cache</b>分类与替换算法

    Cache内容锁定是什么

    “锁定”在cache中的块在常规的cache替换操作中不会被替换,但当通过C7控制cache中特定的块时,比如使某特定的块无效时,这些被“锁定”在cache中的块也将受到相应的影响。
    的头像 发表于 10-31 11:31 749次阅读

    Cache写入方式原理简介

    提高高速缓存命中率的最好方法是尽量使Cache存放CPU最近一直在使用的指令与数据,当Cache装满后,可将相对长期不用的数据删除,提高Cache的使用效率。 为保持Cache中数据与
    的头像 发表于 10-31 11:43 1277次阅读