更换缓存时如何输出缓存集中的数据?

How to output the data in the cache set when the cache is replaced?

我想详细了解缓存替换算法。比如我想知道缓存什么时候被替换,替换了什么数据,带什么数据到缓存。使用 gem5 中的调试标志输出这些信息是一个不错的选择。 我使用经典缓存。 我创建了一个调试标志来输出此信息。但是我发现在执行替换算法的时候,输出which set和way的数据很容易,但是很难输出cacheline中的数据。因为我发现替换算法中只记录了valid, invalid, set, way信息

  1. 我后来在gem5/src/mem/cache/cache_blk.hh中找到了uint8_t *data。这应该是缓存块数据,但是为什么只有一个字节,一个缓存行不是64字节吗?
  2. 不明白的是,替换的时候会先根据地址找到数据所在的set。然后根据替换算法寻找cacheline。但是我发现gem5/src/mem/cache/tags/indexing_policies/set_associative.cc文件的getPossibleEntries函数,returnsets[extractSet(addr)];有时 return 有四个地址,有时 return 有 8 个。不应该总是 return 该地址所在的缓存集的每个缓存行吗?那是8个地址?

对了,我用的是DerivO3CPU 感谢所有相关回答。

一般来说,有一个名为 CacheRepl 的调试标志。您可能希望使用它打印替换所需的任何信息。

1 - 数据指针是指向数据第一个字节的指针。它不是字符串;它最后没有空标记。这意味着您不能立即 %s 它;您需要使用 blkSize(缓存行大小)遍历每个字节以使用 %x(例如,for (int i = 0; i < blkSize; i++) printf("%x ", blk->data[i]))打印它。

如果您想将其打印为字符串,以下问题会有所帮助:

2 - 当您打印替换策略 (RP) 中的任何内容时,将打印使用该给定 RP 的每个对象。这包括预取器、缓冲区、标签等。

我不知道你的系统配置是什么,但你可能至少有两个不同的 table 使用 RandomRP:至少一个具有 4 向关联性,至少一个具有8 向结合律。当有四个地址时,这些是 4 向关联 table 的候选地址。当有8个时,就是8向结合体。

比如你想研究二级缓存的替换信息,你知道它是唯一的table是8路相联的,那么你可以忽略下面的结果只有四个地址,因为它们会引用其他 tables.

的替换