使用英特尔的PIN工具计算程序中缓存命中/未命中的数量

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

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

这两种情况都不可能。

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

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

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