一文深入分析arm64 cache机制

news2024/12/26 22:58:53

说明:

  1. Kernel版本:4.14
  2. ARM64处理器,Contex-A53,双核
  3. 使用工具:Source Insight 3.5, Visio

1. 概述

先来看一下经典的存储器层次结构图:

  • 不同存储器技术的访问时间差异很大,CPU和主存的速度差距在增大,如果直接从主存进行数据的load/store,CPU的大部分时间将会处在等待的状态;
  • cache的作用就是来解决CPU与主存的速度不匹配问题;

以ARMv8的CPU架构为例:

  • ARMv架构的CPU通常包含两级或多级cache;
  • L1 cache为Core所独享的,通常包含Instruction cache和Data cache;
  • L2 cache为同一个Cluster中的多个Core进行共享;
  • L3 cache通常实现为外部的硬件模块,可以在Cluster之间进行共享,或者与其他IP进行共享;

接下来让我们对cache一探究竟。

  资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

2. cache

2.1 cache结构

先看一下cache的内部结构图:

  • cache line:cache按行来组织,它是访问cache的最小单位,通常为16、32、64或128字节,cache line的大小通常在架构设计阶段确定;
  • 64-bit address:CPU访问cache的地址编码,分成三部分:Tag、Index、Offset;
  • Index:地址编码中的index域,用于索引cache line;
  • Offset:地址编码中的offset域,cache line中的偏移量,可按word和byte来寻址;
  • Tag:Tag在cache中占用实际的物理空间,用于存储缓存地址的高位部分,通过与地址编码中的Tag域进行比较来确定是否cache hit;
  • Way:cache分成大小相同的子块,每个子块以相同的方式进行索引;
  • Set:所有Way中相同的索引对应的cache line组成的集合;

2.2 cache映射

2.2.1 direct mapped

直接映射的方式如下:

  • 图中的示例cache只有四个缓存行,内存中index域相同的地址,都会映射到cache中的同一行上;
  • 图中所示,0x00,0x40,0x80三个地址会映射到cache的第一行,而同一时刻只能允许1行;
  • 如果有程序访问区域覆盖了这三个地址,可能造成cache line的频繁换入换出,从而导致cache thrashing(颠簸)问题;
  • 优点是硬件设计简单,成本低,缺点是cache颠簸造成性能问题;

2.2.2 set associative

组相连的映射方式如下:

  • 组相联方式在现代处理器中得到广泛的使用;
  • 图中示例有两路cache,因此每组有两个缓存行;
  • 每个内存地址在映射时,有两个缓存行可以选择,替换出去的概率降低了,这也就有效的降低了cache颠簸;
  • 优点是减少了cache颠簸,缺点是成本和复杂度增大;

2.2.3 fully associative

全相连的映射方式如下:

  • 内存地址不需要index域,全相连缓存相当是N路集中的所有缓存行,因此需要大量的比较器;
  • 优点是最大程度降低cache颠簸,缺点依然是复杂度和成本问题;

2.3 cache策略

  • Read allocation(RA) 当读操作cache miss时默认进行分配cache line;
  • Write allocation(WA) 当写操作cache miss时,会触发一个burst读,通过读的方式来分配cache line,然后再将数据写入cache;
  • Write-back(WB) WB方式下,数据只写入cache,并标记为dirty,当cache line被换出或者显式的clean操作才会更新到外部内存中,如下图:

2.3 cache策略

  • Read allocation(RA) 当读操作cache miss时默认进行分配cache line;
  • Write allocation(WA) 当写操作cache miss时,会触发一个burst读,通过读的方式来分配cache line,然后再将数据写入cache;
  • Write-back(WB) WB方式下,数据只写入cache,并标记为dirty,当cache line被换出或者显式的clean操作才会更新到外部内存中,如下图:

  • Write-through(WT) WT方式下,数据同时写入cache和外部内存,不会将cache line标记为dirty,如下图:

2.4 cache分类

先来看看cache中的重名(aliasing)问题和同名(homonyms)问题:

  • aliasing:多个不同的虚拟地址可能映射到相同的物理地址;
  • 引入的问题包括:1)浪费cache的空间,造成性能下降;2)写操作时可能造成cache数据更新不一致,造成物理地址在cache中维护多个不同的数据;

  • homonyms:相同的虚拟地址映射到不同的物理地址;
  • 引入的问题:比如进程切换时,上一个进程的相同虚拟地址在cache中的数据,对于本进程无用,需要额外的invalidate操作;

2.4.1VIVT(Virtually-Indexed Virtually-Tagged)

  • VIVT:处理器使用虚拟地址来进行cache的寻址操作,使用虚拟地址的Tag域和Index域进行判断是否hit;
  • 导致cache重名问题(Index域导致)与同名问题(Tag域导致),当改变虚拟地址到物理地址映射时,需要flush和invalidate操作,导致性能下降;

2.4.2PIPT(Physically-Indexed Physically-Tagged)

  • PIPT:处理器使用物理地址进行cache的寻址操作,使用物理地址的Tag域和Index域进行判断是否hit;
  • 处理器在查询cache时,需要先查询MMU/TLB后才能访问,增加了pipeline的时间;
  • 能有效避免重名和同名问题,但是硬件的设计复杂度和成本更高;

2.4.3VIPT(Virtually-Indexed Physically-Tagged)

  • VIPT:使用虚拟地址的Index域和物理地址的Tag域进行判断是否cache hit;
  • 使用物理地址的Tag域(物理Tag唯一),能有效的避免同名问题;
  • VIPT也可能存在重名问题,以Linux为例,Linux内核以4KB的页面大小进行管理,虚拟地址和物理地址的[11:0]是相同的,重名问题下多个虚拟地址的[11:0]是一样的。当index索引域在[11:0]之内时,不会发生重名问题,因为该范围属于一个页面内;

3. mesi

先来看问题的引入:

  • 图中的cluster,不同CPU core的cache和DDR中可能维护了同一个数据的多个副本;
  • 维护cache的一致性,需要跟踪cache行的状态,ARM采用MESI协议(snooping protocol)来维护cache的一致性;
MESI协议的名字来源于cache line的四个状态:
  • Modified(M):cache line数据有效,cache line数据被修改,与内存中的数据不一致,修改的数据只存在本cache中;
  • Exclusive(E):cache line数据有效,cache line数据和内存中一致,数据只存在本cache中;
  • Shared(S):cache line数据有效,cache line数据和内存中一致,数据存在于多个cache中;
  • Invalid(I):cache line数据无效;

状态说明如下:

  1. M和E状态,数据都是本地独有的,不同点在于M状态的数据是脏的,而E状态的数据是干净的,M状态的cache line写回内存后,状态变成了S;
  2. S状态的cache line,数据和其他cache共享,只有干净的数据才能被多个cache共享;

MESI协议在总线上的操作分为两大类:CPU请求和总线请求,如下图:

MESI协议中涉及到各个状态的转换:

  1. 本地CPU操作,状态转换如下图:

  • 操作为本地CPU读写
  1. 总线监听到其他CPU的操作请求,状态转换如下图:

  • 操作类型为总线读写,来自其他CPU的请求,或者DMA的操作等;

当多个cpu访问同一个cache line中的不同数据时,根据MESI协议,容易造成cache的伪共享问题,解决方式是让多线程操作的数据处在不同的cache line中。

 

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

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

相关文章

2023年深圳前端培训机构排名,评价较高的机构分享

深圳前端培训机构排行榜的前三名是哪家呢?不少学生在选择学习前端开发的时候,都会通过网络来找一些相关的排行,评判哪家机构的教学比较好,今天小编就来针对这类相关的培训为大家分享一些内容,帮助大家选择更适合自己的…

RabbitMQ面试知识点总结

1.消息模式 P2P Worker Pub/Sub(exchange 4种) 四种交换机:direct/topic/headers/fanout,默认交换机是direct,其中Publish/Subscribe,Routing,Topics三种模式可以统一归为Exchange模式,只是创建时交换机的…

【LeetCode每日一题】【2023/2/1】2325. 解密消息

文章目录2325. 解密消息方法1:哈希表2325. 解密消息 LeetCode: 2325. 解密消息 简单\color{#00AF9B}{简单}简单 给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第…

SpringBoot 监控统计(SQL监控、慢SQL记录、Spring监控、去广告)

1 基本概念Druid 是Java语言中最好的数据库连接池。虽然 HikariCP 的速度稍快,但是,Druid能够提供强大的监控和扩展功能 ,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面&…

算法---冗余连接

题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edge…

蓝桥杯2022 python C组

蓝桥杯2022 python C组 跟之前的就四题不一样 第二题:特殊时间 就是i 从0-9,j从0-9 i是三个一样的,然后看看他们能不能成为 年 月日 时分 成为年只要大于0就好了,称为月日的话月要从1-12,日呢,特殊的日子…

Kylin入门实战(数据源添加 + Model定义 + Cube构建 + 结果查询 + 查询限制)

目录1. 入门实战目的2. Hive源数据准备3. 创建project并添加Hive数据源4. 定义model5. 定义Cube6. 构建cube7. 查询cube构建后的结果8. 查询限制1. 入门实战目的 实现从不同的维度统计员工的工资,例如从岗位类型、员工年龄、部门等不同维度,进行多维度的…

【LeetCode每日一题】【2023/1/30】1669. 合并两个链表

文章目录1669. 合并两个链表方法1:模拟1669. 合并两个链表 LeetCode: 1669. 合并两个链表 中等\color{#FFB800}{中等}中等 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0…

亚信科技通信、交通行业数据库项目入选“星河”标杆、优秀案例

近日,由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的第六届大数据“星河”案例评选结果公示,亚信科技及旗下亚信安慧支持完成的中国移动通信集团上海有限公司“业务支撑系统核心数据库…

Day 17 springboot 监听机制

1 Java 监听机制springboot监听机制,其实是对java提供的事件监听机制的封装。Java中的事件监听机制定义了以下几个角色:事件:Event,继承EventObject类,例如点击,拖动等等。事件源:Source&#x…

Python 正确重写运算符(重载)

运算符重载的作用是让用户定义的对象使用中缀运算符(如和|)和一元运算符(如-和~)。在Python中,这些也算是运算符:函数调用:()属性访问:.元素访问和切片:[]运算符重载基础…

RabbitMQ消息转换器

文章目录RabbitMQ消息转换器RabbitMQ消息转换器 在SpringAMQP的发送方法中,发送消息和接受消息的类型都是Object,也就是说,我们可以发送任意对象类型的消息,SpringAMQP都会帮我们把发送的消息序列化为字节后再进行发送。下面&…

剑指 Offer 第 16 天 把数组排成最小的数 扑克牌中的顺子

目录 面试题45. 把数组排成最小的数 面试题61. 扑克牌中的顺子 面试题45. 把数组排成最小的数 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输…

会声会影2023最新版v25.3.0.0视频剪辑软件

各位新年好呀,2022年的经历让我们更加成长,我们也终于迎来了新的一年。在这里,COCO玛奇朵先祝大家新年快乐,万事如意! 会声会影是一款操作简单易学的视频剪辑软件,会声会影的编辑步骤是流程化的&#xff0…

lamp的简单搭建 小白笔记

笔记是观看哔哩哔哩视频所写。链接如下:经典LAMP架构-跟着老王学Linux_哔哩哔哩_bilibili笔记有多处不妥之处,本是自己写笔记加深印象,仅供参考。所用linux系统是CentOS7。注意:该笔记操作后的网站仅主机内的局域网可以访问&#…

【数学建模】常用算法-线性回归Python实现

1 前言 本文主要讲解基于线性回归的糖尿病预测的python实现,后续会进行进一步的更新 2 代码实现 2.1 数据准备 导入相关的包 import numpy as np import pandas as pd加载数据集 这个数据集是sklearn.datasets自带的糖尿病数据集(diabetes&#xff…

I.MX6ULL内核开发2:内核模块实验2

目录 一、模块参数 二、符号共享 三、模块自动卸载 四、关于Makefile的说明 一、模块参数 根据不同应用场合给内核模块传递不同的参数,提高内核模块灵活性 定义一个常见变量使用module_param宏把传参值赋给变量module_param(name,type,perm) name: 参数名type…

uniapp弹幕

效果图 barrage.vue <template><view class"l-barrage"><block v-for"(item,index) in items" :key"index"><view v-if"item.display" class"aon" :style"{top: ${item.top}rpx}"><…

数据库丨记录一次TiDB v5.2.3迁移到v6.1.0的实操过程

文章目录前言一、环境简介二、迁移前提条件三、迁移方案四、迁移过程总结前言 TiDB 是一款结合了传统的关系型数据库和 NoSQL 数据库特性的新型分布式数据库。是第一个把数据分布在全球范围内的系统&#xff0c;并且支持外部一致性的分布式事务。 TiDB 具备强一致性和高可用性…

Struts2之注解

Struts2之注解1、引入依赖2、注解结构3、注解的使用1、引入依赖 Struts2中可以使用注解来代表struts.xml中的某些配置&#xff0c;可以简化配置。要使用注解&#xff0c;必须引入额外的依赖&#xff0c;如下&#xff1a; <!-- struts2注解依赖 --><dependency><…