gem5 - 更换缓存时如何输出缓存集中的数据?
问题描述
我想了解有关缓存替换算法的更多信息。比如我想知道缓存什么时候被替换,什么数据被替换,什么数据被带到缓存中。使用 gem5 中的调试标志输出此信息是一个不错的选择。我使用经典缓存。 我创建了一个调试标志来输出此信息。但是我发现在执行替换算法的时候,很容易输出哪个set和way的数据,但是输出cacheline中的数据就很难了。因为我发现替换算法中只记录了valid, invalid, set, way信息。
- 后来我
uint8_t *data
在gem5/src/mem/cache/cache_blk.hh
. 这应该是缓存块数据,但是为什么只有一个字节,不是一个cachline 64字节吗? - 我不明白的是,替换的时候,它会先根据地址找到数据所在的集合。然后根据替换算法寻找缓存行。但是我发现
gem5/src/mem/cache/tags/indexing_policies/set_associative.cc
文件的getPossibleEntries函数,returnsets[extractSet(addr)]
; 有时返回四个地址,有时返回 8 个。它不应该总是返回地址所在的缓存集的每个缓存行吗?那是8个地址?
顺便说一句,我使用 DerivO3CPU 感谢所有相关答案。
解决方案
作为一般说明,有一个名为 CacheRepl 的调试标志。您可能希望使用它打印替换所需的任何信息。
1 - 数据指针是指向数据第一个字节的指针。它不是一个字符串;它最后没有空标记。这意味着您不能%s
立即使用它。您需要使用 blkSize (缓存行大小)遍历每个字节以使用%x
(例如,for (int i = 0; i < blkSize; i++) printf("%x ", blk->data[i])
)打印它。
如果您想将其打印为字符串,以下问题会有所帮助:Convert C++ byte array to a C string
2 - 当您打印替换策略 (RP) 中的任何内容时,将打印使用该给定 RP 的每个对象。这包括预取器、缓冲区、标签等。
我不知道您的系统配置是什么,但您可能至少有两个使用 RandomRP 的不同表:至少一个具有 4 路关联性,至少一个具有 8 路关联性。当有四个地址时,这些是 4 路关联表的候选者。当有 8 个时,它是 8-way associative。
例如,如果您想研究 L2 缓存的替换信息,并且您知道它是唯一的 8 路关联表,那么您可以忽略只有四个地址的结果,因为它们会参考其他表的替换。
推荐阅读
- javascript - 如何排除茉莉花中的一些规范文件?
- r - 函数错误(类型、msg、asError = TRUE):无法解析主机:datamarket.accesscontrol.windows.net
- gulp - 使用 Jekyll 进行 Gulp 任务监视,gulpfile.babel.js
- c# - 使用带有 asp.net 核心的服务类
- maven - 在 maven-remote-resources-plugin 中激活过滤
- javascript - 当div滑动到结束时如何使div返回起点
- scala - 如何修复关于 asInstanceOf 使用的警告
- php - Laravel ::all() 替代方法,返回一个 Builder 对象
- java - JavaFX 的 TableView 具有突出显示的文本和省略号功能
- google-bigquery - Big Query 命令行查询和追加到表