【ARM Cache 系列文章 11.2 -- ARM Cache 组相联映射】

embedded/2024/10/22 14:26:56/


请阅读【ARM Cache 系列文章专栏导读】


文章目录

    • Cache 组相联映射
      • 组相联映射原理
      • 多路组相连缓存的优势
      • 多路组相连缓存的代价
      • 关联度(Associativity)

上篇文章:【ARM Cache 系列文章 11.1 – ARM Cache 全相连 详细介绍】

Cache 组相联映射

ARM核心的主要缓存总是使用一组多路组相连缓存实现的。这显著降低了与直接映射缓存相比出现的缓存抖动(Cache Thrashing)的可能性,从而提高了程序执行速度并使执行更加具有确定性。这种缓存组织方式以增加硬件复杂性和因每个周期比较多个标签而略增加功耗为代价。

直接映射和全相联映射其实很好理解, 直接映射是找车方便,全相联映射是停车方便。而组相联映射正是直接映射和全相联映射的组合解决方案。如下图所示,为一个组相联映射的停车场示意图。组相联映射有setway的概念,我们先简单理解为set就是行,way就是列。

组相联映射的停车规则如下:
在这里插入图片描述
当2号车停在了set2+way1的位置,102号车按照规则必须停在set2,所以102号车可以停在way0、way2和way3中的任意位置。
在这里插入图片描述

不同于直接映射的停车场,同一个set中甚至可以把所有way都填满,才会发生驱逐现象。如下图所示,72号车会根据替换策略,随机选择一个way,将这个way上的车子驱逐出去,然后停进来。
在这里插入图片描述
当要找车时,2号车的车主,根据直接映射规则直接去set2里找,虽然他不知道车子在哪个way中,但是即使是最坏的情况,车主也只需比较4次(停车场的列数)即可发现自己的2号车在不在当前停车场(hit 或者miss)。
在这里插入图片描述

组相联映射原理

如下图所示,为一个组相联cache的结构,其中有三个概念需要理解:

  • way: 组相联cache 将cache分成几个大小相等的几片,每一片称为一个way,下图为一个 4-way的cache。
  • index:cache 的index其实就是cache line的行号。
  • set:index相同的cache line的集合称为一个set。比如way0、way1、way2和way3中index等于0的cache line称为set0。
  • 在这里插入图片描述
    上文组相联映射停车场示例中提到过,组相联映射实际上是直接映射与全相联映射的组合实现。也需要将一个地址分成如下三部分,其中地址的 index部分就是该地址在cache中所在的set 号。主存中index相同的地址将映射到同一个set(直接映射),但是一个set内有多个位于不同way的cache line,地址上的数据可以放入任意一个way中的cache line(全相联映射)。
    在这里插入图片描述
    如下图所示为一个2 way的cache结构。假设主存中地址 0x000x400x80的index都为0,按照组相联映射规则,0x000x400x80上的数据必须要存放在set0,但是可以在way0和way1中任意选择:
    在这里插入图片描述

多路组相连缓存的优势

  1. 降低缓存抖动:通过允许每个内存位置可以映射到多个位置而非单一位置,多路组相连缓存降低了多个热点数据争用同一缓存行的几率。
  2. 提高程序执行速度:减少缓存未命中的几率意味着处理器可以更快地访问数据和指令,从而加快了程序的执行速度。
  3. 更确定性的执行:缓存的行为更加可预测,有助于实现更加一致的性能,特别是在实时系统中非常重要。

多路组相连缓存的代价

  1. 硬件复杂性增加:实现多路组相连缓存需要更复杂的硬件逻辑来管理多个“路”的数据和标签的比较。
  2. 功耗略增:由于每个访问周期都需要比较多个标签,这增加了功耗。

关联度(Associativity)

  • 关联度指的是缓存中每个集合包含的行数。关联度高意味着每个内存地址有更多的缓存行可以映射到,从而降低冲突和提高缓存命中率。
  • L1、L2和L3缓存的关联度可能不同,通常更高层级的缓存(如L3)具有更高的关联度以优化性能和容量。

提高缓存的关联度可以降低抖动(Thrashing)的概率。理想情况下是全相连(Fully Associative)缓存,任何主存储器(Main Memory)位置都可以映射到缓存中的任何位置。然而,除了非常小的缓存之外(例如,与MMU的TLBs(Translation Lookaside Buffers)相关联的缓存),构建这样的缓存在实践中是不切实际的。

在实践中,当关联度超过8路时,性能提升是最小的,而16路关联度对于更大的L2缓存来说更加有用。这意味着,虽然增加缓存的关联度确实可以提高缓存效率和减少冲突的可能性,但关联度的增加并不总是带来线性的性能提升。达到一定的关联度后,继续增加关联度所带来的性能提升将变得较小,同时硬件成本、复杂性和功耗可能会显著增加。


http://www.ppmy.cn/embedded/30638.html

相关文章

【QA】Java集合的常见遍历方式

前言 本文主要讲述Java集合常见的遍历方式。 通用遍历方式 | Collection集合 迭代器Iterator遍历 Collection<Student> c new ArrayList<>();c.add(new Student("张三", 23)); c.add(new Student("李四", 24)); c.add(new Student("…

【Java笔记】CAS比较的是什么+交换的是什么+自旋到啥时候

文章目录 什么是CASCAS原理CAS的原子性CAS的三个问题问题一&#xff1a;ABA解决方法 问题二&#xff1a;CPU开销过大解决方法 问题三&#xff1a;不能保证代码块的原子性解决方法 Reference 之前看CAS一致迷迷糊糊的&#xff0c;知道它通过自旋来避免多线程冲突&#xff0c;然后…

MATLAB 微积分

MATLAB 微积分 MATLAB提供了多种方法来解决微分和积分问题&#xff0c;求解任意程度的微分方程式以及计算极限。最重要的是&#xff0c;您可以轻松求解复杂函数的图&#xff0c;并通过求解原始函数及其导数来检查图上的最大值&#xff0c;最小值和其他文具点。 本章将讨论微…

前端工程化05-初始前端工程化Node基本介绍安装配置基础知识

6、初始前端工程化 6.1、工程化概述 虽然前几篇我的目录标题写的前端工程化&#xff0c;但是那些东西并不属于前端工程化的内容&#xff0c;更倾向于是js、jq当中的东西&#xff0c;下面我们将接触真正的前端工程化。 前端工程化开发其实现在是离不开一个东西的&#xff0c;…

rust将json字符串直接转为map对象或者hashmap对象

有些时候我们还真的不清楚返回的json数据里面到底有哪些数据&#xff0c;数据类型是什么等&#xff0c;这个时候就可以使用批处理的方式将json字符串转为一个对象&#xff0c;然后通过这个对象的get方法来获取json里面的数据。 pub async fn test_json(&self) {let json_st…

QT-构造函数

类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 构造成员变量的初始化值&#xff0c;内存空间等 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用于为某些成员变量设置…

React Context

Context https://juejin.cn/post/7244838033454727227?searchId202404012120436CD549D66BBD6C542177 context 提供了一个无需为每层组件手动添加 props, 就能在组件树间进行数据传递的方法 React 中数据通过 props 属性自上而下(由父及子)进行传递&#xff0c;但此种用法对…

如何搭建本地的 NPM 私有仓库 Nexus

NPM 本地私有仓库&#xff0c;是在本地搭建NPM私有仓库&#xff0c;对公司级别的组件库进行管理。在日常开发中&#xff0c;经常会遇到抽象公共组件的场景&#xff0c;在项目内部进行公用。新的项目开始时&#xff0c;也会拷贝一份创建一个新的项目&#xff0c;这样做不易于管理…