我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中。我发现有诸如 INS_IsMemoryRead/Write 之类的调用来确定指令是否为 LD/ST。
- 有没有办法确定指令是否命中或未命中?
- 如果是这样,是否也可以获得从缓存/内存中获取数据所花费的周期数?
我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中。我发现有诸如 INS_IsMemoryRead/Write 之类的调用来确定指令是否为 LD/ST。
这些都不可能做到。
pin自带的缓存工具“Memory”是一个非常简单的缓存功能模拟器。换句话说,通过使用缓存工具,可以查看/模拟应用程序可能有多少缓存未命中,具体取决于缓存组织,例如大小、路数、缓存级别。通过一些简单的代码编写,可以报告发生缓存未命中的指令,然后将这些指令映射回源代码。然而,即使缓存模拟器被配置为具有与真实系统相同的缓存组织,缓存模拟的命中/未命中结果也可能与真实计算机系统不同或不对应。
此外,缓存工具的另一个限制是它是单线程的。您不能将它用于多线程应用程序。
此外,不可能获得任何时序信息,例如服务缓存未命中所需的周期数。这是非常依赖于架构的,我不知道有什么工具可以从真实系统中提供这些信息。相反,人们使用 CPU 时序模拟器。示例 CPU 时序模拟器是 Gem5 http://www.gem5.org/和基于 PtlSim http://marss86.org/的 Marss 。