首页 > 解决方案 > 更换缓存时如何输出缓存集中的数据?

问题描述

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

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

顺便说一句,我使用 DerivO3CPU 感谢所有相关答案。

标签: gem5

解决方案


作为一般说明,有一个名为 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 路关联表,那么您可以忽略只有四个地址的结果,因为它们会参考其他表的替换。


推荐阅读