多核多cluster多系统之间缓存一致性概述

目录

  • 1.思考和质疑
  • 2.怎样去维护多核多系统缓存的一致性
    • 2.1多核缓存一致性
    • 2.2多Master之间的缓存一致性
    • 2.3`dynamIQ`架构同一个core中的L1和L2 cache
  • 3.MESI协议的介绍
  • 4.ACE维护的缓存一致性
  • 5.软件定义的缓存和替换策略
  • 6.动图示例

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,secureboot,资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。文章有感而发。

在这里插入图片描述
在这里插入图片描述

1.思考和质疑

在一个大架构大系统中,有哪些一致性需要维护?我们先看如下一张架构图。
请添加图片描述
然后请思考:

  • (1)、core0中的L1和L2 cache有一致性的要求吗?缓存和替换策略是怎样的?
  • (2)、core0 cache 和 core1 cache的一致性是谁来维护? 遵从MESI协议吗?
  • (3)、core0 cache 和 core4 cache的是怎么维护一致性的呢?
  • (4)、custer0 L3 cache 和 cluster1 L3 cache的一致性是谁来维护?遵从什么协议吗?
  • (5)、custer0 L3 cache 和 GPU的L2一致性呢?遵从什么协议?
  • (6)、custer0 L3 cache 和 其它的I/O device Master一致性呢?遵从什么协议?
  • (7)、DSU、ACE、CHI、CCI、CMN的概念?

网上的好多篇博文,一提Cache的多核一致性就必然提到MESI、MOESI ,然后就开始讲MESI、MOESI维护性原理?试问一下,您是真的不理解MESI吗?您真的需要学习MESI?你不理解的是架构吧,而不是学什么协议.
既然要学习MESI,那么这里也继续提出一些问题:

  • (1)、ARM架构中真的使用MESI了吗? 或者是哪一级cache使用了,哪一级cache没有使用?
  • (2)、MESI是一个协议? 是谁来维护的?总得有个硬件实现这个协议吧,是在ARM Core实现?DSU实现?
  • (3)、MESI的四种状态,分别记录在哪里的?
  • (4)、arm现在主流的core,到底使用的是MESI,还是MOESI?

2.怎样去维护多核多系统缓存的一致性

有三种机制可以保持一致性:

  • 禁用缓存是最简单的机制,但可能会显着降低 CPU 性能。为了获得最高性能,处理器通过管道以高频率运行,并从提供极低延迟的缓存中运行。缓存多次访问的数据可显着提高性能并降低 DRAM 访问和功耗。将数据标记为“非缓存”可能会影响性能和功耗。
  • 软件管理的一致性是数据共享问题的传统解决方案。在这里,软件(通常是设备驱动程序)必须清除或刷新缓存中的脏数据,并使旧数据无效,以便与系统中的其他处理器或主设备共享。这需要处理器周期、总线带宽和功率。
  • 硬件管理的一致性提供了一种简化软件的替代方案。使用此解决方案,任何标记为“共享”的缓存数据将始终自动更新。该共享域中的所有处理器和总线主控器看到的值完全相同。

然而,我们在ARM架构中,默认使用的却是第三种 硬件管理的一致性, 意思就是:做为一名软件工程师,我们啥也不用管了,有人帮我们干活,虽然如此,但我们还是希望理解下硬件原理。

再讲原理之前,我们先补充一个场景:
假设在某一操作系统中运行了一个线程,该线程不停着操作0x4000_0000地址处内存(所以我们当然期望,它总是命中着),由于系统调度,这一次该线程可能跑在cpu0上,下一次也许就跑在cpu1上了,再下一次也许就是cpu4上了(其实这种行为也叫做CPU migration)

或者举个这样的场景也行:
在Linux Kernel系统中,定义了一个全局性的变量,然后多个内核线程(多个CPU)都会访问该变量.

在以上的场景中,都存在一块内存(如0x4000_0000地址处内存)被不同的ARM CORE来访问,这样就会出现了该数据在main-memory、cluster cache、core cache不一致的情况, 复杂点场景可能还会考虑cluster chache和other Master(如GPU) cache的一致性情况。

既然出现了数据在内存和不同的cache中的不一致的情况,那么就需要解决这个问题(也叫维护cache一致性),那么怎么维护的呢,上面也说了“使用 硬件管理的一致性”,下面就以直接写答案的方式,告诉你硬件是怎样维护一致性的。

2.1多核缓存一致性

同一个cluster中多core之间的缓存一致性由DSU(big.LITTLE叫SCU)来维护,遵循MESI协议。
请添加图片描述

2.2多Master之间的缓存一致性

在讲述多Master之间的缓存一致性之前,我们先将Master分为以下几类:

  • ACE Master : 如 big.LITTLE cluster 或 DSU cluster
  • CHI Master : 如 big.LITTLE cluster 或 DSU cluster
  • ACE-lite Master: 如 GPU cluster
  • I/O Device Master : 如 DMA
    请添加图片描述
    以下是多Master之间的缓存一致性的结论:
  • 首先,CHI/ACE总线都是支持MESI协议数据传输的
  • Master与I/O Device Master之间没有一致性,因为I/O Device没有链接到CCI/CMN缓存互联总线上。
  • 多个ACE/CHI Master之间的缓存一致性,是否遵循MESI,要具体情况具体分析,简而言之就是:
  • (1) 如果两个Master都支持带MESI状态位,支持带有MESI信号的读写,那么这两个Master缓存一致性是遵从MESI协议的
  • (2) 如果有一个Master不支持带MESI状态位,那么这个Master就无法支持带有MESI信号的读写,那么这两个Master缓存一致性是不遵从MESI协议的
  • (3) Master的MESI状态位,是在该Master的cache的TAG中。
  • ACE/CHI Master和ACE-lite Master之间的缓存一致性,是不遵从MESI协议的。这主要是因为ACE/CHI Master无法snoop ACE-lite Master的内存,而ACE-lite Master却可以snoop ACE/CHI Master的内存,总得来说,这不是一个完整的MESI协议。

举一个最常见的例子:两个DSU cluster的L3 cache中的TAG中,是有MESI比特位的,这两个DSU通过ACE/CHI 接口发起的读写是带有MESI信号的,所以他们是支持MESI协议的。
请添加图片描述
再举一个例子,一个DSU cluster 和一个接到SMMU上的DMA,此时正好对应一个是ACE/CHI Master,一个ACE-lite Master,由于DMA/SMMU中并没有MESI状态位,他们也不会发起带有MESI信号的读写,所以这两个Master之间是不支持MESI协议的。
请添加图片描述

2.3dynamIQ架构同一个core中的L1和L2 cache

dynamIQ架构core中的L1和L2 cache不存在缓存一致性的问题,但有分配和替换策略。

我们先看一下DynamIQ架构中的cache中新增的几个概念:

  • (1) Strictly inclusive: 所有存在L1 cache中的数据,必然也存在L2 cache中
  • (2) Weakly inclusive: 当miss的时候,数据会被同时缓存到L1和L2,但在之后,L2中的数据可能会被替换
  • (3) Fully exclusive: 当miss的时候,数据只会缓存到L1

其实inclusive/exclusive属性描述的正是是 L1和L2之间的替换策略,这部分是硬件定死的,软件不可更改的。

我们再以 ARMV9 cortex-A710 为例,查看其TRM手册,得知:请添加图片描述

  • L1 I-cache和L2之间是 weakly inclusive的
  • L1 D-cache和L2之间是 strictly inclusive的
    也就是说:
  • 当发生D-cache发生miss时,数据缓存到L1 D-cache的时候,也会被缓存到L2 Cache中,当L2 Cache被替换时,L1 D-cache也会跟着被替换
  • 当发生I-cache发生miss时,数据缓存到L1 I-cache的时候,也会被缓存到L2 Cache中,当L2 Cache被替换时,L1 I- cache不会被替换
    所以总结一下就是 : L1 和 L2之间的cache的替换策略,针对I-cache和D-cache可以是不同的策略,每一个core都有每一个core的做法,这部分是硬件决定的,请查阅你使用core的TRM手册。

3.MESI协议的介绍

本协议适用于:

  • big.LITTLE架构中多核缓存一致性
  • dynamIQ架构中多核缓存一致性
  • 多cluster之间缓存一致性
    请添加图片描述
    其实也适用于:
  • 不同cluster之间多核的缓存一致性
    请添加图片描述
    然后接下来,我们开始学习MESI协议,注意着仅仅是一个协议 ,它既不是软件也不是硬件,算上一个标准吧。
    首先是Modified Exclusive Shared Invalid (MESI) 协议中定义了4个状态:
MESI StateDefinition
Modified (M)这行数据有效,数据已被修改,和内存中的数据不一致,数据只存在于该高速缓存中
Exclusive (E)这行数据有效,数据和内存中数据一致,数据只存在于该高速缓存中
Shared (S)这行数据有效,数据和内存中数据一致,多个高速缓存有这行数据的副本
Invalid (I)这行数据无效

其次,在ARM的部分的core中,定义了第五种状态Shared Modified,这种称之为MOESI 协议.
我查询大量的Core的TRM手册,信息如下:

  • 使用MESI协议的core有:A710 A510 A78 A77 A76 A75 A72 A57 A55…
  • 使用MOESI协议的core有:A7 A15 A53

发现问题了没? 并不是网上主流博客所说,arm一般都用MOESI。请记住arm主流core在使用的是MESI。所以接下来,我们也不会再介绍和学习MOESI了。
然后我们通过数据流图的方式,观看下MESI这四种状态的情况:
请添加图片描述
MESI状态之间的切换:

请添加图片描述

Events:
RH = Read Hit
RMS = Read miss, shared
RME = Read miss, exclusive
WH = Write hit
WM = Write miss
SHR = Snoop hit on read
SHI = Snoop hit on invalidate
RU = LRU replacement

Bus Transactions:
Push = Write cache line back to memory
Invalidate = Broadcast invalidate
Read = Read cache line from memory

学到这里,我们对多核之间缓存一致性也有了大概的理解,我们也知道了MESI是干啥的了,那么我们继续抛几个问题:
(1)、为什么说“多核之间的缓存一致性,遵从MESI协议,是DSU/SCU来维护”的?

其实吧,这也不是我说的,这来自ARM官方文档:

对于big.LITTLE架构,SCU是这样描述的:
请添加图片描述
对于dynamIQ架构,DSU文档中这样描述的:
请添加图片描述
(2)、MESI的状态位记录在哪里的?
ARMV9 cortex-A710 为例,记录在core cache的TAG中的BIT[1:0]中,即在TAG中。
请添加图片描述
对于big.LITTLE架构SCU的L2 cache、dynamIQ架构的DSU L3 cache中的TAG中,也都是有MESI比特位的,不过这一点在arm ARMstrm文档都是找不到的,不过在一些的PPT上是可以看到的。
请添加图片描述

4.ACE维护的缓存一致性

ACE master是接到 CCI 缓存互联总线上的, 在 CCI Interconnect中,其实也是有一个Snoop Filter单元。 ACE协议和Snoop filter单元一起来完成了ACE Master之间的缓存一致性。
请添加图片描述
snoop filter的主要作用:用于记录存储在ACE中的缓存。

Snoop Filter可以在未命中的情况下响应侦听事务,并侦听适当的主控只有在命中的情况下。Snoop Filter条目通过观察来自 ACE 主节点的事务来维护以确定何时必须分配和取消分配条目。

Snoop Filter可以响应多个一致性请求,而无需向所有master广播ACE 接口。例如,如果地址不在任何缓存中,则Snoop Filter会以未命中和将请求定向到内存。如果地址在处理器缓存中,则请求被视为命中,并且指向在其缓存中包含该地址的 ACE 端口。

以下也举了一个多cluster之间缓存一致性的示例,A53 cluster读取A57 cluster缓存一致性数据。
请添加图片描述

  • (1). Cortex-A53 cluster 发出 Coherent Read Request。
  • (2). CCI-400 将请求传递Request以窥探 Cortex-A57 cluster 缓存。
  • (3). 收到请求后,Cortex-A57 cluster会检查其数据缓存的可用性并以所需信息进行响应。
  • (4). 如果请求的数据在缓存中,CCI-400 将数据从 Cortex-A57 cluster移动到 Cortex-A53 cluster,从而导致 Cortex-A53 cluster中的缓存行填充。

5.软件定义的缓存和替换策略

以上的multi cores、multi cluster、system之间的缓存策略或协议,都是由硬件决定,软件改不了。那么我们软件可以做什么呢? 其实,在软件的MMU页表的entry中的属性位中,是可以定义该页面内存的缓存策略的。
如果软件定义了内存位non-cacheable或non-shareable,那么以上的"硬件维护的一致性"将不会生效。
接下来对,软件定义的缓存策略做了一个小小的总结。
请添加图片描述

总结了一下shareable、cacheable属性对缓存策略的影响:

-Non-cacheablewrite-backcacheablewrite-through cacheable
non-shareable数据不会缓存到cache(对于观察则而言,又相当于outer-shareable)core访问该内存时,数据只缓存的到Core的 cache 中,不会缓存到其它cache中同左侧
inner-shareable数据不会缓存到cache(对于观察则而言,又相当于outer-shareable)core访问该内存时,数据只会缓存到core的cache和 cluster的 cache中,该地址的TAG也不会存到snoop filter中,即不会被其它ACE Master snoop同左侧
outer-shareable数据不会缓存到cache(对于观察则而言,又相当于outer-shareable)core访问该内存时,数据只会缓存到core的cache和 cluster的 cache中,该地址的TAG会存到snoop filter中,会被其它ACE Master snoop同左侧

6.动图示例

前置条件:
dynamIQ架构、L1 Data weakly inclusive、读写的内存配置位outer-shareable/write-back cacheable

步骤:

  • (1)、core0 读取了一行数据,数据缓存到了core0的L1 Dcache、L2 cache
  • (2)、随后core0的L2 中的数据是有可能会被替换出
  • (3)、core1 也读取了该行数据,数据缓存到了core1的L1 Dcache、L2 cache、L3 cache
  • (4)、随后core1的L2 中的数据也是有可能会被替换出
  • (5)、core4 也读取了该行数据,数据缓存到了core4的L1 Dcache、L2 cache
  • (6)、随后core4的L2 中的数据也是有可能会被替换出
  • (7)、至此,core0的L1、core1的L1、cluster0的L3、core4的L1 中都缓存了该数据。core0的L2、core1的L2、core4的L2 可能缓存了该行数据
    请添加图片描述

推荐

  • ARMv8/ARMv9架构从入门到精通 --博客专栏
  • 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
  • 8天入门ARM架构 --入门课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02.JavaScript的运算符和语句

JavaScriptt的运算符和语句 一.运算符 算术运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经常和算术运算符一起。 算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余&#xff…

搜索组件的编写与数据的联动

src\components\SearchInput\index.vue 搜索组件编写 <template><div class"search-wrap"><input type"text":placeholder"placeholder":maxlength"maxlength":value"inputValue"input"searchData($ev…

动态代理详解(原理+代码+代码解析)

动态代理 1.什么是动态代理&#xff1f; 动态代理是一种在运行的时候动态的生成代理对象的技术。它在不改变原始类的情况下&#xff0c;对原始类的方法进行拦截或者增强。 2.动态代理可以实现的功能&#xff1f; 使用动态代理可以实现如下常用功能&#xff1a; 1.AOP&#x…

FPGA-AXI4接口协议概述

假设我们要传一帧1080P的图片到显示屏显示&#xff0c;那么需要多大的储存空间呢&#xff1f; 一帧1080P的RGB565图像数据需要1920*1080*1633.1776Mb 存储空间 下图是ZYNQ-7000系列中Block RAM的大小&#xff1a; 可以看到最大存储空间的BRAM都不能存储一帧图片&#xff0c;那…

深入理解Vue.js中的nextTick:实现异步更新的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

javascript实现解决浮点数加减乘除运算误差丢失精度问题【收藏点赞】

相信程序都会遇到这样的问题&#xff0c;有时需要在js上做运算合计等浮点数加减乘除&#xff0c;但会有些浮点数会有误差问题。下面用js来解决浮点数加减乘除运算误差丢失精度这个请 【收藏点赞】。 是程序都会在浮点数加减乘除上有误差问题&#xff0c;这是计算机二进制生成的…

GPU:使用阿里云服务器,免费部署一个开源大模型

前面提到CPU版本如何安装和部署ChatGLM&#xff0c;虽然能部署&#xff0c;但是速度和GPU比起来确实一言难尽。 然后找阿里云白嫖了一个服务器&#xff08;省点用的话&#xff0c;不用的时候关机&#xff0c;可以免费用两个多月没问题&#xff09;&#xff0c;只要没有申请过 …

计算机网络—eNSP搭建基础 IP网络

目录 1.下载eNSP 2.启动eNSP 3.建立拓扑 4.建立一条物理连接 5.进入终端系统配置界面 6.配置终端系统 7.启动终端系统设备 8.捕获接口报文 9.生成接口流量 10.观察捕获的报文 1.下载eNSP 网上有许多下载eNSP的方式&#xff0c;记得还要下其它三个Virtual Box、Winpa…

【STA】SRAM / DDR SDRAM 接口时序约束学习记录

1. SRAM接口 相比于DDR SDRAM&#xff0c;SRAM接口数据与控制信号共享同一时钟。在用户逻辑&#xff08;这里记作DUA&#xff08;Design Under Analysis&#xff09;&#xff09;将数据写到SRAM中去的写周期中&#xff0c;数据和地址从DUA传送到SRAM中&#xff0c;并都在有效时…

安卓studio安装

安卓studio安装 2024.3.11官网的版本&#xff08;有些翻墙步骤下载东西也解决了&#xff09; 这次写的略有草率&#xff0c;后面会更新布局的&#xff0c;因为截图量太大了&#xff0c;有需要的小伙伴可以试着接受一下哈哈哈哈 !(https://gitee.com/jiuzheyangbawjf/img/raw/ma…

mybatis如何打印出完整sql语句

分两步: 1. 在application.properties配置中添加配置项: mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl logging.level.mapper文件的包路径DEBUG (示例: logging.level.com.test.biztest.service.dalDEBUG, com.test.biztest.service.d…

基于SpringBoot的农产品特色供销系统(蔬菜商城)

基于SpringBoot的农产品特色供销系统&#xff08;蔬菜商城&#xff09; 系统介绍 该系统使用Java、MySQL、Redis、Spring Boot和HTML等技术作为系统的技术支撑&#xff0c;实现了以下功能模块&#xff1a; &#xff08;1&#xff09;后台管理模块&#xff0c;包括权限、日志、…

MySQL数据库在Windows和Linux中由于大小写默认规则不同,出现大小写问题如何解决?

Windows和Linux差异&#xff1a;在Windows上&#xff0c;lower_case_table_names默认为1&#xff0c;而在Linux上&#xff0c;默认值通常为0。因此&#xff0c;在Linux上更改这个设置更常见&#xff0c;以确保与Windows环境的兼容性或实现特定的大小写敏感性需求。 操作系统的大…

[Flutter]自定义等待转圈和Toast提示

1.自定义样式 2.自定义LoadingView import package:flutter/material.dart;enum LoadingStyle {onlyIndicator, // 仅一个转圈等待roundedRectangle, // 添加一个圆角矩形当背景maskingOperation, // 添加一个背景蒙层&#xff0c; 阻止用户操作 }class LoadingView {static f…

【数据结构与算法】贪心算法题解(一)

这里写目录标题 一、455. 分发饼干二、56. 合并区间三、53. 最大子数组和 一、455. 分发饼干 简单 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这…

Visual Studio 2019重装vs2019打不开.netcore项目

无法打开项目文件。 .NET SDK 的版本 7.0.306 至少需要 MSBuild 的 17.4.0 版本。当前可用的 MSBuild 版本为 16.11.2.50704。请将在 global.json 中指定的 .NET SDK 更改为需要当前可用的 MSBuild 版本的旧版本。 无法打开项目文件。 .NET SDK 的版本 7.0.306 至少需要 MSBui…

【JAVA】Collections.sort()方法详解

一、简介 Collections.sort() 是 Java 集合框架&#xff08;Java Collections Framework&#xff09;中的一个静态方法&#xff0c;用于对列表&#xff08;List&#xff09;中的元素进行排序。此方法利用了 Java 的泛型机制&#xff0c;可以很方便地对各种类型的列表进行排序。…

使用gin框架,编写一个接收数据的api接口

功能&#xff1a;这里主要编写一个接口&#xff0c;将其json 数据存入对应的redis队列中&#xff0c;并统计每天的每小时请求数量 环境&#xff1a; go version go1.22.0 linux/amd64 平台 linux X64 步骤一 新建目录 命令如下&#xff1a; mkdir FormData 步骤二 新增…

当金蝶遇上BI,马上就能看到数据可视化效果

最近整理咨询内容时发现&#xff0c;很多企业用户在咨询时都会问是否有行业案例&#xff0c;究其原因时他们没用过BI数据分析&#xff0c;不知道BI可以做什么&#xff0c;能做到什么地步。其实&#xff0c;要知道这些东西还不简单&#xff0c;只需要注册奥威BI软件&#xff0c;…

CleanMyMac X 4.14.1中文版功能介绍及激活入口

细心的用户发现苹果Mac电脑越用越慢&#xff0c;其实这种情况是正常的&#xff0c;mac电脑用久了会产生很多的缓存文件&#xff0c;如果不及时清理会影响运行速度。macbook就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的…