gem5学习(23):经典缓存——Classic Caches

2024-02-18 22:52

本文主要是介绍gem5学习(23):经典缓存——Classic Caches,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、Interconnects

1、Crossbars

二、Debugging


默认缓存是一个带有MSHR(未命中状态保持寄存器)和WB(写缓冲区)的非阻塞缓存,用于读取和写入未命中。缓存还可以启用预取(通常在最后一级缓存中)。

在gem5中实现了多种可能的替换策略和索引策略。这些策略分别定义了给定地址可以用于块替换的可能块,以及如何使用地址信息来找到块的位置。默认情况下,缓存行使用LRU(最近最少使用)进行替换,并使用集合关联策略进行索引。

一、Interconnects

1、Crossbars

crossbar中的两种流量类型是内存映射数据包(memory-mapped packets)和嗅探数据包(snooping packets)。内存映射请求沿着内存层次结构向下传递,而响应沿着内存层次结构向上传递(相同的路径返回)。嗅探请求水平传递并向上传递到缓存层次结构,嗅探响应水平传递并向下传递(相同的路径返回)。普通的嗅探请求水平传递,而快速嗅探(express snoops)向上传递到缓存层次结构。

二、Debugging

在经典内存系统中,有一个功能可以在调试器(例如gdb)中显示特定块的一致性状态。这个功能是建立在经典内存系统对功能访问的支持之上的。你可以通过注入一个命令设置为PrintReq的功能请求来使用这个功能。该请求会穿过内存系统,类似于常规的功能请求,但对于匹配的任何对象(如其他排队的数据包、缓存块等),它只会简单地打印出有关该对象的一些信息。

在Port(端口)上有一个名为printAddr()的辅助方法,它接受一个地址并构建一个适当的PrintReq数据包并注入。由于它使用与正常功能请求相同的传播机制,所以需要从一个可以在整个内存系统中传播的端口中注入,例如在CPU处。在MemTest、AtomicSimpleCPU和TimingSimpleCPU对象上都有辅助的printAddr()方法,它们只是在各自的缓存端口上调用printAddr()方法。(请注意:后两个方法未经过测试。)

(gdb) set print object
(gdb) call SimObject::find(" system.physmem.cache0.cache0.cpu")
$4 = (MemTest *) 0xf1ac60
(gdb) p (MemTest*)$4
$5 = (MemTest *) 0xf1ac60
(gdb) call $5->printAddr(0x107f40)system.physmem.cache0.cache0MSHRs[107f40:107f7f] Fill   state:Targets:cpu: [107f40:107f40] ReadReq
system.physmem.cache1.cache1blk VEM
system.physmem0xd0

这段描述表明cache0.cache0为特定地址分配了一个MSHR(未命中状态保持寄存器),以处理来自CPU的目标ReadReq请求,但该请求尚未被处理(否则它将被标记为正在服务中)。在cache1.cache1中,该块是有效的、独占的和已修改的,并且在物理内存中,该字节的值为0xd0。

这段描述提供了有关特定块的一致性状态的一些信息,尽管可能不是完整的。然而,它仍然非常有用。你可以根据需要进行扩展。此外,还有一个当前未使用的详细程度参数,可以用于输出不同级别的信息。

需要注意的是,额外的“p(MemTest*)$4”是必需的,因为尽管“set print object”显示了派生类型,但在内部,gdb仍然将指针视为基础类型的指针。因此,如果你尝试直接在$4指针上调用printAddr,就会出现问题。

(gdb) call $4->printAddr(0x400000)
Couldn't find method SimObject::printAddr

这篇关于gem5学习(23):经典缓存——Classic Caches的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓