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

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

3天内不再提示

CPU缓存一致性原理

sakobpqhz6 来源:平凡人笔记 2023-03-15 09:09 次阅读

cpu速度和内存速度比值,目前比值是100:1的关系,一个做计算的,一个做存储,相互之间怎么比速度?

这个速度是指:cpu内部的ALU计算单元访问内部的寄存器,如果耗时是1个纳秒,计算单元通过数据总线去访问内存需要100纳秒,这个速度是指访问某个寄存器的速度并不是计算的速度,ALU访问寄存器的速度比访问内存的速度快100倍。

为什么ALU访问寄存器的速度快,因为ALU和寄存器离的近。

内存中有一个数组,访问数组中第一个元素数据需要100纳秒,访问第二个数据100纳秒,所以cpu至少有99个时间单元都得等着从内存中返回数据给ALU使用。

为了充分利用cpu的速度,一般往往在中间设计缓存的存在,cpu访问缓存的速度比访问内存的速度要快。

访问数组中第一个数据的时候,把整个数组放到缓存中来,下次cpu访问的时候从缓存中访问。

不要内存完全可以,但工业上需要考虑一个性价比,数据都放在寄存器中太贵了,8个G的内存400块钱,8个G的寄存器40万,寄存器稍微贵一点点的、容量稍微小一点的还可以承受,比如8个G的内存,1个G的寄存器。

不是所有的数据都放在寄存器中,在这里有专门的算法LRU(Least Recently Used 淘汰最近未使用的)或LFU(least frequently used淘汰不经常使用的),这个算法决定着什么样的数据挪过来,什么样的数据挪出去。

缓存是均衡的设计,在省钱和读取、写入的效率之间均衡。加了一层缓存之后,发现cpu到这个缓存之间的速度还是慢很多,再加一层,

c747b632-c2ab-11ed-bfe3-dac502259ad0.png

三级缓存是工业实现中的一个妥协,也许不久的将来,cpu的速度超级快,可能需要四层缓存或内存的速度快很多,也许就一层缓存,目前的工业实践,多采用三级缓存的结构。

线程和cpu之间的关系密不可分,一颗cpu在同一个时间只能执行一个线程,cpu的计算也代表着线程的计算。

多核CPU

c79f6bfc-c2ab-11ed-bfe3-dac502259ad0.png

这是一颗cpu,在cpu内部往往有多个核存在,每一个核都有自己的ALU、寄存器、程序计数器,一级缓存和二级缓存都在这个核里,三级缓存是多个核共享。

ALU的计算单元需要把读到的数据放到寄存器,寄存器会去寻找想要的数据,首先去一级缓存找,没有的话,再去二级缓存找,还没有的话,再去三级缓存找,三级缓存把数据传给二级缓存,二级缓存把数据传给一级缓存,一级缓存把数据传给寄存器,下一次再访问数据的时候直接去一级缓存中拿。

超线程

c7b92c2c-c2ab-11ed-bfe3-dac502259ad0.png

虽然只有一个计算单元ALU,但是有2套存储单元、2套寄存器、2套程序计数器,一个核可以装2个线程的数据进来,计算单元轮着计算,2个线程就不需要来回切换了,即一个核2个线程,2个核4个线程,4个核8个线程。

c7e2a89a-c2ab-11ed-bfe3-dac502259ad0.png

需要访问内存中某个数组中的第一个元素数据,先在一级缓存找,再找二级、三级,都没有的话,去内存中找,内存中找到之后,返回给三级缓存、二级缓存、一级缓存,最后再给到寄存器, ALU做计算的时候就可以直接访问寄存器获取数据了。

站在计算单元的角度,访问数组中第一个元素数据很可能会访问第二个元素数据,如果第二个元素数据也没有,同样的方式又得来一遍,那这样的话还不如直接从内存读呢!

缓存行

当要访问一个数据的时候,干脆每一次缓存一小块的数据,这一小块数据里面包含了整个数组的数据,当访问数组中的任意元素数据的时候,就可以直接从缓存中读取到了,这一块的数据被称为缓存行。

这个理论被称为程序的局部性原理,而局部性原理分为空间局部性和时间局部性。

根据大多数工业证明,在访问局部数据的时候,会很快的访问相邻的数据,这就是空间局部性。

时间局部性是执行完这条指令之后,很可能执行和它挨着的下一条指令,如果指令也看做是一份二进制0101数据的话,也可以一次性的把很多指令读取过来。

缓存行数据是大了好还是小了好?

如果这一行数据特别大,一次性可以放好多数据过来,好处就是访问的时候命中率会更高,但是每读一块数据过来效率会很低;数据小的话,读起来速度会很快但命中率会较低。

目前计算机多采用64个字节(64*8bit)为一缓存行数据。

缓存行对齐,伪共享

c814d73e-c2ab-11ed-bfe3-dac502259ad0.png

创建一个数组,里面存放了2个T类对象元素,T类中有一个long类型的x字段,long类型长度是8个bytes。

2个线程,意味着有2颗cpu在同时运行,第一个线程玩命的修改数组中的第一个元素t1,改了10亿次,第二个线程玩命的修改数组中的第二个元素t2,也改了10亿次,总共耗时700多毫秒。

对T类做了修改,c8455e40-c2ab-11ed-bfe3-dac502259ad0.png

因为一个缓存行大小为64字节,所以在属性x前面加了7个属性(7*8字节=56个字节),加上x共64个字节,x后面也加了56个字节,正好将一个x值,放在一个缓存行里,计算结果耗时240多毫秒,数据越多执行效率反而越高了。在介绍原理之前,先介绍下缓存一致性协议,

缓存一致性协议

c85c31a6-c2ab-11ed-bfe3-dac502259ad0.png

假设有2个数据x、y位于同一缓存行,在第一个计算单元(cpu或线程)里面只使用了x,第二个线程里面只使用了y,虽然在内存中是同一份数据,但是到缓存之后,是2份拷贝数据,每一个用到它的cpu都会有它的一份拷贝存在,一个cpu对这份数据做了修改之后,另外cpu也需要同步到最新的数据。

有了缓存的概念,必须要保证缓存的数据一致性即缓存一致性协议,每种cpu厂商都有自己完全不同的缓存一致性协议,常见的是MESI(因特尔的缓存一致性协议),这是缓存一致性协议的一种实现。

cpu每个缓存行标记有4种状态:Modified(被修改),Exclusive(独占)、Shared(共享)、Invalid(无效)。

一个cpu将一个缓存行中的数据修改了,需要一种机制:通知使用该缓存行的其他cpu数据已失效,需要重新再读取一遍,获取最新修改的数据。

有些无法被缓存的数据,比如一份的数据超过了64个字节,则需要使用总线锁。

再回到上面的那个问题,为什么数据越多执行效率反而越高了?

一个long类型的x是8个字节,这2个x位于同一个缓存行的概率极大(尤其这2个x位于同一个数组,在内存中是挨着的),2个cpu分别修改一个x,2个x在一方cpu都有缓存,修改了其中一个需要通知另外一个,每改一次通知一下,总之在修改的时候需要触发一种机制需要另外的cpu跟我保持一致,如果这样的话,耗时当然会比较长。

在x前后加56个字节,无论怎么刷新缓存,这个x都不会和另外一个x位于同一缓存行,这意味着这个cpu修改了第一个x的时候,是不需要通知任何其他cpu的,第二个cpu修改第二个x的时候,也是不需要通知第一个cpu的,速度一定会很快。

jdk 7写的LinkedBlockQueue也是这种写法或者获得杜克奖的开源软件Disruptor中的环形队列也是这种写法,

c887fd7c-c2ab-11ed-bfe3-dac502259ad0.png

Disruptor(环形队列)号称是最快的单机mq;实现链表一般需要2个指针,一个是头指针,一个是尾指针,而这个环形队列,只要有一个指针就可以了,

c8c2bbce-c2ab-11ed-bfe3-dac502259ad0.png

指针指向这个位置就往这存,指向下个位置就往下一个位置存,什么时候存满了,就等着最开始存的那个被消费走,消费走了继续往这里存,一个指针来回转,速度非常快。

由于有多个生产者和多个消费者,在多线程的情况下这个环形的指针就会被多个线程读到自己的缓存里,

c8cfa438-c2ab-11ed-bfe3-dac502259ad0.png

第一个属性是起始值,后面是7个无业务含义的数据,其存在的目的是可以保证p1属性往后组合的时候不会和别的p1属性位于同一个缓存行。

但是说不准会往前面组合呢即为什么没有前面的7个呢?也是有的,在父类的父类中定义的,

c9885bd6-c2ab-11ed-bfe3-dac502259ad0.png

c9abe312-c2ab-11ed-bfe3-dac502259ad0.png

数组中前连续的2个元素是2个RingBuffer对象,一个对象所占用的字节57+8+56,所以可以确保一个缓存行中只有一个元素,那么在多线程的情况下对不同元素的修改不会互相通知,互相影响。

以上便是cpu级别的并发控制之缓存一致性的描述。

审核编辑:汤梓红

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

    关注

    31

    文章

    5266

    浏览量

    119582
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10759

    浏览量

    210283
  • 存储
    +关注

    关注

    13

    文章

    4164

    浏览量

    85459
  • 缓存
    +关注

    关注

    1

    文章

    224

    浏览量

    26610
  • 线程
    +关注

    关注

    0

    文章

    502

    浏览量

    19602

原文标题:CPU缓存一致性原理

文章出处:【微信号:IC学习,微信公众号:IC学习】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何解决数据库与缓存一致性

    缓存一致性 每次逢年过节的时候抢票非常艰难,放票的时候那么多人同时去抢票,如果所有人查询、购票等都去访问数据库,那数据库的压力得有多大,这时候很多都会引入缓存, 把车票信息放入缓存,这
    的头像 发表于 09-25 15:25 968次阅读
    如何解决数据库与<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    #硬声创作季 【JMM底层】CPU缓存一致性协议剖析

    JAVA缓存编程语言
    Mr_haohao
    发布于 :2022年09月14日 06:59:51

    小编科普CPU缓存一致性协议MESI

    什么是缓存一致性协议MESI?MESI协议中的状态有哪几种?MESI协议中的状态是如何相互转换的?
    发表于 06-17 10:00

    一致性规划研究

    针对一致性规划的高度求解复杂度,分析主流一致性规划器的求解策略,给出影响一致性规划器性能的主要因素:启发信息的有效,信念状态表示方法的紧凑
    发表于 04-06 08:43 12次下载

    加速器一致性接口

    提供异步缓存一致性直接访问PS的入口。处理器可以标记ACP上的传输为一致性或非一致性。PL端的AXI主机通过ARUSERS[1:0]指示是否为一致性
    发表于 11-17 15:04 3517次阅读

    Cache一致性协议优化研究

    问题的由来.总结了多核时代高速缓存一致性协议设计的关键问题,综述了近年来学术界对一致性的研究.从程序访存行为模式、目录组织结构、一致性粒度、一致性
    发表于 12-30 15:04 0次下载
    Cache<b class='flag-5'>一致性</b>协议优化研究

    自主驾驶系统将使用缓存一致性互连IP和非一致性互连IP

    代ASIL B(D)自主驾驶系统将使用符合ISO 26262标准的缓存一致性互连IP和非一致性互连IP来实现。 美国加利福尼亚州坎贝尔2019年4月26日消息—Arteris IP
    的头像 发表于 05-09 17:13 3139次阅读

    管理基于Cortex®-M7的MCU的高速缓存一致性

    本文档概述了不同场景下的高速缓存一致性问题,并就如何管理或避免高速缓存一致性问题提供了些方法建议。
    发表于 04-01 10:12 5次下载
    管理基于Cortex®-M7的MCU的高速<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    CPU缓存一致性协议MESI详解

    CPU在摩尔定律的指导下以每18个月翻番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决
    的头像 发表于 05-12 17:36 4265次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>协议MESI详解

    CPU缓存一致性协议MESI介绍

    CPU在摩尔定律的指导下以每18个月翻番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。
    的头像 发表于 06-09 10:39 845次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>协议MESI介绍

    介绍下cpu缓存一致性(MESI协议)

    之前介绍了java并发包的cas原理和java内存模型,这篇我们介绍下cpu缓存一致性原理,可以帮助我们更好的理解cas的底层原理。
    的头像 发表于 06-09 16:01 4422次阅读
    介绍下<b class='flag-5'>cpu</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>(MESI协议)

    CPU缓存一致性协议解析

    CPU运行效率高不高,定程度取决于缓存,这里就给大家分享CPU缓存相关的内容。
    的头像 发表于 07-12 10:07 713次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>协议解析

    管理基于Cortex-M7的MCU的高速缓存一致性

    电子发烧友网站提供《管理基于Cortex-M7的MCU的高速缓存一致性.pdf》资料免费下载
    发表于 09-25 10:11 0次下载
    管理基于Cortex-M7的MCU的高速<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    如何保证缓存一致性

    “ 本文的参考文章是2022年HOT 34上Intel Rob Blakenship关于CXL缓存一致性篇介绍。”
    的头像 发表于 10-19 17:42 938次阅读
    如何保证<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    Redis缓存与Mysql如何保证一致性

    基本流程就是客户端A请求,先去删除缓存,然后将数据写入数据库,此时客户端B查询先去查询缓存缓存没有返回,去查数据库,此时还没有完成主从同步,拿到是从库的旧数据,然后将旧数据进行缓存
    的头像 发表于 12-02 14:23 848次阅读
    Redis<b class='flag-5'>缓存</b>与Mysql如何保证<b class='flag-5'>一致性</b>?