【ARM Cache 系列文章 2 -- Cache Coherence及内存顺序模学习】

文章目录

    • Cache Coherence 背景
    • 1.1 内存顺序模型简介(Memory Model)
      • 1.1.1 Normal Memory
      • 1.1.2 Device Memory
    • 1.2 Cache 一致性问题解决方案
      • 1.2.1 Shareability 属性
      • 1.2.2 Non-Shareable 属性
      • 1.2.3 Inner-Shareable 属性
      • 1.2.4 Out-Shareable 属性
    • 1.3 Shareability 和 PoC/PoU 关系
      • 1.3.1 PoU(处理器缓存一致性角度度)
      • 1.3.2 PoC(全局缓存一致性角)

上篇文章:ARM Cache 系列文章 1 – Cache基础概念学习
下篇文章:ARM Cache 系列文章 3 – Cache 与 MPU关系学习

Cache Coherence 背景

所谓的 Cache 一致性问题, 主要指的是由于 Cache 存在时,当在有多个 Master(典型的如 MCU 的 Core, DMA 、PCIE、I2C2APB 等)访问同一块内存时, 由于数据会缓存在 Cache 中而没有更新实际的物理内存,导致的问题。在了解缓存一致性前需要先了解内存顺序模型。

1.1 内存顺序模型简介(Memory Model)

arm memory 类型分为 normal memory 和 device memory。
内存顺序模型更详细内容

1.1.1 Normal Memory

Normal memory就是我们平常所说的内存,对该种memory访问时无副作用(side effect),即第n次访问与第n+1次访问没有任何差别。

1.1.2 Device Memory

device memory 是外设对应的物理地址空间,对该部分memory访问时,可能存在副作用(side effect),比如:

  • 某些状态寄存器可能 read clear;
  • 某些寄存器有写入顺序(否则写入不成功);
  • 设备fifo地址固定不变,但是每次访问,内部的移位寄存器就会将下一个数据移出来[1],因此访问同一地址第n次访问与第n+1 次访问结果是不同的。

1.2 Cache 一致性问题解决方案

一.所有的共享存储器都定义为共享属性(Shareability),共享意味着需要硬件保证一个内存位置中的内容对一定范围内可访问该位置的多个处理器是一致。
二.通过软件进行cache的维护, 如使用 cache invalidate 和 cache clean进行维护。

1.2.1 Shareability 属性

Shareability 的由来为了支持数据一致性协议,需要增加硬件很多开销,会降低系统的性能,同时也会增加系统的功耗。但是,很多时候并不需要系统中的所有模块之间都保持数据一致性,而只需要在系统中的某些模块之间保证数据一致性就行了。因此,需要对系统中的所有模块,根据数据一致性的要求,做出更细粒度的划分。

1.2.2 Non-Shareable 属性

配置为 non-shareable 属性的内存位置一般只能被唯一处理器访问, 如果还有其他处理器能访问该位置,需要软件用缓存一致性指令来保证缓存一致性。

比如:在单核的场景下,cpu 往某一块配置为non-shareable (同时配置了cacheable)属性的内存写一段数据,由于这段内存只对cpu可见,所以如果当使用DMA来搬运这块内存中的数据时,需要先进行 cache clean 将缓存中的数据刷入memory中,否者dma搬运的数据可能会有一些stale data。

1.2.3 Inner-Shareable 属性

该内存位置可以被 Inner Shareability domain 中的所有处理器访问,并且硬件保证该位置在这些处理器间的数据一致性,Inner Shareability domain中的处理器一般被同一个虚拟机监视器或操作系统控制,如下图中的两个 cluseter 都在 inner shareability domain中。一般不同的cluseter会共享L2 cache。
在这里插入图片描述

1.2.4 Out-Shareable 属性

能被外部共享的观察者(cpu, gpu, dma) 观察到,它适用于内部可共享和外部可共享域。一个outer shareable domain 可以由一个或多个 inner shareable domain组成,并且当一个操作影响到outer shareable domain时,也会影响到其下所有的 inner shareable domain。

note: 只有配置为 Normal Memory 内存属性的内存才能设置 inner 和 outer shareability,device memory 是不能设置 Shareability。

1.3 Shareability 和 PoC/PoU 关系

1.3.1 PoU(处理器缓存一致性角度度)

是指对于某一个核Master,附属于它的指令,数据缓存和 TLB,如果在某一点上,它们能看到一致的内容,那么这个点就是PoU。如下图右侧,MasterB包含了指令,数据缓存和TLB,还有二级缓存。指令,数据缓存和TLB的数据交换都建立在二级缓存,此时二级缓存就成了PoU。

而对于下图左侧的MasterA,由于没有二级缓存,指令,数据缓存和TLB的数据交换都建立在内存上,所以内存成了PoU。

还有一种情况,就是指令缓存可以去监听数据缓存,此时,不需要二级缓存也能保持数据一致,那一级数据缓存就变成了PoU。

1.3.2 PoC(全局缓存一致性角)

是指 对于系统中所有Master(注意是所有的,而不是某个核),如果存在某个点,它们的指令,数据缓存和TLB能看到同一个源,那么这个点就是PoC。如下图右侧,二级缓存此时不能作为PoC,因为MasterB在它的范围之外,直接访问内存。所以此时内存是PoC。在左图,由于只有一个Master,所以内存是PoC。
在这里插入图片描述

简而言之,PoU/PoC定义了指令和命令的所能抵达的缓存或内存,在到达了指定地点后,Inner/Outer Shareable定义了它们被广播的范围。

上篇文章:ARM Cache 系列文章 1 – Cache基础概念学习
下篇文章:ARM Cache 系列文章 3 – Cache 与 MPU 关系学习

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

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

相关文章

【干货防踩坑/全图文分步/Gitlab镜像仓库自动同步】Gitlab CE/EE镜像仓库的配置技巧(含ssh/密码两验证方法)

【干货踩坑】Gitlab CE/EE镜像仓库的配置技巧(含ssh/密码两验证方法) 众所周知,Gitlab是个好东西。为什么呢?GitHub没有的功能,他全有了。更何况还可以私有部署。这两天自己部署了Gitlab,然后想把自己的项…

2. Spring 的创建和使用

目录 1. 创建 Spring 项目 1.1 创建一个 maven 项目 1.2 添加 Spring 框架支持 1.3 添加启动类 2. 存储 Bean 对象 2.1 创建 Bean 2.2 将 Bean 注册到容器 3. 获取并使用 Bean 对象 3.1 创建 Spring 上下文 ApplicationContext 和 BeanFactory 的区别(重点…

django项目入门

django中view.py是什么 在Django中,view.py是一个Python模块,用于处理HTTP请求并返回HTTP响应。它包含了Django应用程序的视图函数,视图函数接收HTTP请求作为参数,并根据请求的内容执行相应的逻辑处理。视图函数可以从数据库中获…

gitignore修改不生效

.gitignore中已经标明忽略的文件目录下的文件,当我想git push的时候还会出现在push的目录中,原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明…

Jenkins Pipeline的hasProperty函数

函数的作用 用于判断某个参数或者字段是否存在。 用法 例子一 def projectStr "P1,P2,P3" pipeline {agent anyparameters {extendedChoice(defaultValue: "${projectStr}",description: 选择要发布的项目,multiSelectDelimiter: ,,name: SELECT_PROJ…

学习Java,需要知道的网站30+网站,你知道哪些?

以下是 30 个 Java 学习网站,并详细介绍: Java 官方文档:https://docs.oracle.com/javase/8/docs/api/ Java 官方文档是 Java 学习者必备的参考资料,提供了 Java 核心库的详细说明和示例代码,包括类、接口、方法和属性…

分布式锁:Redis、Zookeeper

1.基于Redis实现分布式锁 Redis分布式锁原理如上图所示,当有多个Set命令发送到Redis时,Redis会串行处理,最终只有一个Set命令执行成功,从而只有一个线程加锁成功 2.SetNx命令加锁 利用Redis的setNx命令在Redis数据库…

TensorFlow 进阶:定制模型和训练算法

本文将为你提供关于 TensorFlow 的中级知识,你将学习如何通过子类化构建自定义的神经网络层,以及如何自定义训练算法。 一、创建自定义层 在 TensorFlow 中,神经网络的每一层都是一个类,我们可以通过创建一个新的类并继承 tf.ke…

Vision Transformer (ViT)

生成式模型与判别式模型 生成式模型,又称概率模型,是指通过学习数据的分布来建立模型P(y|x),然后利用该模型来生成新的数据。生成式模型的典型代表是朴素贝叶斯模型,该模型通过学习数据的分布来建立概率模型,然后利用…

【个人笔记】Linux命令之查看使用过的命令

1.使用 history 显示出所有使用过的命令 history2.使用 history 和 grep 命令进行过滤 history | grep docker3.查看 ~/.bash_history 文件,Bash的命令历史默认保存在~/.bash_history中 vim ~/.bash_history #或 cat -n ~/.bash_history4.使用 ctrlr …

【人工智能】深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化

深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化) 文章目录 深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化)深度神经网络训练训练深度神经网络参数共享卷积神经网络(CNN)卷积多卷积核卷积全连接最大池化卷积+池化拉平向量激活函数优化小结深度神经…

如何在Debian中配置代理服务器?

开始搭建代理服务器 首先我参考如下文章进行搭建代理服务器,步骤每一个命令都执行过报了各种错,找了博客 目前尚未开始,我已经知道我的路很长,很难走呀,加油,go!go!go! …

MySQL数据库关于表的一系列操作

MySQL中的数据类型 varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100) char 定长字符串(最长255位),存储空间是固定的,例如&#…

Nginx | Nginx返回的状态码详情

200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 201 (已创建) 请求成功并且服务器创建了新的资源。 202 (已接受) 服务器已接受请求,但尚未处理。 203 &…

博客更新notion版本01

官网视频娇嗔 Your connected workspace for wiki, docs & projects | Notion 【Notion教程】:https://www.bilibili.com/video/[BV1so4y1V7nX](https://www.bilibili.com/video/BV1so4y1V7nX/?spm_id_from333.788.video.desc.click) 【Notion汉化】&#x…

系统架构设计师-软件架构设计(4)

目录 一、软件架构评估 1、敏感点 2、权衡点 3、风险点 4、非风险点 5、架构评估方法 5.1 基于调查问卷或检查表的方式 5.2 基于度量的方式 5.3 基于场景的方式 6、基于场景的评估方法 6.1 软件架构分析法(SAAM) 6.2 架构权衡分析法(ATAM&am…

J2EE通用分页02

目录 一.重构-提取公用方法 1.为了进行公共方法的抽取,需要找出上面实习中的可通用部分,和差异化部分 2.公用方法封装思路 3. 具体实现 二.分页标签 2.1 准备一个Servlet 3.2 结果展示页面 三. 过滤器解决中文乱码问题 四.加入分页功能 四…

Visio制作特征矩阵

Visio制作特征矩阵 https://blog.csdn.net/sinat_39620217/article/details/115577962?ops_request_misc&request_id&biz_id102&utm_termvisio%E6%9C%89%E7%BD%91%E6%A0%BC%E5%90%97&utm_mediumdistribute.pc_search_result.none-task-blog-2allsobaiduweb~de…

Yolov8引入 清华 ICCV 2023 最新开源移动端网络架构 RepViT | RepViTBlock即插即用,助力检测

💡💡💡本文独家原创改进:轻量级 ViT 的高效架构选择,逐步增强标准轻量级 CNN(特别是 MobileNetV3)的移动友好性。 最终产生了一个新的纯轻量级 CNN 系列,即 RepViT RepViTBlock即插即用,助力检测 | 亲测在多个数据集能够实现涨点,并实现轻量化 💡💡💡Yo…

Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用

Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用 1. 什么是StandaloneInputModule组件? StandaloneInputModule是Unity UGUI系统中的一个标准输入模块组件,用于处理鼠标和键盘的输入事件。它可以将鼠标和键盘的输入转化为UGUI系统中…