更换缓存时如何输出缓存集中的数据?
Posted
技术标签:
【中文标题】更换缓存时如何输出缓存集中的数据?【英文标题】:How to output the data in the cache set when the cache is replaced? 【发布时间】: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 感谢所有相关答案。
【问题讨论】:
这可能会有所帮助:***.com/questions/63193082/… 当您询问有关缓存的问题时,请告知您所谈论的缓存型号。红宝石还是经典?另外,我不明白你的问题的目标。您想了解替换数据,还是数据块的内容?在任何情况下,您都可以创建一个新的调试标志,并在您发现相关时打印任何您想要的内容(我需要回答之前的问题才能提供更多详细信息)。 感谢您的建议,我提供了更多详细信息 你没有回答我的任何问题,细节与原始问题无关。无论如何,我假设您使用的是经典模型(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) 的输出大小中看到了它 【参考方案1】:作为一般说明,有一个名为 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 路关联表,那么您可以忽略只有四个地址的结果,因为他们会参考其他表的替换。
【讨论】:
你太聪明了。我刚查了一下,4的输出是iccache,8的输出是dcache。以上是关于更换缓存时如何输出缓存集中的数据?的主要内容,如果未能解决你的问题,请参考以下文章