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

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

3天内不再提示

如何保证缓存一致性

SDNLAB 来源:IT奶爸 2023-10-19 17:42 次阅读

“ 本文的参考文章是2022年HOT 34上Intel Rob Blakenship关于CXL缓存一致性的一篇介绍。”

冯诺依曼说,数据应该存在这里,这里变成了存储器;

冯诺依曼说,数据应该在这里被计算,这里变成了CPU

冯诺依曼没有说,CPU太快而存储太慢。CPU没有办法只能把一部分数据留在身边,慢慢地就成了各级缓存。每个CPU都留了一部分数据在身边,就得维护这些数据和内存的一致性。

(有时间可以再聊聊拜占庭将军问题和共识机制,又要分布式的好,还有集中式的一致性,有点类似。)

1缓存/caching

缓存就是临时把数据存在靠近数据要消费的地方。

放数据的地方有不同的级别,不同级别的延时和带宽都不一样,因此就会有预取。更详细的硬件预取器的文章可以参考以下几篇拙作。

预取就是在数据真正需求之前把数据取回来。既然可以预取就说明数据具有两个性质:

空间局部性:一般来说需求的数据在之前的数据附近

时间局部性:一般来说需求的数据总是之前用过的

636609d8-60f4-11ee-939d-92fbcf53809c.png

现代CPU一般都会有多级的缓存,并且他们都可以保持缓存一致。

L1:空间最小,延时最低,带宽最高

L3:空间更大,延时更高,带宽较低,并且支持多个数据需求来源

637e295a-60f4-11ee-939d-92fbcf53809c.png

那么如何保证缓存一致性呢?

首先需要在更新缓存之前,确保使得其他人拥有的该缓存无效。

这可以通过软件的手段,也可以通过硬件的手段。CXL使用硬件一致性。

CXL和CPU的缓存一致性协议相同,都是基于以下几个状态:

Modified:该数据只被缓存到一个cache中,可读可写,但是还没有更新到内存中;

Exclusive:该数据只被缓存到一个cache中,可读可写,数据与内存同步;

Shared:该数据被缓存到多个cache中,可读,数据与内存同步;

Invalid:该数据没有被缓存;

2缓存的家 Home

内存以64Byte为单位分好,这一份就是一个cacheline。

系统通过物理地址把这些单位都安排好,然后交给Home Agent来管理,有且仅有一个。

也就是说一个cacheline,只有一个家,例如在两路系统中,要么是CPU0,要么是CPU1。

比如说,你要读一个cacheline,你会首先在本地的cache里找,如果没有的话,你就会去找它的家。也就是Home Agent会去问其他的CPU是不是有这个缓存。

如果你要写一个cacheline,你也需要找它的家,获取写权限,然后让Home Agent告诉其他的CPU放弃该cacheline,当然在放弃之前,需要把最新的数据回写给Home Agent。

Home Agent怎么问其他CPU,或者修改cacheline的状态呢?这个就是Snoop消息。

3CXL 缓存协议

为支持设备访问系统主存,cxl.cache有15个读写操作指令。

CXL3.0开始,每一个端口可以最多支持16个缓存设备,而在此之前,只能支持一个。

在CPU和CXL设备之间,有两个通讯方向,一个是H2D,一个是D2H。

顾名思义,host和device 的两个方向。而每个方向分成三个通道/channel,分别为请求,响应和数据通道。

63ac2328-60f4-11ee-939d-92fbcf53809c.png

4举个栗子

Device首先发一个RdShared:Read Cacheline Share State。设备获取了某个cacheline并且获得S-state,然后host返回Go-S。表示Home Agent同意了这个请求,并且该设备的cacheline变成了Shared state。

看看就好,不能动手。

63d0e0f0-60f4-11ee-939d-92fbcf53809c.png

这里的peer cache可以是各种邻居:

CXL的邻居设备;

本CPU中的cache;

远端CPU中的cache;

而这里的内存控制器也可以是各种内存:

本CPU的传统DDR

远端CPU的传统DDR;

邻居CXL设备上的CXL.mem;

63f0fc0a-60f4-11ee-939d-92fbcf53809c.png

CXL的15个request,就不再一一解释,露个脸:

Reads: RdShared, RdCurr, RdOwn, RdAny

Read-0: RdownNoData, CLFlush, CacheFlushed

Writes: DirtyEvict, CleanEvict, CleanEvictNoData

Streaming Writes: ItoMWr, WrCur, WOWrInv, WrInv(F)

5内存池化和共享

池化内存和CXL switch是CXL增加的内容,这使得从host到内存的专属分配成为共享内存的一种方式。

CXL3增加了多个host共享内存的支持,利用HDM-DB。

6416081a-60f4-11ee-939d-92fbcf53809c.png

先写到这里,缓存一致性的具体流程不再详细解释,细心一点的朋友可以多找几个例子,按照图示和步骤对照一下。

审核编辑:汤梓红

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

    关注

    38

    文章

    7528

    浏览量

    164320
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10901

    浏览量

    212930
  • 内存
    +关注

    关注

    8

    文章

    3052

    浏览量

    74299
  • 缓存
    +关注

    关注

    1

    文章

    241

    浏览量

    26750

原文标题:感谢CXL同志为维护缓存一致性做出的努力

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

收藏 人收藏

    评论

    相关推荐

    介绍ARM存储一致性模型的相关知识

    今天要说的这个是存储一致性(memory consistency),不要跟前面讲过缓存一致性(cache coherence)混淆了。
    的头像 发表于 02-14 09:19 1962次阅读

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

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

    CPU Cache是如何保证缓存一致性的?

    我们介绍`CPU Cache`的组织架构及其进行**读操作**时的寻址方式,但是缓存不仅仅只有读操作,还有 **写操作** ,这会带来个新的问题
    的头像 发表于 12-04 15:05 1715次阅读
    CPU Cache是如何<b class='flag-5'>保证</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>的?

    i.MX8M可以调用哪些刷新/无效缓存函数来保证缓存一致性

    的是,我们现在在较小的传输中遇到缓存问题。有时,当缓冲区被复制到用户空间时,64 字节的数据没有被正确的数据 buf 填充为 0xff。我们在次传输中传输了大约 1.1 MBytes,有时
    发表于 04-27 08:30

    一致性规划研究

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

    加速器一致性接口

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

    Cache一致性协议优化研究

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

    你了解过Linux内核中的内存屏障?

    之前直认为linux中很多东西是用来保证缓存一致性的,其实不是。缓存一致性绝大部分是靠硬件机制
    发表于 05-10 14:20 543次阅读

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

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

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

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

    Redis缓存更新一致性的方式

    当执行写操作后,需要保证缓存读取到的数据与数据库中持久化的数据是一致的,因此需要对缓存进行更新。
    的头像 发表于 11-21 10:40 797次阅读

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

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

    管理基于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>

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

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

    异构计算下缓存一致性的重要

    在众多回复中,李博杰同学的回答被认为质量最高。他首先将缓存一致性分为两个主要场景:是主机内CPU与设备间的一致性;二是跨主机的一致性
    的头像 发表于 10-24 17:00 767次阅读
    异构计算下<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>