2

我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中。我发现有诸如 INS_IsMemoryRead/Write 之类的调用来确定指令是否为 LD/ST。

  • 有没有办法确定指令是否命中或未命中?
  • 如果是这样,是否也可以获得从缓存/内存中获取数据所花费的周期数?
4

1 回答 1

2

这些都不可能做到。

pin自带的缓存工具“Memory”是一个非常简单的缓存功能模拟器。换句话说,通过使用缓存工具,可以查看/模拟应用程序可能有多少缓存未命中,具体取决于缓存组织,例如大小、路数、缓存级别。通过一些简单的代码编写,可以报告发生缓存未命中的指令,然后将这些指令映射回源代码。然而,即使缓存模拟器被配置为具有与真实系统相同的缓存组织,缓存模拟的命中/未命中结果也可能与真实计算机系统不同或不对应。

此外,缓存工具的另一个限制是它是单线程的。您不能将它用于多线程应用程序。

此外,不可能获得任何时序信息,例如服务缓存未命中所需的周期数。这是非常依赖于架构的,我不知道有什么工具可以从真实系统中提供这些信息。相反,人们使用 CPU 时序模拟器。示例 CPU 时序模拟器是 Gem5 http://www.gem5.org/和基于 PtlSim http://marss86.org/的 Marss 。

于 2014-10-22T09:26:47.480 回答