【发布时间】:2020-11-22 12:26:19
【问题描述】:
我想了解有关缓存替换算法的更多信息。比如我想知道缓存什么时候被替换,什么数据被替换了,什么数据被带到了缓存中。使用 gem5 中的调试标志输出此信息是一个不错的选择。 我使用经典缓存。 我创建了一个调试标志来输出此信息。但是我发现在执行替换算法的时候,很容易输出哪个set和way的数据,但是输出cacheline中的数据就很难了。因为我发现替换算法中只记录了valid、invalid、set、way信息。
- 后来我在
gem5/src/mem/cache/cache_blk.hh中找到了uint8_t *data。这应该是缓存块数据,但是为什么只有一个字节,一个cachline不是64字节吗? - 我不明白的是,替换的时候会先根据地址找到数据所在的集合。然后根据替换算法寻找缓存行。但是我发现
gem5/src/mem/cache/tags/indexing_policies/set_associative.cc文件的getPossibleEntries函数,返回sets[extractSet(addr)];有时返回四个地址,有时返回 8 个。它不应该总是返回地址所在的缓存集的每个缓存行吗?那是 8 个地址?
顺便说一下,我用的是 DerivO3CPU 感谢所有相关答案。
【问题讨论】:
-
当您询问有关缓存的问题时,请告知您所谈论的缓存型号。红宝石还是经典?另外,我不明白你的问题的目标。您想了解替换数据,还是数据块的内容?在任何情况下,您都可以创建一个新的调试标志,并在您发现相关时打印任何您想要的内容(我需要回答之前的问题才能提供更多详细信息)。
-
感谢您的建议,我提供了更多详细信息
-
你没有回答我的任何问题,细节与原始问题无关。无论如何,我假设您使用的是经典模型(src/mem/cache)。 uint8_t* 是指向高速缓存行数据第一个字节的指针。网上有很多关于C/C++指针的教程,我就不赘述了。 “它不应该总是返回集合中的每个缓存行吗?”正确的。 “也就是8个地址?”不,这取决于您的配置。您可能在缓存类中添加了一个打印,当您考虑 8 路 L2 时,您的 L1 可能是 4 路,也打印了
-
感谢您的回复。我在问题中指出它是经典缓存。可能不显眼,以后会加粗。使用char *作为首地址是很常见的,但是使用uint8_t作为首地址就很奇怪了。在这种情况下,我需要 printf("%s",(char*)uint8_t_data) 吗?我看到它有时显示 4 个地址,有时显示 8 个地址。我在 RandomRP::getVictim(const ReplacementCandidates& Candidates) 的输出大小中看到了它
标签: gem5