组相联cache如何快速实现cache line eviction并使用PMU events验证

news2024/11/27 8:46:45

如何快速实现cache line eviction

  • 一,什么是cache hit、miss、linefill、evict ?
    • 1.1 如果要程序员分别制造出cache hit、miss、linefill、evict这四种场景,该怎么做?
  • 二,实现cache line eviction的方法
    • 1.1 直接填充法
    • 3.2 针对组相联cache的固定set number 填充法
  • 三,使用PMU events验证 cache line eviction
  • 四,思考:全相联和直接映射型cache 如何实现 cache eviction ?

一,什么是cache hit、miss、linefill、evict ?

cache controler 是一个管理cache 内存的硬件结构,实际上它的绝大部分行为对程序来说都是不可见的。它会自动地将代码指令或者数据从主存中搬运到cache中,响应CPU读写内存的请求,并将它们转化成对cache以及外部内存的操作:
cache controler收到CPU对某个地址进行读写的请求时,它会先检查这个地址是否存在cache中,这个动作称为cache look-up(缓存查找)。具体的的操作为:将该地址的部分bit截取下来与cache 中cache line的tag(cache line的tag包含了该cache line的地址信息)值进行比较。如果匹配成功,也称为cache hit(命中),说明CPU读写的地址已存在cache中,并且这个cache line被标记为 valid(有效),则CPU的读写操作将会使用cache 里面的内容,而不会去主存中读写。
反之,如果遍历了整个cache都没有找到能与该地址匹配的tag,或者该tag是无效的,则缓存未命中(cache miss)。这个cache miss的结果以及对该地址的读写请求会被传递给下一级内存(可能是L2、L3 cache或者主存),并且会发生 cache linefill(缓存行填充)。cache linefill是指将下一级内存中关于该被请求地址的数据拷贝到cache中,由于cache 操作的最小单位是cache line,所以一次填充一个cache line。在cache linefill的同时,被请求的数据也会发送给CPU,满足其读写请求。这个cache miss 和linefill的行为对程序员来说是不可见的,并且CPU并不用等linefill完成,才能使用该数据。假设cache line大小为64 bytes,所以一个linefill操作需要将64 bytes数据拷贝到cache当中,而CPU的读写请求可能是该cache line中的其中一个word(4 bytes),cache controler会优先访问该特定的 word,将该word送到CPU的流水线(pipeline)中,与此同时,cache硬件以及外部总线接口会将剩余的60 bytes数据读取,并填充到指定cache line中。
cache 始终是有空间限制的,如果一直miss,一直linefill,那么将cache填满了后会发生什么?eviction。为了让新的cache line数据填进cache中,cache 利用替换策略(replacement policy),在cache中选中一个cache line,并将其驱逐(evict)出去,为新的cache line数据腾出空间。被驱逐的cache line也称为victim,而被驱逐的过程,也就是写回(write back)到下一级内存(可能是L2、L3 cache或者主存)的过程。
问题随之而来:

1.1 如果要程序员分别制造出cache hit、miss、linefill、evict这四种场景,该怎么做?

首先要知道cache miss之后必然会出现cache linefill,如果cache 满了,cache linefill还会造成cache eviction。所以:

  • cache miss +linefill : 读写一个之前未曾使用过的地址,或者当cache为空的时候进行读写,即可造成miss+linefill。
  • cache hit :重复读写一个内存地址,第一遍读写会miss+linefill,但是第二遍开始就会一直hit。
  • cache evict:前面提到过,当cache 满了的时候,会将某个cache line驱逐出去,给新的cache line腾出空间。所以最简单的办法就是连续读写一段与cache容量大小的内存空间,将cache 填满。然后再读写一个新的地址时,将会发生eviction。除了这种方法,下文还会介绍针对组相联结构的cache快速制造eviction的简单方法。

二,实现cache line eviction的方法

1.1 直接填充法

在上文中我们知道,要想发生 cache line的eviction,最简单粗暴的方式就是将整个cache 填满,然后再读写一个新地址的时候,cache controler就会用replacement policy(替换策略)选择其中一个cache line,将其驱逐(也就是write back)到下一级内存中。但是将一个cahce 填满也是非常耗时的,我们可以简单计算一下:
假设当前cache 的大小为32KB,其cache line size为64 bytes,LDR/STR指令一次读写32 bit( 4 bytes)的数据。我们知道,一次读写(miss)会填充一个cache line(64 bytes),即使是每次跨一个cache line大小的空间进行读写,实际的读写次数也需要512次,如下面代码:

addr = 0x10000000
for(i=0;i<512;i++)
{
	val=*(addr);
	addr = addr+64;
}
val=*(addr+64);//eviction

3.2 针对组相联cache的固定set number 填充法

ARM一般使用组相联结构的cache,针对组相联cache,不必将整个cache填满才会发生eviction,我们可以利用cache的set 和way快速地制造eviction,具体的原理如下参考下文。
假设有一个 4 way+ 256 set的cache,cache line大小为64 bytes,很容易得出该cache的大小为64 Bytes * 256 * 4 = 64 KB,其结构如下:
在这里插入图片描述
在这里插入图片描述
可以发现,传入cache的一个内存地址会被cache 分成三部分:Tag+Index+offset。这三部分决定了该地址上的数据将会被加载到cache中的哪个cache line。

  • Tag:一个地址的高位bits可以用来当作Tag,可以告诉cache该cache line的数据来自主存的哪里。
  • Index: 地址的中间部分可以用来表示 Set的下标,也就是set的行号,不同way中index相同的cache line的集合称为set。
  • Offset:word index + byte index,一个cache line有64 bytes,而一个地址上的数据可能只有4 bytes,我们可以用该offset找到该数据位于cache line的哪个word或者byte。

当CPU 读写一个地址后,假设该地址为0xB0001234,包含该地址数据的一个cache line大小的数据将会被填充到cache中。
我们先来分析该cache line将会被放在cache 的哪个位置。
0xB0001234会被分成三部分:
在这里插入图片描述
蓝色部分为Tag信息,红色部分为Set的index,绿色部分为offset:

  • Tag = 0b1011 0000 0000 0000 00
  • Set index = 0b 100100 = 0x24 = 36
  • offset: word index = 0b 1101 = 13, byte index = 0

解析出了这些信息,我们就可以给这个cache line找个家了:

  • 位于哪个way:由于是4 way组相联的cache,所以该cache line可以位于 way0、way1、way2、way3中的任意一个way。
  • 位于哪个Set:set index为36,所以该cache line位于某个way的第36行。
  • 位于cache line的第13个word的第 0 byte
    在这里插入图片描述
    需要注意的是,该地址不是64 bytes对齐的地址,所以加载到cache line的64 bytes数据应该是从 0xB0001200开始到 0xB0001240的 64 bytes数据。
    在这里插入图片描述

我们虽然不知道该cache line位于哪个way,但是way 的个数只有四个,如果连续写入四个 set index都为36的cache line,那么写入第五个的时候会发生什么?eviction

  1. 写入第一个set index为36 的cache line,cache line 可以保存在way0,way1,way2,way3,任意一个way,姑且假设放入way2。
  2. 写入第二个set index为36 的cache line,cache line 可以保存在way0,way1,way3,任意一个way,姑且假设放入way3。
  3. 以此类推,当写入第四个set index为36 的cache line后,way0,way1,way2,way3都保存了一个set index为36且来自不同地址的cache line。
  4. 如果再写入第五个set index为36 的cache line,cache controler将会根据替换策略,在现有的四个set index为36的cache line中选择一个,将其驱逐出去,为第五个set index为36 的cache line腾出空间,也就发生了cache eviction。
    在这里插入图片描述

所以接下来我们只要找到四个set index为36,但是Tag不同的地址即可,只要保证地址的[13:6]=0b0100 100,即可保证其set index为36 ,比如:

  • 0xA0001200
  • 0xC0001200
  • 0xD0001200
  • 0xE0001200
    在这里插入图片描述
    所以CPU只需先读写这四个地址,然后再读写0xB0001234的时候,将会发生cache eviction,总共只需读写五次即可实现。

三,使用PMU events验证 cache line eviction

光是这样推测是远远不够的,我们可以利用PMU(Performance Monitors Unit)的事件监控功能,把cache 相关的事件用PMU来监控,验证是否真的发生了预期的cache 操作。具体的event 可以是:
在这里插入图片描述
在这里插入图片描述
一个eviciton 操作实际上是将旧的cache line写回到下一级缓存,然后把新的cache line 加载进来,所以可以利用PMU以下的event来监控:

  • L1D_CACHE_WB
  • L2D_CACHE_REFILL
  • L2D_CACHE
  • L1D_CACHE
  • L1D_CACHE_REFILL

四,思考:全相联和直接映射型cache 如何实现 cache eviction ?

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

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

相关文章

STM32WB55开发(1)----监测STM32WB连接状态

STM32WB55开发----1.监测STM32WB连接状态 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_App_Notification结果演示 概述 STM32WB系列…

useRef 定义的 ref 在控制台可以打印但是页面不生效?

useRef 是一个 React Hook&#xff0c;它能让你引用一个不需要渲染的值。 点击计时器 点击按钮后在控制台可以打印但是页面不生效。 useRef 返回的值在函数组件中不会自动触发重新渲染&#xff0c;所以控制台可以显示变化而按钮上无法显示 ref.current的变化。 import { use…

ConcurrentHashMap集合

什么是ConcurrentHashMap&#xff1f; ConcurrentHashMap 和HashMap一样&#xff0c;是一个存放键值对的容器。使用Hash算法来获取值的地址&#xff0c;因此时间复杂度是O(1)。查询非常快。ConcurrentHashMap 同时也是线程安全版的HashMap&#xff0c;可以实现线程安全的集合的…

文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

文献阅读&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 1. 文章简介2. 具体方法3. 实验结果 1. 数学推理 1. 实验设计2. 实验结果3. 消解实验4. 鲁棒性考察 2. 常识推理 1. 实验设计2. 实验结果 3. 符号推理 1. 实验设计2. 实验结果 4.…

融合MMEdu和Transformers技术的视障出行智能辅助系统(上海浦育AI未来夏令营结题论文)

融合MMEdu和Transformers技术的视障出行智能辅助系统 摘要 面对社会生活中众多视障者对出行的需求&#xff0c;视障出行智能辅助系统融合MMEdu和Transformers技术为视障者提供实时路况分析。本系统利用图像分类、目标检测和深度估计等软件技术&#xff0c;对摄像头实时获取的每…

MATLAB中编译器中的变量联系到Simulink

MATLAB中编译器中的变量联系到Simulink 现在编译器中创建变量&#xff0c;进行编译&#xff0c;使其生成在工作区。 然后在Simulink中国使用变量即可。

操作视频的开始与暂停

调用 ref.current.play() 方法来播放视频&#xff1b; 如果视频需要暂停&#xff0c;我们调用 ref.current.pause() 方法来暂停视频。 通过 useRef 创建的 ref 操作视频的开始与暂停 当用户点击按钮时&#xff0c;根据当前视频的状态&#xff0c;我们会开始或暂停视频&…

如何利用开源工具搭建AI大模型底座

开源社区是技术发展的一个重要部分&#xff0c;对于AI大模型来说&#xff0c;也是如此。 我们在这篇文章中来尝试通过开源工具来构建AI大模型的底座&#xff0c;涉及到的技术包括&#xff1a; LangchainOpenAIFlowiseLocalAILlama 使用Langchain构建第一个对话应用 如果你使…

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…

17.Oauth2-微服务认证

1.Oauth2 OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务&#xff0c;通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源&#xff0c;或者通过允许第三方应用程序以自己的名义获取访问权限。 为了方便理解&#xff0c;可以想象OAuth2.0就是在用…

reference based image enhancement 论文调研

Enhance Images as You Like with Unpaired Learning 这是IJCAI 2021的文章文章提出一个条件GAN模型&#xff0c;用reference image作为条件&#xff0c;可以在unpaired images上训练暗图增强模型&#xff0c;使得增强结果根据reference image来调节色调亮度和对比度。训练的监…

Redis事务为什么不支持回滚

Redis事务中过程中的错误分类两类&#xff1a; 在exec执行之前的错误&#xff0c;这种错误通常是指令错误&#xff0c;比如指令语法错误、内存不足等... --> 在开始事务后&#xff0c;传输指令时&#xff0c;遇到这种错误&#xff0c;Redis会给出Error错误提示&#xff0c;…

【多线程案例】定时器应用及实现

文章目录 1. 定时器是什么&#xff1f;2. 定时器的应用3. 自己实现定时器 1. 定时器是什么&#xff1f; 定时器就类似生活中的闹钟&#xff0c;它是软件开发中的一个重要组件。当有些线程我们并不希望它立刻执行&#xff0c;这个时候我们就可以使用定时器&#xff0c;规定线程在…

苹果iPhone15系列不再使用皮革保护壳?“FineWoven“官方认证替代

根据9月3日的报道&#xff0c;苹果即将推出的iPhone 15系列将不再使用皮革保护壳&#xff0c;取而代之的将是一种名为"FineWoven"的新材料编织工艺保护壳。 这种保护壳将有十种颜色可供选择&#xff0c;包括黑色、桑葚色、灰褐色、常绿色、太平洋蓝色、紫藤色、古白色…

Elasticsearch安装,Springboot整合Elasticsearch详细教程

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够实现近乎实时的搜索。 Elasticsearch官网https://www.elastic.co/cn/ 目录 第一步&#xff1a;下载Elasticsearch 下载7.6.2版本 下载其他版本 第二步&#xff1a;安装Elasticsearch 第三…

【Spring+SpringMVC+Mybatis】SSM框架的整合、思想、工作原理和优缺点的略微讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

Redis布隆过滤器原理

其实布隆过滤器本质上要解决的问题&#xff0c;就是防止很多没有意义的、恶意的请求穿透Redis&#xff08;因为Redis中没有数据&#xff09;直接打入到DB。它是Redis中的一个modules&#xff0c;其实可以理解为一个插件&#xff0c;用来拓展实现额外的功能。 可以简单理解布隆…

2.(Python数模)(优化模型一)线性规划问题

Python解决线性规划问题 参考了以下博文 https://blog.csdn.net/m0_46692607/article/details/126784109?spm1001.2014.3001.5506 目标是解决以下的线性规划&#xff0c;程序计算出目标函数的最大值&#xff0c;并在最大值下取得的x1x2x3对应值。 源代码如下&#xff1a; …

Android studio 实现生成二维码和扫描二维码

效果图 build.gradle(:app)添加依赖 dependencies {implementation com.google.zxing:core:3.3.3implementation com.journeyapps:zxing-android-embedded:3.6.0implementation com.google.zxing:javase:3.0.0 }Manifests.xml <uses-permission android:name"android…

SceneXplain 图片叙事升级:如何让图片听得到

‍SceneXplain 是一个由多模态 AI 驱动的产品服务&#xff0c;它不仅 提供一流的图像和视频标注解决方案&#xff0c;还具备卓越的多模态视觉问答能力&#xff0c;为用户解锁视觉内容的全新维度。 在《图像描述算法排位赛》中&#xff0c;我们探讨了图像描述&#xff08;Image …