欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

CPU多核缓存 有大用

cpu内存架构

image.png 主内存(RAM):主内存为内存条,在CPU中线程执行完,有数据写入或者修改则先到主内存中,之后再存入磁盘。
系统主线:链接系统CPU和主内存的系统主线,例如电脑主板上链接CPU和内存条的主线。
上图为简单的高速缓存配置,数据的读取和存储都经多高速缓存,CPU核心与高速缓存有一条特殊的快速通道;主存和高速缓存都连在系统总线上,这条总线还用于其他组件的通信。

高速缓存结构

高速缓存L1、L2、L3;
image.png            

缓存级别越小,越接近CPU,意味着速度越快,容量越小。
1、L1是最接近CPU的,容量最小,速度最快,每个核上都有一个L1 Cache(准确的说有两个L1 Cache, 一个用来存储数据L1 D-cache,一个用来存储指令L1 I-Cache)
2、L2 Cache容量更大一些,例如256K, 速度要慢一些,一般情况下每个核下都有一个L2 Cache;二级缓存就是一级缓存的缓冲区,一级缓存制造成本很高,因此容量有限,二级缓存的作用就是存储CPU在处理工作时用到的、一级缓存又存储不下的数据。
3、L3 Cache是三级缓存中最大的一级 例如12M,也是最慢的一级,在同一个CPU插槽之间的核共享一个L3 Cache,三级缓存可看作是二级缓存的缓存器,容量依次递增,成本依次递减。
当CPU运行时,首先获取L1 Cache中的数据,如果没有,则再去L2 Cache中找,依次类推,如果高速缓存中不存在,则去主内存中找,路径越长,时间越长,所有有一些频繁获取的数据,尽量放在一级缓存,这样速度最快。

            从CPU到                  大约需要的CPU周期    大约需要的时间(单位ns)                       
  • 1

           

寄存器    1 cycle
    L1 Cache    ~3-4 cycles ~0.5-1 ns
    L2 Cache     ~10-20 cycles    ~3-7 ns
    L3 Cache     ~40-45 cycles    ~15 ns
    跨槽传输              ~20 ns
    内存       ~120-240 cycles ~60-120ns

另外需要注意的是,L3 Cache和L1,L2 Cache有着本质的区别。,L1和L2 Cache都是每个CPU core独立拥有一个,而L3 Cache是几个Cores共享的,可以认为是一个更小但是更快的内存。

可以通过cpu-z查看或者linux通过命令查看

缓存 cache 的作用:

CPU 的频率很快,主内存跟不上 cpu 的频率,cpu 需要等待主存,浪费资源。所以 cache 的出现是解决 cpu 和内存之间的频率不匹配的问题。

缓存一致性

局部性原理:
1、时间局部性:如果某个数据被访问,则在不久的将来还会被访问
2、空间局部性:如果某个数据被访问,则在它附近的数据也可能被访问
根据CPU的局部性原理了解到,当CPU读取数据的时候,是一行一行读取的,并不是一个字节一个字节读取,缓存也是缓存一行数据,这样就会出现缓存数据一致性问题。
例如:
1、CPU1 读取了一个字节,以及它和它相邻的字节被读入 CPU1 的高速缓存。
2、CPU2 做了上面同样的工作。这样 CPU1 , CPU2 的高速缓存拥有同样的数据。
3、CPU1 修改了那个字节,被修改后,那个字节被放回 CPU1 的高速缓存行。但是该信息并没有被写入 RAM 。
4、CPU2 访问该字节,但由于 CPU1 并未将数据写入 RAM ,导致了数据不同步。
为了解决这个问题,芯片设计者制定了一个规则。当一个 CPU 修改高速缓存行中的字节时,计算机中的其它 CPU 会被通知,它们的高速缓存将视为无效。于是,在上面的情况下, CPU2 发现自己的高速缓存中数据已无效, CPU1 将立即把自己的数据写回 RAM ,然后 CPU2 重新读取该数据。 可以看出,高速缓存行在多处理器上会导致一些不利。
为了保证缓存一致性,处理器提供了缓存一致性协议(MESI)

缓存一致性(MESI):
定义了四种cache life状态:
1、M(Modefied):这行数据有效,数据被修改了,与主内存数据不一致,只存在于本cache中。缓存行必须时刻监听所有试图读取该缓存行相对于主内存的操作,这种操作必须在缓存将缓存行数据写入主内存并将状态改为Share(共享)之前被延迟执行
2、E(Exclusive):这行数据有效,数据与主内存一致,只存在于本cache中。缓存行也必须监听其他缓存读取主内存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态
3、S(Share):这行数据有效,数据与主内存一致,数据存在于很多cache中。缓存行也必须监听其他缓存是该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效
4、I(Invalid):这行数据无效

对于M和E状态而言总是精确的,他们和内存中该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能独享了该缓存行,但是该缓存行却不会将该缓存行升迁为E状态,这是因为其他缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy数量,因此也没有办法确定自己是否已经独享了该缓存行。

从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一下处于S状态的缓存行,总线事物需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务

四种状态的变更:
1、触发状态变更的事件
触发事件 描述
本地读取(Local read) 本地cache读取本地cache数据
本地写入(Local write) 本地cache写入本地cache数据
远端读取(Remote read) 其他cache读取本地cache数据
远端写入(Remote write) 其他cache写入本地cache数据

2、cache分类:
前提:所有的cache共同缓存了主内存中的某一条数据。
本地cache:指当前cpu的cache。
触发cache:触发读写事件的cache。
其他cache:指既除了以上两种之外的cache。
注意:本地的事件触发 本地cache和触发cache为相同。
3、变更详情
1626138517194806.png            


           

来自  https://blog.csdn.net/weixin_40366765/article/details/107079723            


           

普通分类: